AndroidStudio非常強大,公司最近有一個需求是要實現對一個APP進行多個版本的打包,而且可以同時安裝在手機上。這個需求詳細一點的描述是:公司有一個APP,有多個開發商要使用我們的APP,爲了大家都想有一個自己的APP,而且圖標不一樣,app名字不一樣,背景不一樣等。我查詢了一下資料發現,在AndroidStudio的gradle是可以配置的。在此特意寫一篇文章記錄分享。
配置簽名
首先編寫好籤名文件,之後保存在自己的Module中,之後進行在build.gradle中添加一下的代碼
android{
//簽名
signingConfigs {
//標準版
release {
//打包可以所在的路徑
storeFilefile("../key/your_key_file.jks")
//AndroidStudio進行打包時輸入的密碼
storePassword "store_passwrord_value"
//key的別名
keyAlias "app_alias_value"
keyPassword "key_pwd_value"
}
//預覽版
pre {
storeFile file("../key/your_key_file.jks")
storePassword "store_passwrord_value"
keyAlias "app_alias_value"
keyPassword "key_pwd_value"
}
}
}
創建打包類型
創建需要打包的類型,對應的公司(暫時這樣理解)等,在這裏我們虛擬兩個公司:owant,ola,添加代碼如下,主要使用buildTypes的模塊,創建需要創建的模塊。
buildTypes {
//owant公司
owant{
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
//ola公司
ola{
minifyEnabled false
shrinkResources true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
動態改變APP的個別參數
有了創建類型後,我們需要對應的類型進行動態更改一些參數,譬如,APP的包名,使得APP能同時安裝在同一臺手機上,owant的APP名字爲歐旺
,ola的APP名字爲歐拉
,還有APP的圖標顯示不一樣的圖標。代碼如下,其中對於動態字段是獲取是getResources().getString(R.string.companyName)和在string文件寫的一樣。
productFlavors {
//必須你輸出是在你的buildType的類型爲後綴
//歐旺的最終版
release_owant {
//包名
applicationId "com.owant.app"
//字符改變main xml的文件字段值
manifestPlaceholders = [app_name : "歐旺",
icon_value : "@drawable/logo_owant"
]
//在java代碼中使用的是getResources().getString(R.string.companyName)
//目前只支持字符的動態
resValue("string", "companyName", "歐旺有限公司")
}
//歐拉的預覽版
pre_ola {
applicationId "com.ola.app"
manifestPlaceholders = [app_name : "歐拉",
icon_value : "@drawable/logo_ola"
]
resValue("string", "companyName", "歐拉有限公司")
}
}
打包輸出文件命名
對於apk的輸出的命名進行設置的代碼如下:
android{
android {
//打包輸出文件
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
"Owant_${variant.productFlavors[0].name}_v${variant.versionName}_" + buildTime() + ".apk")
// "Healthcare_${variant.productFlavors[0].name}_v${variant.versionName}" + ".apk")
}
}
}
}
//獲取系統時間
def buildTime() {
def df = new SimpleDateFormat("yyyyMMdd")
df.setTimeZone(TimeZone.getDefault())
return df.format(new Date())
}
打包後對APP進行不必要資源的清理
進行了以上的實現後,發現我們的需求大部分都可以實現的。但是有一個問題。就是對於APP的背景改變問題,在進行打包之前,我是有一個思路的就是採用zip技術進行動態改變APK包的資源(apk是採用zip壓縮,解壓後再壓縮對簽名文件沒有破壞),但是後來發現對於字符的管理處理起來發現不行。後來查詢了很多網上的資源,發現AndroidStudio自帶的可以實現部分的。但是對於背景呢,我們必須有兩個背景圖片如logo_ola.png
和logo_owant.png
在drawable文件下(app的圖標也是),發現我們的APK越大越大。這是我的解決方案是:
採用AndroidStudio的gradle進行字符管理
採用zip壓縮技術進行資源清理,刪除無關的數據
最終的腳本代碼,我還沒有寫。你也可以用壓縮工具進行刪除。希望對大家有幫助。