前段時(shí)間遇到這樣的需求十办,在App里使用了地圖功能,對應(yīng)海外版使用Android內(nèi)置google的地圖服務(wù)超棺。而對于國內(nèi)版(大家都知道的)向族,我們使用了高德地圖。而在導(dǎo)入高德地圖的時(shí)候需要加入對應(yīng)的sdk及.so文件棠绘,這樣最后打包的大小會(huì)增加2M左右件相。但海外版并不需要這部分資源,故需要根據(jù)不同的渠道加載不同的jar氧苍、res夜矗、及不同的類,有助于保持代碼的干凈让虐,控制包的大小紊撕。
不多說了,直接上步驟赡突!
1)首先要獲創(chuàng)建不同的productFlavors对扶,便于分渠道打包和調(diào)試区赵;
productFlavors {
// Define separate dev and prod product flavors.
dev {
minSdkVersion 21
...
}
Chinese_dev {
minSdkVersion 21
...
}
2)要獲取當(dāng)前Flavor(),用于選擇相應(yīng)的資源:
def getCurrentFlavor() {
Gradle gradle = getGradle()
String taskStr = gradle.getStartParameter().getTaskRequests().toString()
println("taskStr:" + taskStr)
println()
Pattern pattern;
if (taskStr.contains("assemble")) {
pattern = Pattern.compile("assemble(\\w+)(Release|Debug)")
} else {
pattern = Pattern.compile("generate(\\w+)(Release|Debug)")
}
Matcher matcher = pattern.matcher(taskStr)
if (matcher.find()) {
returnmatcher.group(1);
}
return ""
}
3)判斷是否是自己需要的Flavor,并選擇libs的路徑(這里需要?jiǎng)?chuàng)建不同名字的libs包辩稽,如這里可以把高德的相關(guān)jar放入cn_libs目錄下):
def buildLibs() {
String currentFlavor = getCurrentFlavor()
println("current Flavor:" + currentFlavor)
booleanisChinese = "Chinese_dev".equalsIgnoreCase(currentFlavor))
println("--- is Chinese ---" + isChinese)
if (isChinese) {
return'cn_libs'
}
return 'libs'
}
4)在dependencies中加載時(shí)調(diào)用buildLibs方法來取出要加載的資源包:
dependencies {
compile fileTree(dir: buildLibs(), include: ['*.jar’]
5)為了完整的讓不同的資源分開惧笛,還需要把AndroidManifest.xml及resource文件都分開。在main目錄的同級(jí)目錄下可創(chuàng)建兩個(gè)單獨(dú)的目錄逞泄,如分別是cn及en,并放入對應(yīng)的代碼及資源拜效。
對于AndroidManifest.xml喷众,關(guān)鍵資源使用 tools:node=“merge”:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" tools:node="merge"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" tools:node="merge"/>
<application
tools:node="merge">
<meta-data
android:name="com.amap.api.v2.apikey"
android:value="key"/>
<service android:name="com.amap.api.location.APSService"/>
</application>
</manifest>
2.對于代碼class的替換,若要根據(jù)flavor來切換代碼紧憾,則需要不同的flavor的java包到千,并在其下創(chuàng)建下創(chuàng)建相同的類名,并且在main下不能再有該類赴穗,則在打包時(shí)只打?qū)?yīng)的class文件憔四,其他的則丟棄。如:
| Flavor A
| ——-> com.fan.util
| ————> class A
| main
| ——>com.fan.util
| ————>不能再有class A
| Flavor B
| ——>com.fan.util
| ————->class A
創(chuàng)建好后的目錄大概長這樣:
3.在gradle文件中配置java.srcDirs,AndroidManifest.xml及resource的位置:
sourceSets {
main {
jniLibs.srcDirs = ['libs']
java.srcDirs = ['src/main/java']
res.srcDirs = ['src/main/res']
}
dev {
java.srcDirs = ['src/us/java/']
}
Chinese_dev {
jniLibs.srcDirs = ['libs-zh']
manifest.srcFile 'src/cn/AndroidManifest.xml'
java.srcDirs = ['src/cn/java/']
res.srcDirs = ['src/cn/res']
}
}
然后就可以通過Build Variants愉快的玩耍了0忝肌A苏浴!