android gradle 渠道中的gradle怎么用文件管理渠道来实现打包

&&&&gradle打包android (实现外部导入签名文件、多渠道打包、导入ant脚本)
gradle打包android (实现外部导入签名文件、多渠道打包、导入ant脚本)
gradle打包android (实现外部导入签名文件、多渠道打包、导入ant脚本)
若举报审核通过,可奖励20下载分
被举报人:
killer1989
举报的资源分:
请选择类型
资源无法下载
资源无法使用
标题与实际内容不符
含有危害国家安全内容
含有反动色情等内容
含广告内容
版权问题,侵犯个人或公司的版权
*详细原因:
VIP下载&&免积分60元/年(1200次)
您可能还需要
开发技术下载排行不知道的肯定以为是影视学院的学生在拍戏呢。
新郎的衣服已经被撕开,双脚也被透明胶带捆住了。
声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。
  最近在项目中遇到需要实现 Apk 多渠道、定制化打包, 查找了一些资料,成功实现了上述功能,在此记录以备不时之需,温故而知新,可以为师矣~
  需求可以总结如下:
  如何实现多个 Apk 安装在同一设备
  在之前的印象中,同一个应用在同一设备上只能安装一个,除非手动修改 AndroidManifest.xml 文件中的包名( package),但这么做的后果就是新的应用真的是新的应用,旧版应用再也收不到更新。而现在你通过 Gradle,你可以轻松构建多个不同版本的应用,并且在同一设备上安装使用。
  这里要用到 productFlavors(http://google.github.io/android-gradle-dsl/current/com.android.build.gradle.internal.dsl.ProductFlavor.html),productFlavors 可以用来自定义应用构建版本,我们可以用其 applicationId属性来实现多个 Apk 安装在同一设备上。
  build.gradle 中部分配置代码如下:
  MainActivity.java:
  在 Android Studio 中执行如下命令:
  打包完成后,将 Apk 安装到模拟器(adb install name.apk),运行,log 如下:
  flavors_default:
  flavors_dev:
  flavors_release:
  从这里可以看出,不同 flavor 的 package name 被 applicationId 替换掉了,而且同一个模拟器上可以同时安装以上三个应用。
  下面我们再看看 AndroidManifest.xml 中发生了什么变化。这里需要用到 aapt 来查看 AndroidManifest.xml 的信息:
  关于 aapt 使用的更多用法,可以阅读这篇博文:使用 aapt 查看 apk 的各种信息(http://blog.csdn.net/g/article/details/)
  下面是 flavors_dev 版本的信息,可以看出 Java 源文件的包名并没有发生改变,而 package 属性的值被替换为 applicationId了。
  applicationId 的原理可以理解为在 gradle 打包的时,动态合并属性,将 package 替换为 applicationId 指定的值,但并不会替换 Java 文件的包名,包括生成的 R 文件(可以去对应 module 下的 build/generated 目录下查看对应 flavor 的 R 文件)。
  Android 官方文档原文如下:
  Therefore, we have decoupled the two usages of package name:
  The final package that is used in your built .apk’s manifest, and is the package your app is known as on your device and in the Google Play store, is the “application id”.
  The package that is used in your source code to refer to your R class, and to resolve any relative activity/service registrations, continues to be called the “package”.
  补充:ApplicationId versus PackageName
  替换 AndroidManifest.xml 中的属性
  这里可以参考友盟统计 SDK 中使用的方案。该方案通过在 AndroidManifest.xml 文件中 application标签下指定 &mate-data&设置占位符来实现动态替换属性值。
  占位符形如${name},在最终执行 AndroidManifest.xml 文件合并的时候,占位符会被 build.gradle 中对应值取代。 build.gradle 的配置需要用到上节讲到的 productFlavors 的 manifestPlaceholders属性, manifestPlaceholders属性直译过来就是清单文件占位符。
  下面是 build.gradle的节选代码:
  如果你要替换多个属性,则只需要将 manifestPlaceholders 的写法如下:
  补充:关于 AndroidManifest 文件合并规则可以查看 官方文档(/javase/8/docs/technotes/tools/unix/keytool.html)
  替换资源文件
  多渠道打包的时候可能会碰到这种情况:每个应用市场的启动页图标、应用名称可能会有点小出入,更有甚者,连布局都不一样。这时候我们该怎么办呢?
  有一种解决办法就是:在代码里进行判断,根据渠道的不一样,加载不同的图片和布局,这是一种解决办法。但是当渠道有很多时,代码就会变得很难维护,而且指定渠道用到的资源文件都会被打入所有 Apk 中。所以这个方法并不值得推荐。那么,有什么好的解决办法呢?
  办法 Google 早就给我们想好了,而且相当简单,那就是:在 main 的同级目录下创建以渠道名命名的文件夹,然后创建资源文件(路径要与 main 中的一致),然后打包的时候 gradle 就会自己替换或者合并资源。
  例如, App 的默认 icon 路径为 main\res\mipmap-hdpi\ic_launcher.png,那么 flavors_dev的路径就为 flavors_dev\res\mipmap-hdpi\ic_launcher.png,打包 flavors_dev 渠道的时候会自动替换图片。
  对于资源合并,如果在 main 下的 strings.xml 内容为:
  以上特性可以用来替换 Apk 的应用名称和应用图标,这比使用前面讲到的占位符方便很多。同理,替换图片和合并颜色的原理也相似。
  多渠道使用独立签名
  多渠道打包的时候,可能每个渠道包的签名都必须不一样,真正做到定制化,那么,怎么实现每个渠道包使用指定的签名呢?
  平时我们打包的时候是这样的:
  而给每个渠道包指定签名其实也差不多。
  Google 官方原话:
  This enables either having all release packages share the same SigningConfig, by setting android.buildTypes.release.signingConfig, or have each release package use their own SigningConfig by setting each android.productFlavors.*.signingConfig objects separately.
  大意就是,在 buildType 下指定签名的具体属性,形如 android.productFlavors.*.signingConfig signingConfigs.*,前一个 *指代在 productFlavors 中定义的 flavor ,后一个 *指代在 signingConfigs 定义的属性。值得注意的是,signingConfigs 必须定义在 buildType 之前。
  以下是 build.gradle 的配置节选:
  下面我们来验证下生成的包的签名是否正确,查看签名我们会用到如下两个命令:
  更多 keytool 命令使用可以查看 官方文档(/javase/8/docs/technotes/tools/unix/keytool.html)
  首先,我们来看下 littlejie.jks 的信息:
  可以发现两者的 SHA1 值是相等的。
  同理,可以查看 littlejie_dev.jks 和 multichannel-flavors_dev-release.apk 的签名信息
  但是这里有个问题,就是这种给某个 flavor 指定签名的方法对 debug 无效,有兴趣的同学可以看上述注释掉的 debug 签名部分配置。简单来说,debug 签名只能指定一个或者使用默认的 debug 签名。
  若哪位大神有解决方案,欢迎指出~
  这里再做几点补充:
  1.多渠道使用独立签名,打包时千万不要使用 Android Studio 中 Build 菜单下的 Generate Signed APK,因为当你使用这个打包的时候, Android Studio 会让你指定使用的签名文件, so 你就等着哭吧~楼主因为这个折腾了半天。解决方法就是使用 gradle tasks。传送门:Android Gradle Build Tasks
  2.鉴于第一点中的传送门需要FQ,所以在这里简单介绍一下 Android Gradle Build Tasks的使用。
打全部包: gradle assemble
打全部 Debug 包: gradle assembleDebug,可以简写为 gradle aD,前提是没有相同缩写的参数
打全部 Release 包: gradle assembleRelease,可以简写为 gradle aR
打指定 flavor 包: gradle assemble(flavor)(Debug|Release)
打包完成后安装(设备上没有安装该 apk ,否则会失败,而且只能指定 flavor ,不然也会失败): gradle install(flavor)(Debug|Release)
打包前先 clean 一下(在测试的时候很必要,如果不 clean 的话,可能会导致某些小修改不会及时打入新包): gradle clean assembleDebug
  利用 Gradle 修改构建版本号
  楼主表示对 Groovy 不是很熟,所以利用 Gradle 自动修改构建版本这个就先留着,我先去研究几天~
  以上就是自己在使用 Gradle 实现 Android 多渠道打包时碰到的问题, Android 官方关于使用 Gradle 的文档已经很详细了,自己总结的只是一点皮毛,有时间要去自习研读下。
  工作一年多,愣是没有写博客做总结,好多东西都是用过就忘,下次要用再找,没有成体系的 Android 知识结构,对工资不满意,可就连想跳槽面试都没底气。这次写这篇博客画了思维导图,自以为逻辑清晰了,可是真正要把这些东西讲述清楚,还真是一件麻烦的事~看来,自己还有很长的路要走~
  这段时间自己也在思考,是转行还是去考事业编制,还是继续做 Android。转行,除了编程自己好像别的什么也不会,当然自己编程也做的不怎么好。考事业编制,这个可以考虑,毕竟再很多人眼里这是个旱涝保收的职业。继续做 Android ,这个也不错,除了每次都花大把时间用来改 UI,别的都还不错(吐槽产品)。
  话说,有没有什么工作,自由、上班时间少、工资高的?当然没有,至少现阶段的自己是接触不到的,所以,骚年,还是努力吧!多读书、多看报、多运动,少吃零食多睡觉~
  恩,算是对工作一年多的总结也是吐槽~
  读万卷书,行万里路~
  参考:
  1.Gradle Plugin User Guide
  2.Android Plugin DSL Reference:http://google.github.io/android-gradle-dsl/current/
  3.Android Studio Gradle实践之多渠道自动化打包+版本号管理:http://unclechen.github.io//Android-Studio-Gradle%E5%AE%9E%E8%B7%B5%E4%B9%8B%E5%A4%9A%E6%B8%A0%E9%81%93%E8%87%AA%E5%8A%A8%E5%8C%96%E6%89%93%E5%8C%85+%E7%89%88%E6%9C%AC%E5%8F%B7%E7%AE%A1%E7%90%86/
  加社群小助手申请入群,专业交流微信群期待你的加入(请注明“Android技术”)~
  如果觉得我精彩的话,就分享到朋友圈让更多小伙伴看到吧~
欢迎举报抄袭、转载、暴力色情及含有欺诈和虚假信息的不良文章。
请先登录再操作
请先登录再操作
微信扫一扫分享至朋友圈
搜狐公众平台官方账号
生活时尚&搭配博主 /生活时尚自媒体 /时尚类书籍作者
搜狐网教育频道官方账号
全球最大华文占星网站-专业研究星座命理及测算服务机构
主演:黄晓明/陈乔恩/乔任梁/谢君豪/吕佳容/戚迹
主演:陈晓/陈妍希/张馨予/杨明娜/毛晓彤/孙耀琦
主演:陈键锋/李依晓/张迪/郑亦桐/张明明/何彦霓
主演:尚格?云顿/乔?弗拉尼甘/Bianca Bree
主演:艾斯?库珀/ 查宁?塔图姆/ 乔纳?希尔
baby14岁写真曝光
李冰冰向成龙撒娇争宠
李湘遭闺蜜曝光旧爱
美女模特教老板走秀
曝搬砖男神奇葩择偶观
柳岩被迫成赚钱工具
大屁小P虐心恋
匆匆那年大结局
乔杉遭粉丝骚扰
男闺蜜的尴尬初夜
客服热线:86-10-
客服邮箱:今天看啥 热点:
Android Studio Gradle 多渠道打包,androidgradle
之前集成UMeng提供的一些服务时接触过多渠道打包,UMeng要根据各应用市场渠道号来进行一些统计和分析,比如各渠道的下载数、活跃度、自动更新等等。UMeng提供了一个打包工具(这里),但官方很久没有更新了,自己也切换到Android
Studio IDE上,Gradle插件可以很好的实现多渠道打包的需求。
多渠道打包的大概思想是(针对UMeng): 动态的更改AndroidManifest.xml文件中的一个属性值(渠道号),从而来标识不同的渠道。
Gradle的Product flavors特性(这里)可以很方便的实现功能,简单的说下实现方式:不同的flavor指定不同渠道的AndroidManifest.xml文件。这种方式有很大的弊端,重复性工作太多了,只为了更改其中的一个属性而要维护太多的AndroidManifest.xml文件。可喜的是Android
Studio 1.0 提供了更强大的Manifest Merger(这里)功能,其中的Placehodler Support(这里)特性可以大大的简化上面的做法,不需要再维护这么多的AndroidManifest.xml文件了!但把所有的渠道都配置在build.gradle文件中毕竟不好维护(应用市场多达几十个),下面主要介绍通过程序的方式来读取配置文件,生成不同的渠道包。
通过程序的方式也要借助于Placehodler Support特性,所以Android Studio请升级到1.0以上。
具体的思路是通过读取配置文件中的渠道号来动态的生成build type。具体的代码如下:
// 多渠道打包
def channels() {
if (project.hasProperty(&channel&)) {
// 渠道号配置文件路径
def path = &./build-types/channels.txt&
file(path).eachLine { line -&
if(!line.startsWith(&//&)){ //剔除注释行
android.buildTypes.create(line, {
manifestPlaceholders = [ channel:line ]
AndroidManifest.xml文件更改如下:
&?xml version=&1.0& encoding=&utf-8&?&
&manifest xmlns:android=&/apk/res/android&
package=&com.tubb.cityindex& &
&application
android:allowBackup=&true&
android:icon=&@drawable/ic_launcher&
android:label=&@string/app_name&
android:theme=&@style/AppTheme& &
android:name=&com.tubb.cityindex.CitySelectorActivity&
android:label=&@string/app_name& &
&intent-filter&&meta-data android:name=&UMENG_CHANNEL& android:value=&${channel}&/&
&/application&
&/manifest&
最后只需要在工程app目录下现在build-types文件夹添加channels配置文件
// 百度应用市场
// 360应用市场
测试代码托管在(这里),欢迎大伙来讨论~~
相关搜索:
相关阅读:
相关频道:
Android教程最近更新android打包
& & & &最近一直在做android自动打包,之前已经完成了用纯命令行的形式打包、原生态ant脚本打包,和基于android的SDK的打包,并且实现了多渠道打包,后来同事推荐了gradle,网上的资料说gradle各种好,自己也感兴趣是实现一下,其实一般来说由于android对eclipse的支持减弱,大部分的人都是用gradle与android studio融合,这样面的例子也会比较多,但笔者所在的项目还是在eclipse的比较多,由于开发人员在移植过程中发现报错比较多所以一直没有完全移植(好吧,其实早晚会移植),所以笔者是用eclipse的IDE做的实验,下面先贴几个基础知识
& & &首先是新建一个android项目,然后用自带的IDE生成gradle文件,具体参考http://blog.csdn.net/x/article/details/,有兴趣的同志们可以采取纯手写的方式,这种方式可以不依赖IDE,所以会比较好
& 这个是原始的build.gradlebuildscript {
repositories {
mavenCentral()
dependencies {
classpath 'com.android.tools.build:gradle:0.8.+'
apply plugin: 'android'
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compileSdkVersion 19
buildToolsVersion &19.0.3&
sourceSets {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
// Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot('tests')
// Move the build types to build-types/&type&
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/&type&/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
下面我先附上自己的build.gradle
buildscript {
repositories {
mavenCentral()
dependencies {
classpath 'com.android.tools.build:gradle:0.12.+'
apply plugin: 'android'
ant.importBuild 'build.xml'
//这里导入了ant的脚本
dependencies {
compile fileTree(dir: 'libs', include: '*.jar')
compileSdkVersion 19
buildToolsVersion &20.0.0&
signingConfigs {
//签名,这里的文件名和密码是错的,后面还会有从外部导入的语句
myConfig {
//绝对路径和相对路径都可以
storeFile file(&E:\\keystore\\mydemo.keystore&)
//签名文件
storePassword &&
keyAlias &mydemo.keystore&
keyPassword &111&
buildTypes{
//这里就是用来生成apk的步骤,具体看备注
//1.添加签名
signingConfig
signingConfigs.myConfig
//2.runProguard 执行混淆代码
runProguard true
//混淆规则文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
productFlavors {
//这里是多渠道的地方,AndroidManifest.xml文件里面要有标示,下面会贴文件
yingyongbao {
manifestPlaceholders = [ CHANNEL_NAME:&YINGYONGBAO&]
manifestPlaceholders = [ CHANNEL_NAME:&UMENG& ]
wandoujia {
manifestPlaceholders = [ CHANNEL_NAME:&WANDOUJIA& ]
allprojects {
//在这里是外部导入文件,然后更改本身文件的属性,这里只改了签名,还可以改其他的
afterEvaluate { project -&
def propsFile = rootProject.file('E:\\keystore\\keystore.properties')
def configName = 'myConfig'
if (propsFile.exists() && android.signingConfigs.hasProperty(configName)) {
def props = new Properties()
props.load(new FileInputStream(propsFile))
android.signingConfigs[configName].storeFile = file(props['storeFile'])
android.signingConfigs[configName].storePassword = props['storePassword']
android.signingConfigs[configName].keyAlias = props['keyAlias']
android.signingConfigs[configName].keyPassword = props['keyPassword']
sourceSets {
manifest.srcFile 'AndroidManifest.xml'
java.srcDirs = ['src']
resources.srcDirs = ['src']
aidl.srcDirs = ['src']
renderscript.srcDirs = ['src']
res.srcDirs = ['res']
assets.srcDirs = ['assets']
// Move the tests to tests/java, tests/res, etc...
instrumentTest.setRoot('tests')
// Move the build types to build-types/&type&
// For instance, build-types/debug/java, build-types/debug/AndroidManifest.xml, ...
// This moves them out of them default location under src/&type&/... which would
// conflict with src/ being used by the main source set.
// Adding new build types or product flavors should be accompanied
// by a similar customization.
debug.setRoot('build-types/debug')
release.setRoot('build-types/release')
}这里的具体功能看备注就可以了,暴力的贴上去就没问题,下面要贴几个文件,一个是AndroidManifest.xml文件,里面就是加了一行
&meta-data
android:name=&UMENG_CHANNEL&
android:value=&${CHANNEL_NAME}& /&build.xml添加了一个target,用cmd命令写gradle deploy就可以执行里面的内容了
&target name=&deploy&&
&replaceregexp flags=&g& byline=&true&&
&regexp pattern=&public static final Host host = Host.D& /&
substitution expression 中是替换的值,替换的值都定义在相对应的配置文件中
&substitution expression=&public static final Host host = Host.T& /&
fileset 属性中的 dir 用来指定被替换文件所在的目录
includes 用来指定要替换哪个文件。
&fileset dir=&./src/net/xtion/crm/base& includes=&CrmAppContext.java& /&
&/replaceregexp& --&
&replace encoding=&utf-8& dir=&./src/com/example/learn723&&
&include name=&MainActivity.java& /&
&replacefilter token=&public static final String host = &Host.Test&;& value=&public static final String host = &Host.abc&;& /&
&/replace&
还有一个签名文件
storeFile=E:\\keystore\\mydemo.keystore
storePassword=
keyPassword=
keyAlias=mydemo.keystore
具体demo可以在这下载
http://download.csdn.net/detail/killer
这样的好处我们可以看到,用ant专职改文件的信息,这里专门做多渠道的打包,可以分开,其实要做到全自动还有两步,一个是从svn自动获取,这个网上有很多的版本可以学习,另一个是用脚本修改build.gradle文件,动态变换签名(其实也可以做批量修改)和动态增加这些功能的代码,可以用shell,可以用python,各位用需要可以试一下
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:12690次
排名:千里之外
原创:24篇
转载:24篇
(3)(10)(25)(10)

我要回帖

更多关于 android 多渠道打包 的文章

 

随机推荐