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

問題

  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>
    複製代碼
相關文章
相關標籤/搜索