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愉快的玩耍了!!!

博客地址:Android studio gradle中分渠道加载res、libraries及Class

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值