android開(kāi)發(fā)中常常會(huì)碰到開(kāi)發(fā)環(huán)境與生產(chǎn)環(huán)境接口地址使用不同域名的情況股毫、甚至要求debug包與release包不同包名堡僻,其實(shí)這些都可以通過(guò)gradle來(lái)幫我們完成圾笨,再也不用手動(dòng)改代碼乔遮,拒絕麻煩與出錯(cuò),了解gralde的用法贫途,有助于提升生產(chǎn)力。這里僅記錄自己開(kāi)發(fā)中碰到的問(wèn)題及解決方式
結(jié)合使用場(chǎng)景與實(shí)際操作
- 動(dòng)態(tài)改變接口地址
- release與debug版本不同包名
- debug使用release版本正式簽名
- apk打包自動(dòng)命名
一待侵、比如release版本要求api域名為:https://www.release.*,而debug版本為:https://www.test.*丢早。</br>我們這里介紹的是通過(guò)在Manifest文件中添加變量,同時(shí)在gradle中打包時(shí)動(dòng)態(tài)的去更改屬性的值秧倾,應(yīng)用啟動(dòng)的時(shí)候去讀取從而動(dòng)態(tài)的改變當(dāng)前版本的域名
- 通過(guò)gradle修改AndroidManifest.xm meta-data值
<!--AndroidManifest.xml-->
<!--編譯時(shí)域名動(dòng)態(tài)切換-->
<application>
<meta-data android:value="${app_version_key}"
android:name="app_version"/>...</application>
- app下的gradle中使用manifestPlaceholders來(lái)動(dòng)態(tài)替換屬性值怨酝,格式如下;
release {
manifestPlaceholders = [
app_version_key: "release"
]
}
debug {
manifestPlaceholders = [
app_version_key: "test"
]
}
3.由于清單文件中我們的meta-data節(jié)點(diǎn)寫(xiě)在application節(jié)點(diǎn)根目錄下,這里我們?cè)赼pplication中去獲取該屬性的值(其他方式請(qǐng)自行g(shù)oogle)
try {
ApplicationInfo info = getPackageManager().getApplicationInfo(getPackageName(), PackageManager.GET_META_DATA);
String host = info.metaData.getString("app_version");
if (host.equals("test")) {//測(cè)試版
HttpApis.host = "https://www.release.*";
} else {//正式版
HttpApis.host = "https://www.test.*";
}
} catch (PackageManager.NameNotFoundException e) {
e.printStackTrace();
}
通過(guò)上述操作我們已經(jīng)可以實(shí)現(xiàn)打包時(shí)那先,release包與debug包域名分開(kāi)农猬。上述同樣可用在第三方sdk如極光推送、測(cè)試版與正式版分開(kāi)推送售淡,可使用manifestPlaceholders 動(dòng)態(tài)的改變對(duì)應(yīng)的屬性值
二斤葱、有時(shí)候?yàn)榱藴y(cè)試方便,我們常將正式版與測(cè)試版分兩個(gè)包名打包揖闸,從而實(shí)現(xiàn)同臺(tái)手機(jī)可以同時(shí)安裝揍堕、拒絕不斷的安裝卸載操作
1、修改app下的gradle文件,需要注意的一點(diǎn)是在配置了productFlavors后汤纸,defaultConfig中的applicationId便會(huì)失效
android{
defaultConfig {
//applicationId "com.david.smarthome"
...
flavorDimensions "versionCode"
}
productFlavors {
appdebug {
applicationId 'com.david.smarthome_test'
}
apprelease {
applicationId 'com.david.smarthome'
}
}
}
2衩茸、Android Studio會(huì)自動(dòng)根據(jù)build.gradle 生成對(duì)應(yīng)的BuildVariants。
對(duì)應(yīng)Release與Debug即可組合成2*2 個(gè)版本的包贮泞。使用圖形界面安裝時(shí)可以通過(guò)Build Variants選擇當(dāng)前要build到手機(jī)的版本
3楞慈、Signed Apk時(shí)同樣有2*2種維度的不同版本可供打包
自此我們已經(jīng)完成多包名打包的配置
三幔烛、由于Android Studio 打Debug包時(shí)默認(rèn)使用 簽名為Debug版本,即:debug.keystore,而當(dāng)我們接入的第三方SDK如微信等要求提交Release版本的簽名(release.jks)囊蓝。這個(gè)時(shí)候最方便的方式便是讓打Debug包的時(shí)候直接使用我們正式版的簽名
修改app.gradle,添加signingConfigs饿悬,同時(shí)在debug中指向該簽名文件
android {
signingConfigs {
signconfig {
keyAlias 'smarthome'
keyPassword '123123'
storeFile file('/Users/david/AndroidStudioProjects/SmartHome/smarthome.jks')
storePassword '123123
}
}
debug {
...
signingConfig signingConfigs.signconfig
}
}
以上兩部即可實(shí)現(xiàn)我們的效果,Debug包已經(jīng)使用的是我們正式版的簽名文件
四慎颗、定義打包命名規(guī)則乡恕,結(jié)合時(shí)間日期,免去手動(dòng)重命名易錯(cuò)俯萎,沒(méi)規(guī)律的問(wèn)題
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
}
android{
applicationVariants.all { variant ->
if (variant.buildType.name.equals('release')) {
variant.outputs.all { output ->
def buildName = "com.david.smarthome"
def type = variant.buildType.name
def releaseApkName = buildName + '_' + type + "_" + versionName + '_' + releaseTime() + '.apk'
outputFileName = releaseApkName
}
} else {
variant.outputs.all { output ->
def buildName = "com.david.smarthome"
def releaseApkName = buildName + '_' + "test" + "_" + versionName + '_' + releaseTime() + '.apk'
outputFileName = releaseApkName
}
}
}
}