前段时间遇到这样的需求,在App里使用了地图功能,对应海外版使用Android内置google的地图服务。而对于国内版(大家都知道的),我们使用了高德地图。而在导入高德地图的时候需要加入对应的sdk及.so文件,这样最后打包的大小会增加2M左右。但海外版并不需要这部分资源,故需要根据不同的渠道加载不同的jar、res、及不同的类,有助于保持代码的干净,控制包的大小。
不多说了,直接上步骤!
1)首先要获创建不同的productFlavors,便于分渠道打包和调试;
productFlavors {
// Define separate dev and prod product flavors.
dev {
minSdkVersion 21
...
}
Chinese_dev {
minSdkVersion 21
...
}
2)要获取当前Flavor(),用于选择相应的资源:
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的路径(这里需要创建不同名字的libs包,如这里可以把高德的相关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中加载时调用buildLibs方法来取出要加载的资源包:
dependencies {
compile fileTree(dir: buildLibs(), include: ['*.jar’]
5)为了完整的让不同的资源分开,还需要把AndroidManifest.xml及resource文件都分开。在main目录的同级目录下可创建两个单独的目录,如分别是cn及en,并放入对应的代码及资源。
对于AndroidManifest.xml,关键资源使用 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的替换,若要根据flavor来切换代码,则需要不同的flavor的java包,并在其下创建下创建相同的类名,并且在main下不能再有该类,则在打包时只打对应的class文件,其他的则丢弃。如:
| Flavor A
| ——-> com.fan.util
| ————> class A
| main
| ——>com.fan.util
| ————>不能再有class A
| Flavor B
| ——>com.fan.util
| ————->class A
创建好后的目录大概长这样:
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愉快的玩耍了!!!