Android studio gradle中分渠道加载res、libraries及Class

来源:互联网 发布:dcs编程软件 编辑:程序博客网 时间:2024/06/06 09:46

转载:Android studio gradle中分渠道加载res、libraries及Class

前段时间遇到这样的需求,在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愉快的玩耍了!!!

阅读全文
0 0