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愉快的玩耍了!!!
- Android studio gradle中分渠道加载res、libraries及Class
- Android studio gradle中分渠道加载res、libraries及Class
- Android Studio 使用Gradle 打渠道包
- Android Studio及Gradle
- android studio 使用gradle批量打渠道包
- Android Studio Gradle打包实践之多渠道+版本号管理
- Android Studio Gradle实践之多渠道自动化打包+版本号管理
- Android Studio Gradle打包实践之多渠道+版本号管理
- Android Studio Gradle实践之多渠道自动化打包
- Gradle in Android Studio: Failed to resolve third-party libraries
- Android Gradle打渠道包
- Android Studio 批量打包(渠道包,最新基于Gradle 2.2.1、Android Plugin 1.2.3)
- Android Studio Gradle实践之多渠道自动化打包(Android快速多渠道打包)
- 使用Gradle构建Android应用的渠道包-Android studio 多渠道打包(超简洁版)
- android res加载
- Android Studio多渠道打包方式二:通过在gradle文件来写渠道信息
- android studio 使用gradle批量打渠道包(示例,出错代码)
- mac jdk及gradle 配置Android studio
- 创建redis集群报错 /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load suc
- 端口调研
- JS正则表达式使用验证账号、手机号、电话和邮箱
- SQL 约束 (Constraints)
- CLion 配置 C C++ 编译环境(MinGW)
- Android studio gradle中分渠道加载res、libraries及Class
- bug修复-android中的onCreate两个参数的方法是什么鬼?
- 61、二叉搜索树的第k个结点
- 数据转发中心高并发访问次数统计(mysql实现)
- javascript Array数组常用的方法
- (1798: [Ahoi2009]Seq 维护序列seq)<线段树乘法操作>
- docker--容器和镜像
- Java,bit比特,byte字节,char字符,short,int,long,float,double,string,字母,汉字/编码等
- 面试题7:用两个栈实现队列