Android實用套路 build.gradle + gradle.properties +BuildConfig.java+占位符

如果你還在使用一個java文件聲明靜態(tài)變量來配置接口環(huán)境及其他環(huán)境,每次打包發(fā)布需要不斷取消注解。那么恭喜你下文你剛好用得到。

  • 開擼之前,捋一下最后需要達到什么效果呢?
    • 支持最少三中接口環(huán)境配置
  • 支持配置多個第三方AppKey
  • apk文件命名與環(huán)境對應(yīng)(xx-v1.0.1-debug.apk)
  • 不同環(huán)境可同時安裝(可選)
  • 使用不同的ApkName,不同得LOGO
  • 不同環(huán)境打不同的包名

** 寶典 “build.gradle + gradle.properties +BuildConfig.java+占位符” **

首先,要認識下BuildConfig.java這個文件。
在我們使用build.gradle文件進行同步編譯時,都會在module目錄下的build文件夾中創(chuàng)建一個BuildConfig.java文件。
**double Shift **輸入 BuildConfig 你就能找到此文件。這個文件是gradle自己生成的。用于保存你在build.gradle文件中的配置信息。路徑是主包名根路徑下(單獨放在build目錄下而已)。所以在整個項目中我們都可以直接使用BuildConfig.XX來引用對應(yīng)屬性。

Paste_Image.png

BuildConfig.java 每次項目編譯后都會刷新,重新寫入。
進來一看你就會發(fā)現(xiàn),BuildConfig文件中生成的屬性全是 public static final 。這完全就是個典型的配置文件,不同的是它會根據(jù)gradle配置自動刷新重新寫入。
看到這里,套路就明顯了:在gradle文件中針對不同打包編譯環(huán)境,配置我們各種環(huán)境配置屬性即可達到我們的目的。


正式開擼

為了實現(xiàn)上面提到要求,這里配置三種打包環(huán)境,默認debug模式,渠道包測試,渠道包正式。

  • 配置需要用到的環(huán)境地址
    為了讓build.gradle文件中更簡潔,這里利用build.gradle文件可以直接引用gradle.properites中的屬性,將接口配置先寫在此文件中。
    如下圖


    Paste_Image.png

注意:在.properites文件賦值遵守的格式要完全同Java語言中一至,否則就會變成這樣下面這樣,造成編譯失敗

  public static final String NODE_JS = http://xx.xx.x:222/;

OK,上面配置了兩個接口環(huán)境,一個正式,一個debug.每個對應(yīng)三個接口和一個激光AppKey。

  • 在build.gradle中引用配置

寫入BuildConfig文件需要使用buildConfigField屬性,根據(jù)占位符配置AndroidManifest.xml文件。
AndroidManifest.xml文件中添加占位符

   <meta-data
            android:name="JPUSH_APPKEY"
            android:value="${JPUSH_APPKEY_VALUE}"/>
  • 為debug添加環(huán)境配置,這一步完成,直接Run得到的debug包就會使用下面參的數(shù)
buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
        }
        //當(dāng)出現(xiàn)3個或者3個以上環(huán)境和多個渠道時,線上不提供debug打包方式。
        //直接使用特定渠道包作為測試包,指定不同包名
        debug {
            signingConfig signingConfigs.config
            buildConfigField 'String','BASE_URL',BASE_URL_DEBUG
            buildConfigField 'String','H5_BASE_URL',H5_BASE_URL_DEBUG
            buildConfigField 'String','NODE_JS',NODE_JS_DEBUG
            buildConfigField 'boolean','IS_TEST','true'
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "debug"
                                    ,JPUSH_APPKEY_VALUE: JPUSH_KEY_TEST]
        }
    }
  • 配置渠道包
    AndroidManifest.xml添加渠道配置占位符
 <!-- 配置渠道區(qū)分占位符 -->
        <meta-data
            android:name="UMENG_CHANNEL"
            android:value="${UMENG_CHANNEL_VALUE}" />

添加兩個渠道包配置,使用manifestPlaceholders 屬性,配置好激光AppKay

 productFlavors {
        istest{
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "istest"
                                    ,JPUSH_APPKEY_VALUE: JPUSH_KEY_TEST]
        }
        fromal {
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "fromal"
                                    ,JPUSH_APPKEY_VALUE: JPUSH_KEY_FORMAL]
        }
    }

