一柿扣、參考
1、多渠道打包——同一臺設備上同時安裝你的正式與測試環(huán)境APP
2闺魏、Android多渠道打包沒你想的那么復雜
3未状、多渠道打包之動態(tài)修改App名稱,圖標析桥,applicationId司草,版本號,添加資源
二烹骨、應用場景
1翻伺、一個APP針對多個應用市場材泄,需要在不同應用市場看日活啊等等的
2沮焕、同一個工程代碼,但是需要用到不同的省市區(qū)拉宗、掛在不同的服務器下面峦树,等于多個有一樣功能但又互相獨立的APP,可以多個同時安裝在手機上面
3旦事、其他
三魁巩、效果圖
四、實例:以應用場景2作為案例
1姐浮、app/build.gradle 文件的修改谷遂,增加:productFlavors
1.1、defaultConfig注釋掉原本的applicationId卖鲤,不然會和多渠道內的包名有沖突
1.2肾扰、versionCode和versionName也可以配置進productFlavors中去,不多說
1.3蛋逾、buildTypes暫時就用默認的
1.4集晚、productFlavors下一般有這幾部分組成
定義 | 內容 |
---|---|
applicationId | 某個取到的應用包名 |
resValue | 針對資源文件,包含string.xml等区匣,注意兩點偷拔,(1)keyname一定要有且一致 (2)原本main目錄下的keyname注釋掉,分別增加多渠道通道的資源文件庫亏钩,后面會截圖顯示 |
buildConfigField | 自動建立BuildConfig文件中的動態(tài)常量莲绰,注意String值的話是‘ “ xxx ” ’這樣的格式 |
manifestPlaceholders | 清單文件里可動態(tài)替換的內容,這里一般由打包的apk名字姑丑,還有fileprovider等等钉蒲,還有各種第三方key,比如友盟彻坛,極光推送等等 |
1.5顷啼、學習幾個英語單詞踏枣,加深理解
英文 | 中文 |
---|---|
Variants | 變體 - 所以應該叫‘多變體打包’--好難聽 |
Flavors | 特點 - 變體的特點/渠道的特點--就是需要替換的動態(tài)常量 |
Channel | 渠道 - 這個才是渠道嗎~~AS里完全沒有,但是好聽呀 |
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
buildToolsVersion "26.0.2"
defaultConfig {
//因為多渠道已經有包名了钙蒙,此處注釋掉
//applicationId "com.flavor.test.flavortestapp"
minSdkVersion 14
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
//默認的茵瀑,會有release和隱藏的debug
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
/**
* 多渠道打包
* 1、applicationId = 軟件-包名
* 2躬厌、app_name = 資源文件string.xml下的马昨,需要建立不同的res目錄
* 3、BASE_SERVER_URL = 基礎服務器地址扛施,在自動創(chuàng)建BuildConfig下
* 4鸿捧、APP_File_Provider = 文件provider,一般是包名+fileprovider命名
* 5疙渣、其他所需要配置的百度Key匙奴,極光推送key,友盟key等等...
* */
productFlavors {
//我的APP
my_app{
applicationId "com.flavor.myapp"
resValue "string", "app_name", "APP-我的"
buildConfigField "String" , "APP_File_Provider" , '"com.flavor.myapp.fileprovider"'
buildConfigField "String" , "BASE_SERVER_URL" , '"http://my/app/"'
//manifest里面的值
manifestPlaceholders = [
MTA_CHANNEL_VALUE : "my_app",
FILE_PROVIDER : "com.flavor.myapp.fileprovider" ]
}
//你的APP
your_app{
applicationId "com.flavor.yourapp"
resValue "string", "app_name", "APP-你的"
buildConfigField "String" , "APP_File_Provider" , '"com.flavor.yourapp.fileprovider"'
buildConfigField "String" , "BASE_SERVER_URL" , '"http://your/app/"'
//manifest里面的值
manifestPlaceholders = [
MTA_CHANNEL_VALUE : "your_app",
FILE_PROVIDER : "com.flavor.yourapp.fileprovider" ]
}
}
/**
* 打包導出apk時候的名字妄荔,或者各種服務的key配置等等
* */
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
//如果打包release版本泼菌,則包名為 xx取到.apk
if (variant.buildType.name.equals('release')) {
def fileName = "Channel${defaultConfig.versionName}_${variant.productFlavors[0].name}"+releaseTime()+".apk"
output.outputFile = new File(outputFile.parent, fileName)
}
}
}
}
//打包時間
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
2、需要修改的工程目錄和調試
這里my_app和your_app目錄下的mipmap和values分別就改了唯一需要動態(tài)改變的圖片和值啦租,比如string.xml下的app_name哗伯,原本main下values中string.xml的app_name注釋掉
<resources>
<string name="app_name">APP-你的</string>
</resources>