使用 gradle 编译多版本 android 应用
2016-11-23 15:25
288 查看
原文:http://www.cnblogs.com/redclock/p/5033886.html?utm_source=tuicool&utm_medium=referral
最近要做一个 android 产品的变种版本,需要编出不同版本,每个版本有不同的包名、图标等等,和一些特有的逻辑。
很久之前做过类似的工作,当时没有 gradle, 用的方法是把公共代码抽成一个 library,不同版本建一个工程引用公共 libery。但是这种方法每个版本要建一个工程,工作量较大,并且会有一些重复代码,不好维护。
现在的工程是用 gradle 构建的,网上查了一下应该用 product flavors 做这个事情,之前没接触过,现在把方法记录在这里。
Product flavors 用法很简单。在 build.gradle 的 android 段中加入
gradle 的任务里就会多了 assembleDemo1 和 assembleDemo2,可以编出不同的版本。applicationId 是 apk 的包名,而且这个 applicationId 不会影响资源类 R 所在的包,在代码里不同版本引用的 class R 都是在 AndroidManifest.xml 所指定的 package 里,所以很方便。
Android Studio 界面左下角有个Build Variants 的选项,可以选择当前编那个版本。
在 sourceSets段中可以设置不同版本的代码和资源位置。
这里 main 是公共的代码和资源,demo1 及 demo2 中找不到的文件会在 main 中查找,因此每个版本下只要放自己改动过的文件就可以了。
在 productFlavors 中,可以指定配置
在代码中可以用 BuildConfig.HOST 来访问不同的配置。
如果不同版本权限不同,可以用 manifestPlaceholders 修改 AndroidManifest.xml 中的内容来实现。
AndroidManifest.xml 中:
对 billPermission 设置不同的值,可以控制有没有内购权限:
只有 demo1 有 com.android.vending.BILLING 权限。demo2 由于 INTERNET 权限和前面重复,会被忽略掉
Product Flavor 还有许多可以控制的地方,了解更多可以访问 Android Plugin DSL Referrence
最近要做一个 android 产品的变种版本,需要编出不同版本,每个版本有不同的包名、图标等等,和一些特有的逻辑。
很久之前做过类似的工作,当时没有 gradle, 用的方法是把公共代码抽成一个 library,不同版本建一个工程引用公共 libery。但是这种方法每个版本要建一个工程,工作量较大,并且会有一些重复代码,不好维护。
现在的工程是用 gradle 构建的,网上查了一下应该用 product flavors 做这个事情,之前没接触过,现在把方法记录在这里。
定义多版本
Product flavors 用法很简单。在 build.gradle 的 android 段中加入android { ... productFlavors { demo1 { applicationId "com.mycompany.demo1" } demo2 { applicationId "com.mycompany.demo2" } } }
gradle 的任务里就会多了 assembleDemo1 和 assembleDemo2,可以编出不同的版本。applicationId 是 apk 的包名,而且这个 applicationId 不会影响资源类 R 所在的包,在代码里不同版本引用的 class R 都是在 AndroidManifest.xml 所指定的 package 里,所以很方便。
Android Studio 界面左下角有个Build Variants 的选项,可以选择当前编那个版本。
添加多版本的资源文件目录
在 sourceSets段中可以设置不同版本的代码和资源位置。sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src/main/java'] resources.srcDirs = ['src/main/java'] aidl.srcDirs = ['src/main/java'] renderscript.srcDirs = ['src/main/java'] res.srcDirs = ['src/main/res'] assets.srcDirs = ['assets'] jniLibs.srcDirs = ['libs'] } demo1.java.srcDirs = ['src/demo1/java'] demo1.res.srcDirs = ['src/demo1/res'] demo2.java.srcDirs = ['src/demo2/java'] demo2.res.srcDirs = ['src/demo2/res'] }
这里 main 是公共的代码和资源,demo1 及 demo2 中找不到的文件会在 main 中查找,因此每个版本下只要放自己改动过的文件就可以了。
多版本配置
在 productFlavors 中,可以指定配置productFlavors { demo1 { applicationId "com.mycompany.demo1" buildConfigField 'String', 'HOST', '"http://www.baidu.com"' } demo2 { applicationId "com.mycompany.demo2" buildConfigField 'String', 'HOST', '"http://www.google.com"' }
在代码中可以用 BuildConfig.HOST 来访问不同的配置。
控制不同权限
如果不同版本权限不同,可以用 manifestPlaceholders 修改 AndroidManifest.xml 中的内容来实现。AndroidManifest.xml 中:
<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="${billPermission}" />
对 billPermission 设置不同的值,可以控制有没有内购权限:
productFlavors { demo1 { applicationId "com.mycompany.demo1" manifestPlaceholders = [ "billPermission": "com.android.vending.BILLING", ] } demo2 { applicationId "com.mycompany.demo2" manifestPlaceholders = [ "billPermission": "android.permission.INTERNET", ] }
只有 demo1 有 com.android.vending.BILLING 权限。demo2 由于 INTERNET 权限和前面重复,会被忽略掉
Product Flavor 还有许多可以控制的地方,了解更多可以访问 Android Plugin DSL Referrence
相关文章推荐
- 使用 gradle 编译多版本 android 应用
- 终端下使用gradle编译android应用
- 使用Gradle构建Android应用内测版本
- 使用Gradle构建Android应用内测版本
- 使用ant来管理编译Android应用
- 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)
- Android Gradle编译学习日记之二(使用 Gradle 编译 Eclipse,引入依赖资源以及迁移 Android Studio)
- 使用Gradle构建Android应用的渠道包
- 使用 DX 编译 Android应用
- 使用ANT、Proguard混淆、发布与反编译Android应用
- Android Gradle编译学习日记之二(使用 Gradle 编译 Eclipse,引入依赖资源以及迁移 Android Studio)
- 使用ant编译android应用
- 使用Gradle构建Android应用的渠道包
- 使用Tortoise SVN版本控制Eclipse工作区的Android项目时,bin编译错误
- 【Andrioid】在Gradle中编译一次生成不同的版本,动态设定应用标题,应用图标,替换常量
- 使用Tortoise SVN版本控制Eclipse工作区的Android项目时,bin编译错误
- [置顶] 用android-ndk-r8e交叉编译cocos2d-x-2.1.4Android工程方法(而不再使用Cgywin,注意ndk和cocos2d-x版本)
- 强制老版本SDK编译的应用使用Android 4.4的对齐唤醒机制
- 使用Gradle构建Android应用的渠道包
- 使用eclipse和gradle对Android应用进行批量打包