Android多渠道打包且根據不同產品打包不同的assets資源目錄
因為專案中存在多種環境,既要區分bebug與release版本,release又要區分測試環境與生產上線環境,每次打包都得浪費不少的等待時間;並且哪個版本有問題還得去切換環境一個個打包,關鍵是還得牢記每次切換環境需要修改的內容,儘管每次都檢查仔細,但總有可能疏忽的時候,一旦有問題既浪費自己的時間又浪費測試人員的時間;因此不得不去研究一鍵切換環打包的功能
一、區別debug與release
首先在build.gradle中配置簽名信息,為debug配置差異屬性
android { defaultConfig { versionName "v2.2.2" versionCode 20 } signingConfigs { release { storeFile file('/Users/ram/WorkSpace/AndroidWorkSpace/....keystore')//簽名key所在目錄 keyAlias '...' keyPassword '...' storePassword '...' } } buildTypes { release { buildConfigField "Boolean", "isDebug", "false"//引數1:型別 引數2:變數名 引數3:變數值 debuggable false minifyEnabled true //刪除無用程式碼 shrinkResources true//刪除無用資源 zipAlignEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release//簽名 } debug { buildConfigField "Boolean", "isDebug", "true"//引數一:型別,引數二:變數名,引數三:變數值 debuggable true // debug模式下,顯示log versionNameSuffix "-debug" // 為版本名新增字尾 minifyEnabled false zipAlignEnabled false shrinkResources false } }
簽名檔案及其他通用程式碼應該都會熟悉,這裡主要區別定義的一個常量
buildConfigField "Boolean", "isDebug", "false"//引數一:型別,引數二:變數名,引數三:變數值
這是用於區別是否除錯版本,用於是否列印log日誌時所用,java中呼叫方式:
public static final boolean isDebug = BuildConfig.isDebug;
在程式碼中就可以通過這個值判斷是否需要開啟Log;還有一個versionNameSuffix "-debug",這個是我的專案中需要顯示版本號,在versionName後追加了一個名稱,用以區分
二、多渠道區分,配置不同產品的差異屬性
同樣是在grdle中android{}目錄裡面新增
productFlavors {//設定不同產品的特性 uat {//測試環境 buildConfigField "String", "HOST", "\".....\"" versionName "v2.2.2.2" } prod {//正式上線環境 buildConfigField "String", "HOST", "\".....\"" versionName "v2.2.2" } }
這裡配置兩個不同產品渠道,根據自己的需求可增加刪除,其中buildConfigField "String", "HOST", "\".....\""
同上面isDebug一樣是根據環境差異增加的一個常量,我這裡是用於訪問伺服器的地址更改;根據自己需求也可以增刪改,這裡要注意的是第三個引數字串的雙引號需要用轉義字元;
同樣在java中的呼叫方法:
public static final String ROOTHOST = BuildConfig.HOST;
其中versionName是對版本號名稱的重新命名,這是我專案中對不同環境做版本號區分所用;
三、打包apk檔案的重新命名
繼續在grdle中android{}目錄裡面新增
//apk檔案重新命名
applicationVariants.all { variant ->
variant.outputs.all {
def fileName = "xxx-" + versionName + ".apk"
outputFileName = fileName
// output -> output.outputFileName = "NYTalk_" + buildType.name + "_" + defaultConfig.versionName + "_" //+ new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC")) + ".apk"
}
}
這個是用於打包的時候根據自己的需求重新命名apk,簡單點就自己專案名稱加版本號,需要時間等其他引數也可用註釋掉的程式碼,或者自行個更改;需要注意的是defaultConfig.versionName呼叫的是開始預設的versionName,需要用自己後面修改過的versionName命名,不加defaultConfig即可;
四、assets資源目錄做區分
前面主要做的區分都是一些java程式碼可呼叫的變數;那麼原生assets資源目錄如何根據環境做區分:
1.專案結構檢視調整為project,在src目錄下,mian的同級目錄建立uat與prod資料夾(根據productFlavors自己定義的不同產品渠道建立),並建立assets資源目錄,這裡資源目錄裡就可以放置不同渠道的同名不同資源,例如:
2.然後繼續在grdle中android{}目錄裡面根據flavors指向定義的資源目錄
sourceSets {
assets.srcDirs = ['src/assets']
uat{
assets.srcDirs = ['src/ust/assets']
}
prod {
assets.srcDirs = ['src/prod/assets']
}
}
差異的資源根據產品做區分存放,通用的assets資源按原來的存放方式不變
3.不過我的專案因為是以前的eclipse遷移過來的,src下直接存放是java程式碼,res與src是同級目錄,所以我這裡建立的uat與prod資料夾是與src、res同級的,然後在gradle中的配置如下:
sourceSets {
main {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
jniLibs.srcDirs = ['libs']
}
uat{
assets.srcDirs = ['uat/assets']
}
prod {
assets.srcDirs = ['prod/assets']
}
}
五、環境一鍵切換,更改Build variants中相應即可,執行手機上切換平臺就行
六、一鍵打包不同平臺的apk
Gradle---專案名稱下的Tasks---build---assemble,也可以根據不同的assemble生成特定apk
編譯生成的apk在build--outputs下檢視:
打包好的apk可以自行驗證assets資源是否是對應的平臺資源,可直接解壓apk檔案檢視