為不同渠道包配置不同接口環(huán)境

  productFlavors.each {
      flavors ->
          //線上打包測試環(huán)境
          if(flavors.name.equals("istest")){
              //指定包名為.istest
//                flavors.applicationIdSuffix '.istest'
              flavors.buildConfigField 'String','BASE_URL',BASE_URL_TEST
              flavors.buildConfigField 'String','H5_BASE_URL',H5_BASE_URL_TEST
              flavors.buildConfigField 'String','NODE_JS',NODE_JS_TEST
              flavors.buildConfigField 'boolean','IS_TEST','true'
           //線上打包正式渠道包
          }else{
              flavors.buildConfigField 'String','BASE_URL',BASE_URL_FORMAL
              flavors.buildConfigField 'String','H5_BASE_URL',H5_BASE_URL_FORMAL
              flavors.buildConfigField 'String','NODE_JS',NODE_JS_FORMAL
              flavors.buildConfigField 'boolean','IS_TEST','false'
          }

  }

接口環(huán)境配置就是這么簡單,看看BuildConfig文件生成后的樣子吧

Paste_Image.png

我們配置的所有接口環(huán)境在這里生成了對應(yīng)的屬性,你只需要在把他當(dāng)成普通的(不是親生的)配置文件來用即可,無需在添加其他配置文件。
除了接口屬性,多出來的是其他的配置,與此文無關(guān)直接忽略。

  • 為了方便區(qū)分,我們還想在生成apk文件時對命名做點手腳,代碼很簡單直接上代碼。
  //修改生成的apk名字及輸出文件夾
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            //新名字
            def newName
            //時間戳
            def timeNow
            //輸出文件夾
            def outDirectory
            //是否為Jenkins打包,輸出路徑不同
            if ("true".equals(IS_JENKINS)) {
                //BUILD_PATH為服務(wù)器輸出路徑
                timeNow = BUILD_TIME
                outDirectory = BUILD_PATH_JENKINS
                //xx-v1.0.1-release.apk
                newName = APPNAME+'-v'+APP_VERSION +  '-'+variant.productFlavors[0].name +'-' + variant.buildType.name + '.apk'
                output.outputFile = new File(outDirectory+"/"+timeNow, newName)
            } else {
                //本機打包輸出在本機路徑
                outDirectory = BUILD_PATH_LOCAL
                if ("debug".equals(variant.buildType.name)){
                    newName = APPNAME+'-v'+APP_VERSION + '-' + variant.buildType.name +'.apk'
                }else {
                    newName = APPNAME+'-v'+APP_VERSION + '-' + variant.buildType.name +'-'+getDate()+ '.apk'
                }
                output.outputFile = new File(outDirectory, newName)
            }
        }
    }

上面代碼種,我們修改了apk生成路徑及根據(jù)環(huán)境來命名。
下圖時我更換版本號以后生成的兩個apk文件。

Paste_Image.png
  • 如何安裝一個測試的同時,再安裝一個生成呢?
    為主包名添加一個包名后綴,他就會完全變成一個新的apk包。
    在上面渠道配置我注釋了這一行。
    debug時同樣可以加入,只是最后的包名會變成com.xx.debug.istest
    很難受還是不要加了。
              //指定包名為.istest
//                flavors.applicationIdSuffix '.istest'
  • 不同環(huán)境設(shè)置不同的AppName 和logo?
    這時候分兩種,debug,和渠道包

先說debug模式,再src目錄下創(chuàng)建debug文件夾,創(chuàng)建res文件夾,拷貝進你想修改的資源文件即可,我這里只是在原appName基礎(chǔ)上加了debug-標(biāo)識,所以只需要string文件。
如果你想換logo,與上同理

Paste_Image.png
  • 渠道包配置不同appName或者logo
    上面我們提到,如何同時安裝不同環(huán)境的apk包,需要為渠道包添加包名后綴。
    上面舉例flavors.applicationIdSuffix '.istest',這里包名后綴為 istest。
    這時候我們在src目錄下新建istest文件夾,創(chuàng)建res目錄拷貝對應(yīng)資源文件進行修改即可。

此前學(xué)習(xí)部署了Jenkins這個東西,并遺留了動態(tài)切換環(huán)境的問題。所以最近擼出了這個東西。一石頭二鳥哈哈。
收工!如果你有什么問題或建議歡迎下方留言。


Finished!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容