關於Android渠道打包是一個比較老的話題,今天主要記錄總結一下多渠道打包以及若是動態配置修改一些資源屬性。今天以公司實際需求爲例進行演示,因爲項目複用不少公共的業務組件,並且業務組件之間的跳轉採用Scheme協議,每一個業務組件的host地址不變,因此須要在打包的時候動態修改scheme協議名字。爲了方便舉例,首先咱們這裏假設咱們一個App要打出兩個不一樣的渠道,方便進行數據統計。android
AndroidManifest.xml中
<meta-data android:name="APP_CHANNEL" android:value="external" />
爲了方便經過gradle自動替換,value須要替換成標記位的方式app
<meta-data android:name="APP_CHANNEL" android:value="${APP_CHANNEL}" />
好比咱們這裏聲明一個外部版本一個內部版本,manifestPlaceholders 替換AndroidManifest中的
${APP_CHANNEL}值工具
productFlavors {
external {
manifestPlaceholders = [APP_CHANNEL: "external"]
}
internal {
manifestPlaceholders = [APP_CHANNEL: "internal"]
}
}
上面的也能夠修改爲批量處理方式gradle
productFlavors {
external {}
internal {}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [APP_CHANNEL: name]
}
}
打包的話能夠經過在android studio底欄中有個命令行工具Terminal,例如打包全部渠道能夠執行下面的命令
ui
gradlew assembleRelease
若是要打指定渠道的話,能夠執行下面的命令,例如要打external外部版本spa
gradle assembleExternalRelease
也能夠經過gradle projects裏面生成的命令選項進行打包,生成的選項如圖所示:命令行
buildTypes {
release {
//混淆
minifyEnabled false
//是否壓縮對齊
zipAlignEnabled true
//清除不用的資源
shrinkResources false
//混淆腳本路徑
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
signingConfig signingConfigs.releaseConfig
//自定義apk名字
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
"${applicationId}-${variant.productFlavors[0].name}-${versionName}-${releaseTime()}.apk".toLowerCase())
}
}
}
debug {
//debug時候也採用正式簽名文件
signingConfig signingConfigs.releaseConfig
}
}
}
第五步定製app scheme地址debug
根據上面的渠道替換原理,只需添加一個scheme標記便可code
<activity android:name=".GoodsDetailActivity" android:theme="@style/AppTheme"> <!--要想在別的App上能成功調起App,必須添加intent過濾器--> <intent-filter> <!--協議部分,隨便設置--> <data android:host="goods" android:path="/goodsDetail" android:port="8888" android:scheme="${myScheme}"/> <!--下面這幾行也必須得設置--> <category android:name="android.intent.category.DEFAULT"/> <action android:name="android.intent.action.VIEW"/> <category android:name="android.intent.category.BROWSABLE"/> </intent-filter> </activity>
在gradle中添加替換xml
manifestPlaceholders = [
myScheme: "XApp",
]
替換指定屬性,好比顏色值,使用以下代碼
resValue "color", "app_theme_color", "#283146"
根據多渠道打包的原理來實現定製特定須要的app包。