前言:
之前修改和使用了LayoutCast,感觉效果不错,极大的提高了编译速度。
同样的实现动态编译的框架还有google自带的Install Run、FackBook的Buck等等。具体的各个实现原理就不多说了,之前的介绍LayoutCast的文章有说明。听说freeline继承了之前三个框架的优点,并加以改进,所以就准备使用freeline应用于项目中。
一、freeline基本配置流程
首先freeline的github地址:https://github.com/alibaba/freeline
官方的使用流程介绍很简单,需要做如下几步:
1、工程build.gradle下,做如下配置
buildscript { repositories { jcenter() } dependencies { classpath 'com.antfortune.freeline:gradle:0.5.4' } }
2、主module的build.gradle下(公司的就是CTMain),做如下配置:
apply plugin: 'com.antfortune.freeline' android { ... freeline { hack true } }
3、自定义Application中,做如下修改:
public class App extends Application { @Override public void onCreate() { super.onCreate(); FreelineCore.init(this); } }
4、工程根目录下,运行下面的命令。
Windows: gradlew.bat initFreeline
Linux/Mac: ./gradlew initFreeline
5、在工程根目录下,运行
python freeline.py命令
如果想全量编译,就运行
python freeline.py -f
上面说的是正常的流程,但是公司框架下,一般流程是走不通的,下面说的是配置freeline的流程中,解决遇到的问题。
二、解决找不到freeline工程依赖
公司的maven默认指向的是私库。私库中是没有freeline的,所以一般情况下,是找不到freeline这个项目的。
首先先做上面的配置,然后首先可以尝试修改android_2下的build.gradle文件
打开jcenter()做如下修改,sycn一下。
buildscript { repositories { maven { url "http://maven.dev.sh.com:8081/nexus/content/groups/public" } // mavenLocal() //下面的仓库不要打开,MCD不能访问,会造成MCD打包时间延长 jcenter() // 这是AS默认库,访问困难 就解开这一行 // mavenCentral() // 这是maven中央库,不定期抽风 // maven { url "http://mirrors.ibiblio.org/maven2"} // 这是一个maven镜像,速度还行 }
如果运气比较好的话,sycn工程不报错,那么就OK了。运行成功。下面的部分就可以不看了。
但是每个人的网络状态不同,我的就无法正常sycn,如果sycn的话会提示找不到freeline,所以只能采取另一个方式,直接依赖freeline工程。
三、freeline工程
freeline工程主要分为三大模块,分别为
runtime:这个模块主要在java层执行,主要的作用是在Application启动的时候重载ClassLoader,插入dex,从而实现增量修改的目的。
freeline_code:python文件集合,主要是扫描本地修改文件,执行编译压缩传输文件等操作。
gardle工程:gradle插件工程,主要实现下载freeline_code集合,更改打包步骤等操作。
这里其实有一个问题,由于freeline_code集合是下载的,且初始化的流程中,并不去识别本地是否存在该问题,所以造成如果下载失败的话,后面的步骤是无法执行的,从而导致整个freeline无法执行。而我就遇到了这个问题,所以后文就会对这个问题进行改进。
四、依赖freeline工程下runtime模块
1、git clone一下freeline项目,下载到本地。把runtime模块以module的形式导入。
2、修改settings.gradle文件,最后面做如下修改:
} //Main entrance include 'CTMain' // include ':library' include ':runtime' }
3、修改CTbusiness下build.gradle文件,做如下修改:
compile ':ReactAndroid:+@aar' // compile project(':library') compile project(':runtime')
通过以上三步,runtime工程应该是可以正常导入了,这时候,CTBaseApplication中的FreelineCore.init(this);应该已经不报错了。
五、依赖freeline的gradle插件工程
这个步骤相对就比较复杂了,具体有两个问题需要接解决
第一、.利用freeline中的gradle工程发布gradle插件到本地maven中,并且指向本地的maven。
第二、解决上文提到的,利用gradlew.bat initFreeline初始化过程中,下载失败的问题。
首先解决第一个问题,发布到本地maven:
1.以工程的方式打开gradle项目,记得gradle-wrapper.properties中修改distributionUrl为2.10的。
2.修改gradle工程下的build.gradle文件。增加下面这句话
apply plugin: 'maven'
效果如下:
apply plugin: 'groovy' apply plugin: 'java' apply from: 'bintray.gradle' apply plugin: 'maven' group 'com.antfortune.freeline'
3.修改uploadArchives中的配置,url改成本地maven库地址:
uploadArchives { repositories { mavenDeployer { repository(url: uri('D:/Users/xiangleiliu/.m2/repository')) } } }
4.如果bintray.gradle文件报错的话,全部注释掉,该文件的作用是脚本执行上传jcenter库,对我们没用处。
5.执行gradle中的uploadArchives这个task
成功之后,打包之后的jar和配置文件应该就会发布到本地maven库当中了。
6.指向本地maven库。
android_2的build.gradle中,指向本地maven库。
通过以上的这几个步骤,这时候再sycn工程的时候,应该就不会报错了。
这时候在android_2的根目录下执行
gradle.bat initFreeline命令,如果不报错,这就不用执行下面这一步了。
然后解决第二个问题,解决下载报错。
报错异常如下:
由于这个操作是阻断性的,如果执行不下去,后面是无法执行的。所以要解决这个问题,只能是修改gradle插件里面的代码。
1、该方法是执行initFreeline时候报错,所以要对应的修改initFreelin里面的方法。
我修改了对应的FreelineInitializer.groovy文件。先去判断本地是否有zip包,如果有直接使用本地的,如果没有再去下载远程的。该文件文章最后附件贴上
2、修改Gradle工程下的gradle版本号。version改成0.5.5,比最新的版本高一点,避免重复。
3、对应的android_2下的build.gradle文件也需要修改成0.5.5的版本。
4、删除缓存,重新发布插件包以及拉去最新的maven。
缓存地址maven:D:\Users\xiangleiliu\.m2\repository
缓存地址gradle:D:\Users\xiangleiliu\.gradle\caches\modules-2\files-2.1
5.下载freeline.zip包,地址:https://github.com/alibaba/freeline/releases/download/0.5.4/freeline-v0.5.4.1608301118.zip
或者文章最后附件中也有。
重命名成freeline.zip,放到android_2的根目录下。
最后:
重新sycn下工程,再跑一下gradle.bat initFreeline命令。效果如下:
这时候代表初始化已经完成了。本地D:\Users\xiangleiliu\.freeline\cache\b3ca7985cfb9cf4df188fe701c892271\路径下已经有了配置文件。
执行
python freeline.py -f命令,应该会报错提示配置文件找不到。原因是配置缓存文件的生成路径的规则我猜测应该是MD5(版本号+其它信息)。
所以直接把本地已有的配置文件移到提示报错的路径下就可以了。