美文网首页Android studio
聚美快速编译之FreeLine 安装指南

聚美快速编译之FreeLine 安装指南

作者: 孤独狂饮 | 来源:发表于2016-08-31 19:08 被阅读4341次

    聚美快速编译之FreeLine 安装指南

    Freeline

    开源地址是:https://github.com/alibaba/freeline

    Freeline是蚂蚁聚宝团队15年10月在Android平台上的量身定做的一个基于动态替换的编译方案,5月阿里集团内部开源。

    • 稳定性方面:完善的基线对齐,进程级别异常隔离机制。
    • 性能方面:内部采用了类似Facebook的开源工具buck的多工程多任务并发思想:端口扫描,代码扫描,并发编译,并发dx,并发merge dex等策略,在多核机器上有明显加速效果,另外在class及dex,resources层面作了相应缓存策略,做到真正增量开发,另外引入并优化buck的部分加速组件dx,DexMerger,资源编译方面,深入改造了Aapt资源编译流程,当资源发生改变时候,秒级完成增量包编译,其中增量包仅含最小的变更集合(10Kb~数百Kb内),后期也被运用到线上进行资源/代码动态替换。相比目前instant-run,buck,layoutcast等方案快数倍速度。

    Freeline 有什么优势呢?

    1. 真增量,构建过程快且增量包体积小,极大提升更改代码部署到手机速度,较Android studio2.0及 LayoutCast快3~5倍
    2. 跨平台Linux,mac,windows
    3. 全版本覆盖 2.x ~ 6.x版本均支持
    4. 部署流程简化,更改代码后,构建过程中,与手机建立了tcp长连接,一行命令即可完成增量部署,毋需到各自子bundle所在的目录构建完成后再进入portal/launcher进行打包再安装到手机的过程
    5. 事务支持,在开发过程引入的异常不会破坏工作空间
    6. 无缝支持mPass,解决了类似maven各个节点需merge合并等与常规开发流程不一致的问题
    7. 进程级别异常隔离,开发体验持续稳定

    谁在使用 Freeline?

    目前 Freeline 在阿里内部稳定支撑蚂蚁聚宝,高德地图等ANDROID技术团队日常开发,兼容mPaas/gradle架构.

    原理介绍:

    https://yq.aliyun.com//articles/59122

    聚美 App 使用指南

    由于我们使用 HG 来管理,所以会出现很多不同的分支,因此基于最新的 default_3.94 这个分支来进行推广。本文中罗列出一些在使用过程的一些坑点,请同学们避开。

    必须准备好相关的环境:
    • gradle 建议直接使用最新的 3.0 版本。必须要在本地配置相关的环境变量,在 命令行能查看到 当前版本,查看方式是: gradle -v。 同时需要在 AS 里面这么做:

      。当然其他方式也是可以的,但是为了以后的兼容与统一,尽量使用3.0

      • Java 建议使用 8.0以上版本。切莫直接使用 AS 里面提供的 SDK 版本,否则会出现一些奇怪的问题,应该如图所示:
      • python Mac 里面默认自带该功能,可以直接使用。默认是2.7,有人说3.0可能会出问题,可以先试试。
    Freeline 初始化环境:
    • 根目录下的 build.gradle
     buildscript {
         repositories {
             jcenter()
         }
         dependencies {
             classpath 'com.antfortune.freeline:gradle:0.5.5'
         }
     }
    
    • 项目下面的 build.gradle
     apply plugin: 'com.antfortune.freeline'
     
     android {
         ...
         freeline {
             hack true
         }
     }
     
     dependencies {
       compile 'com.antfortune.freeline:runtime:0.5.5'
     }
    
    • 自定义的 Application
     public class App extends Application {
         @Override
         public void onCreate() {
             super.onCreate();
             FreelineCore.init(this);
         }
     }
    

    在当前工作目录下 执行:

        gradle initFreeline
    

    ps: 最主要的耗费时间是在 配置 gradle 相关的地方。

    • 如果提示 gradle XX 版本有问题, gradle 3.0 不匹配,可能是 gradle 插件版本有问题。在根目录下面的 build.gradle 里面修改为:
        classpath 'com.android.tools.build:gradle:2.2.0-beta2'
    

    为了保证咱们的运行环境一致,建议直接使用这个。后面有问题也方便协商处理。

    • 如果看到:

      虽然上面显示0%,但是其实它一直在本地下载东西,网速正常,基本两分钟左右就能下载下来。 如果没有代理的话,可以这么做,直接使用国内的东西下载:

        gradle initFreeline -Pmirror (建议直接使用这个)
    
    • 如果看到 read_project_info_task 的时间超长, 大于30秒以上,可能是 gradle 出问题了。说明gradle 在本地下载东西,有一种比较好的做法是:直接从 gradle 官网下载到最新的 gradle 压缩包(一定要是最全的 all 版本)。可以将该压缩包存起来,并配置本地环境变量等。对于图中出现的问题,可以打开这个目录:

      这个目录:



      放入压缩包到这个文件夹中:

      然后直接运行即可。

    • 直接使用这个命令构建:
    • 如果看见这个表示初始化 Freeline 成功:
    • 直接执行这个:

      一般情况下可以直接构建成功,但是对于聚美项目会失败,是因为里面的字符串写的不规范,例如截图:



      这里说的不规范是因为里面可能包含了特殊字符,一般肉眼看不到,通过某些工具可以查看。如果遇到上述问题,我们可以手动把这些相关代码重写下即可。

    根据代码行数能定位到这里:


    当我们修改成功后,再次运行即可。

    • 如果出现
      说明我们的相关构建没有问题,只是在输出 apk 包后,最后无法找到相关的 apk. 现在的做法就是手动指定这个目录。在项目中 的 主要 Model 里面的 build.gradle 中 的 android { }里面的位置加上
    android {
    
    freeline {
        hack true
    }
    def flavor = "jmtest"
    
    freeline {
        productFlavor flavor
    }
    
    freeline {
        def dir = System.getProperty("user.dir");
        apkPath dir + "/ExportApks/"+ flavor + "_" + "3892" + ".apk"
    }
    
    freeline {
            def dir = System.getProperty("user.dir");
            apkPath dir + "/ExportApks/"+ flavor + "_" + "3892" + ".apk"
        }
    }
    

    请把 ”3982” 替换成 你自己的版本号,目前发现无法用,后面会对这部分内容进行修改,尽量自动化。

    当我们设置成功后,就 Ok 了。如图:
    • 我们可以设置别名启动:
        alias py="python freeline.py”
    

    以后就可以直接 执行 py.

    • 当我们出现这种情况的时候:

    方案1: 可能是你本地的 Debug 模式开启了混淆,请关闭混淆即可:

    ,一般 debug 模式下是不需要混淆的。

    方案2:
    需要重新配置一些地方:在 项目根目录下的 build.gradle 文件中,修改这个com.android.tools.build:gradle的版本为 2.2.0-beta2:

    classpath 'com.android.tools.build:gradle:2.2.0-beta2'
    

    即可。

    正常运行后:
    • 如果出现关于 freeline 脚本的问题,可以尝试这么修改:
        module = fn.split('.')[0] 修改为 module = fn[:fn.rfind(".")]
    

    至此,基本聚美相关就可以运行相关的东西了。

    增加 Freeline 的文件对比情况

    开始逐个文件对比差异,如果有问题可以根据下图修改:













    相关文章

      网友评论

      • 费麭:和butterknife 8.8.4冲突
        费麭:@孤独狂饮 butterknife 8.8.4 用的jarparser库是3.5.0, freeline 0.8.8用的是2.4.0, 有冲突,我把butterknife降级到8.6.0了,它用的是2.4.0。编译完美通过
        孤独狂饮:请使用最新版本,已经换代好几次了。
      • 好大一只龍:我的情况是, 编译可以成功, 但是运行结果还是之前的结果,貌似没有生效。 求指导啊~~~ 大神。
        孤独狂饮:@好大一只龍 升级下试试看
        好大一只龍:@孤独狂饮 我的gradle 版本是2.14.1 ,猜想是因为版本太老了:sweat::sweat::sweat:
        孤独狂饮:你使用最先的 依赖 试试,有些和这个操作不一样
      • cheetah747:好麻烦。
        好大一只龍:我的情况是, 编译可以成功, 但是运行结果还是之前的结果,貌似没有生效。 求指导啊~~~ 大神。
        孤独狂饮: @cheetah747 新版的很容易集成的,我这种是比较复杂的项目,可以针对性参考
      • bc733de8e9e5:Exception in thread "main" java.util.zip.ZipException: error in opening zip file
        at java.util.zip.ZipFile.open(Native Method)
        at java.util.zip.ZipFile.<init>(ZipFile.java:219)
        at java.util.zip.ZipFile.<init>(ZipFile.java:149)
        at java.util.zip.ZipFile.<init>(ZipFile.java:163)
        at org.gradle.wrapper.Install.unzip(Install.java:214)
        at org.gradle.wrapper.Install.access$600(Install.java:27)
        at org.gradle.wrapper.Install$1.call(Install.java:74)
        at org.gradle.wrapper.Install$1.call(Install.java:48)
        at org.gradle.wrapper.ExclusiveFileAccessManager.access(ExclusiveFileAccessManager.java:65)
        at org.gradle.wrapper.Install.createDist(Install.java:48)
        at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:128)
        at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:61)

        [ERROR] --------------------------------------------------------
        [ERROR] freeline failed when read project info with script: gradlew.bat -q checkBeforeCleanBuild

        这个错误怎么回事
        bc733de8e9e5:试过了,每次都报这个错误
        孤独狂饮: @印度神牛 清空之前的freeline 数据,并 clean 试试
      • starCoder:我修改了一个类的代码更新后,app内存中的值被销毁了,这是正常原因吗?
        孤独狂饮:@star_code 有可能
      • 金樽明月:配置了apply plugin: 'com.antfortune.freeline'之后,sync提示cannot find method android{},请问这是怎么回事呢?
      • DoubleCui:每个project都需要这么搞一下?
        孤独狂饮:@DoubleCui 一两下就搞定了。
      • RavenX:请问博主,一直停在这里是怎么回事啊?
        DEBUG] [dispatcher] command line args: Namespace(all=False, clean=False, cleanBuild=False, debug=False, init=False, version=False, wait=False)
        [DEBUG] [WARNING] some important file missed, a clean build will be automatically executed.
        [DEBUG] collecting project info, please wait a while...
        [DEBUG] collecting project info, please wait a while...
        [DEBUG] update apk time path: D:\android-project\MyApplication10\app\build\freeline\freeline-assets\apktime
        [DEBUG] new clean build flag value: 553000
        [DEBUG] [task_engine] depth: 1, task: [read_project_info_task]
        [DEBUG] [task_engine] depth: 1, task: [generate_file_stat_task]
        [DEBUG] [task_engine] depth: 2, task: [gradle_clean_build_task]
        [DEBUG] [task_engine] depth: 3, task: [clean_all_cache_task]
        [DEBUG] [task_engine] depth: 3, task: [install_apk_task]
        [DEBUG] [task_engine] depth: 4, task: [build_base_resource_task]
        [DEBUG] [task_engine] depth: 4, task: [generate_project_info_task]
        [DEBUG] [task_engine] depth: 4, task: [generate_apt_files_task]
        [DEBUG] [task_engine] depth: 4, task: [append_file_stat_task]
        [DEBUG] [read_project_info_task] read_project_info_task start to run after waiting 0.0s
        [DEBUG] [generate_file_stat_task] generate_file_stat_task start to run after waiting 0.0s
        [DEBUG] [generate_file_stat_task] save app module file stat
        孤独狂饮:@张兴锐 尝试升级到0.8.3 ,这个版本省去了很多麻烦。
      • justdo丁满:我遇到了错误 可以帮我看看这个错误怎么解决吗

        [DEBUG] [ERROR] Builder.get_javac() return None.
        [ERROR] --------------------------------------------------------
        [ERROR] Freeline ERROR
        [ERROR] --------------------------------------------------------
        JAVA_HOME not found in env.
        [ERROR] --------------------------------------------------------
        [ERROR] Please declares your JAVA_HOME to system env!
        孤独狂饮: @轮回星云 好好查查吧,如果你移动过apk 的输出路径的话
        Nebula995:我也遇到这个问题了,不知道怎么解决,JAVA_HOME 是添加了的。
        孤独狂饮:@justdo丁满 没有配置环境变量吧。
      • 键盘男:你好,我看github官网,没有介绍`FreelineCore.init()`,但是wiki里面“Java增量编译无效”有写“FreelineCore.init(this);”。请问到底要不要这句话?
        键盘男:@键盘男 感觉freeline不稳定,经常"[WARNING] check sync status failed, a clean build will be automatically executed."重新编译,要不就增量编译后无反应....
        键盘男:@孤独狂饮 明白⊙ω⊙
        孤独狂饮:@键盘男 最新版已经帮你内置了
      • MxiaoVV:请问,如何在开启混淆的情况下打包呢;
      • 捡淑:马克
      • AndDxp:我的电脑 freeline已经初始化成功了 但看到接下来执行 python freeline.py 因为没学过python 到这里看不懂了,没办法进行下去,麻烦大神指点一下,该如何做
        孤独狂饮: @AndDxp 升级到0.6.0即可
        AndDxp:@孤独狂饮 报这个是怎么回事呀 Traceback (most recent call last):
        File "freeline.py", line 5, in <module>
        from freeline_core.dispatcher import Dispatcher
        File "F:\XXXXX\freeline_core\__init__.py", line 1, in <module>
        import build_commands
        ImportError: No module named 'build_commands'
        孤独狂饮:@AndDxp 在电脑上直接运行就可以。如果非mac 需要安装python, 并且配置环境变量
      • Wower_Lau:哈喽,你好!打包出现 Cannot get property 'apiLevel' on null object,是神马问题
        孤独狂饮:@Wower_Lau 应该在model 中的build.gradle 中
        Wower_Lau:@孤独狂饮 你说的这个在哪里配置?我看了下okbuck 那里也有人出现这种问题,说是 comp.. 、min..、target..、build...sdk,这些没设置,我gradle里面都有设置,我这项目是很久以前eclipse转的as 。
        孤独狂饮: @Wower_Lau 说明你的项目没有配置apiLeave 需要在项目里面配置下

      本文标题:聚美快速编译之FreeLine 安装指南

      本文链接:https://www.haomeiwen.com/subject/tmqcettx.html