提高开发效率-构建速度与快速配置

问题

  1. 随着项目的逐步复杂,各类业务也已经到达了12个以上,app的编译速度愈来愈缓慢。特别是咱们在去年年末和今年年初对整个android端app进行的模块化,由原来的一个模块分红了如今的11个模块。这更加致使了编译速度进一步变慢,同时还引入了growingio,以及咱们组开本身发的无埋点统计。因为要进行代码插庄进一步致使编译速度变缓,在非ssd的电脑上首次编译须要进20分钟时间,二次编译也要接近5分钟(开启enableBuildCache的功劳)。
  2. 开发,测试期间不一样项目间的服务器地址都须要切换,版本号的变化等等由于后台部分接口对于不一样版本有不一样的处理,而且一个项目开发期间不一样功能开发进度可能不一样,因此有时候须要不一样业务间切换版本号。

方案

  1. 今年第一季度末尾我已经开始进行一些提升编译速度的方法。期间使用过Instant Run,但首次编译会更慢,同时某些改动(见官方文档)后会须要从新进行全量编译;freeline,比Instant Run适用范围更广一点但某些状况仍然须要进行全量编译,而且有部分bug。目前我采起了下面的方案并配合Instant Run来提高编译速度:
    • 新建dev模块,独立于正式打包的app模块,该模块去除了会进行代码插庄的依赖(growingio,本身的无埋点统计等)和关闭tinker等。
    • 对各模块分别进行编译并上传到内网Maven仓库,对于某个开发只须要开启本身须要改动的模块,其它模块引用aar就能够了。
  2. 增长shortcuts,点击就能够直接以对应的服务器启动;增长独立于其它activity的设置界面,能够不返回当前界面的状况下经过多任务界面进入设置界面并修改服务器,版本号等参数。
    • shortcuts.png
      settings.png

实现

  1. 加快编译速度html

    • 在frameworkd模块里增长对dev模块编译的标识,用来控制是否调用growing等未被引入的代码和开启一些开发测试中的特殊功能。部分配置以下:java

      • 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;
            }
        复制代码
    • 在dev模块中引入模块配置,根据gradle.properties配置只编译须要改动的模块android

        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}")
        }
    复制代码
  2. 设置。快速,实时的修改配置git

    • 在清单文件中配置
        <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>
    复制代码
相关文章
相关标签/搜索