提升開發效率-構建速度與快速配置

Nestor_Gu發表於2017-12-02

問題

  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. 加快編譯速度

    • 在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;
            }
        複製程式碼
    • 在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}")
        }
    複製程式碼
  2. 設定。快速,實時的修改配置

    • 在清單檔案中配置
        <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>
    複製程式碼

相關文章