问题
- 随着项目的逐步复杂,各种业务也已经到达了12个以上,app的编译速度越来越缓慢。特别是我们在去年年底和今年年初对整个android端app进行的模块化,由原来的一个模块分成了现在的11个模块。这更加导致了编译速度进一步变慢,同时还引入了growingio,以及我们组开自己发的无埋点统计。由于要进行代码插庄进一步导致编译速度变缓,在非ssd的电脑上首次编译需要进20分钟时间,二次编译也要接近5分钟(开启enableBuildCache的功劳)。
- 开发,测试期间不同项目间的服务器地址都需要切换,版本号的变化等等因为后台部分接口对于不同版本有不同的处理,并且一个项目开发期间不同功能开发进度可能不同,所以有时候需要不同业务间切换版本号。
方案
- 今年第一季度末尾我已经开始进行一些提高编译速度的方法。期间使用过Instant Run,但首次编译会更慢,同时某些改动(见官方文档)后会需要重新进行全量编译;freeline,比Instant Run适用范围更广一点但某些情况仍然需要进行全量编译,并且有部分bug。目前我采取了下面的方案并配合Instant Run来提升编译速度:
- 新建dev模块,独立于正式打包的app模块,该模块去除了会进行代码插庄的依赖(growingio,自己的无埋点统计等)和关闭tinker等。
- 对各模块分别进行编译并上传到内网Maven仓库,对于某个开发只需要开启自己需要改动的模块,其它模块引用aar就可以了。
- 增加shortcuts,点击就可以直接以对应的服务器启动;增加独立于其它activity的设置界面,可以不返回当前界面的情况下通过多任务界面进入设置界面并修改服务器,版本号等参数。
-
实现
-
加快编译速度
-
在frameworkd模块里增加对dev模块编译的标识,用来控制是否调用growing等未被引入的代码和开启一些开发测试中的特殊功能。部分配置如下:
- gradle.properties
DEV=true
- framework/build.gradle
buildConfigField "boolean", "DEV", DEV
- others build.gradle
if (!Boolean.parseBoolean(DEV)) { classpath "com.growingio.android:vds-gradle-plugin:${GROWINGIO_VERSION}" classpath "gradle.plugin.com.foo.myplugin:ajc:2.0.7" }
if (!Boolean.parseBoolean(DEV)) { apply plugin: "org.wellijohn.greeting" apply plugin: 'com.growingio.android' apply from: 'tinker.gradle' }
- java
public static boolean isDev() { return BuildConfig.DEV; }
- gradle.properties
在dev模块中引入模块配置,根据gradle.properties配置只编译需要改动的模块
implementation project(':framework') // 用户模块依赖导入 if (Boolean.parseBoolean(USER)) { implementation(project(':user')) } else { implementation("包名:user:${APP_VER_NAME_M}") } // 商品模块依赖导入 if (Boolean.parseBoolean(GOODS)) { implementation(project(':goods')) } else { implementation("包名:goods:${APP_VER_NAME_M}") } // 订单模块依赖导入 if (Boolean.parseBoolean(ORDER)) { implementation(project(':order')) } else { implementation("包名:order:${APP_VER_NAME_M}") } // 引导模块依赖导入 if (Boolean.parseBoolean(GUIDE)) { implementation(project(':guide')) } else { implementation("包名:guide:${APP_VER_NAME_M}") } // 违章查询模块依赖导入 if (Boolean.parseBoolean(ILLEGAL)) { implementation(project(':illegal')) } else { implementation("包名:illegal:${APP_VER_NAME_M}") } // 评价模块依赖导入 if (Boolean.parseBoolean(EVALUATE)) { implementation(project(':evaluate')) } else { implementation("包名:evaluate:${APP_VER_NAME_M}") } // 加油模块依赖导入 if (Boolean.parseBoolean(REFUEL)) { implementation(project(':refuel')) } else { implementation("包名:refuel:${APP_VER_NAME_M}") } // 保养模块依赖导入 if (Boolean.parseBoolean(MAINTENANCE)) { implementation(project(':maintenance')) } else { implementation("包名:maintenance:${APP_VER_NAME_M}") } // 门店模块依赖导入 if (Boolean.parseBoolean(STORE)) { implementation(project(':store')) } else { implementation("包名:store:${APP_VER_NAME_M}") } // 爱车模块依赖导入 if (Boolean.parseBoolean(CAR)) { implementation(project(':car')) } else { implementation("包名:car:${APP_VER_NAME_M}") }
-
-
设置。快速,实时的修改配置
- 在清单文件中配置
<activity android:name=".SettingsActivity" android:label="Settings" android:launchMode="singleInstance" android:taskAffinity="主包名.test" android:theme="@android:style/Theme.DeviceDefault"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity>