前言:

关于Android渠道打包是一个比较老的话题,今天主要记录总结一下多渠道打包以及如果动态配置修改一些资源属性。今天以公司实际需求为例进行演示,由于项目复用很多公共的业务组件,而且业务组件之间的跳转采用Scheme协议,每个业务组件的host地址不变,所以需要在打包的时候动态修改scheme协议名字。为了方便举例,首先我们这里假设我们一个App要打出两个不同的渠道,方便进行数据统计。

第一步声明一个渠道参数 AndroidManifest.xml中

<meta-data
android:name="APP_CHANNEL"
android:value="external" />

为了方便通过gradle自动替换,value需要替换成标记位的方式

 <meta-data
android:name="APP_CHANNEL"
android:value="${APP_CHANNEL}" />

第二步在gradle中利用productFlavors声明渠道类型,

比如我们这里声明一个外部版本一个内部版本,manifestPlaceholders 替换AndroidManifest中的${APP_CHANNEL}值

    productFlavors {
external {
manifestPlaceholders = [APP_CHANNEL: "external"]
}
internal {
manifestPlaceholders = [APP_CHANNEL: "internal"]
}
}

上面的也可以修改成批量处理方式

    productFlavors {
external {}
internal {}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [APP_CHANNEL: name]
}
}

第三步重新build项目会生成build选项,如下图所示:

打包的话可以通过在android studio底栏中有个命令行工具Terminal,例如打包所有渠道可以执行下面的命令

gradlew assembleRelease

如果要打指定渠道的话,可以执行下面的命令,例如要打external外部版本

gradle assembleExternalRelease

也可以通过gradle projects里面生成的命令选项进行打包,生成的选项如图所示:

第四步修改生成渠道包文件名

buildTypes {
release {
//混淆
minifyEnabled false
//是否压缩对齐
zipAlignEnabled true
//清除不用的资源
shrinkResources false
//混淆脚本路径
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt'
signingConfig signingConfigs.releaseConfig
//自定义apk名字
applicationVariants.all { variant ->
variant.outputs.each { output ->
output.outputFile = new File(
output.outputFile.parent,
"${applicationId}-${variant.productFlavors[0].name}-${versionName}-${releaseTime()}.apk".toLowerCase())
}
}
}
debug {
//debug时候也采用正式签名文件
signingConfig signingConfigs.releaseConfig
}
}
}

第五步定制app scheme地址

根据上面的渠道替换原理,只需添加一个scheme标记即可

<activity
android:name=".GoodsDetailActivity"
android:theme="@style/AppTheme">
<!--要想在别的App上能成功调起App,必须添加intent过滤器-->
<intent-filter>
<!--协议部分,随便设置-->
<data
android:host="goods"
android:path="/goodsDetail"
android:port="8888"
android:scheme="${myScheme}"/>
<!--下面这几行也必须得设置-->
<category android:name="android.intent.category.DEFAULT"/>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
</intent-filter>
</activity>

在gradle中添加替换

  manifestPlaceholders = [
myScheme: "XApp",
]

替换指定属性,比如颜色值,使用如下代码

  resValue  "color", "app_theme_color", "#283146"

总结:

根据多渠道打包的原理来实现定制特定需要的app包。

Android学习探索之App多渠道打包及动态添加修改资源属性的更多相关文章

  1. APP多渠道打包

    多渠道打包的概念: 打包是指使用证书文件对app签名生成一个apk文件. 多渠道打包指的就是我们的app在开发完成之后需要投放到不同的市场,比如说Google市场.百度市场等,为了统计应用在各个市场的 ...

  2. Android学习系列(37)--App调试内存泄露之Context篇(下)

    接着<Android学习系列(36)--App调试内存泄露之Context篇(上)>继续分析. 5. AsyncTask对象 我N年前去盛大面过一次试,当时面试官极力推荐我使用AsyncT ...

  3. Android学习系列(7)--App轮询服务器消息

    这篇文章是android开发人员的必备知识. 1.轮询服务器     一般的应用,定时通知消息可以采用轮询的方法从服务器拿取消息,当然实时消息通知的话,建议采用推送服务.    其中需要注意轮询的频率 ...

  4. Android学习系列(15)--App列表之游标ListView(索引ListView)

    游标ListView,提供索引标签,使用户能够快速定位列表项.      也可以叫索引ListView,有的人称也为Tweaked ListView,可能更形象些吧.      一看图啥都懂了: 1. ...

  5. Android学习系列(23)--App主界面实现

    在上篇文章<Android学习系列(22)--App主界面比较>中我们浅略的分析了几个主界面布局,选了一个最大众化的经典布局.今天我们就这个经典布局,用代码具体的实现它. 1.预览图先看下 ...

  6. Android学习系列(17)--App列表之圆角ListView(续)

    http://www.cnblogs.com/qianxudetianxia/archive/2011/09/19/2068760.html   本来这篇文章想并到上篇Android学习系列(16)- ...

  7. Android学习系列(18)--App工程结构搭建

     本文算是一篇漫谈,谈一谈关于Android开发中工程初始化的时候如何在初期我们就能搭建一个好的架构.      关于android架构,因为手机的限制,目前我觉得也确实没什么大谈特谈的,但是从开发的 ...

  8. Android学习系列(11)--App列表之拖拽ListView(下)

    接着上篇Android学习系列(10)--App列表之拖拽ListView(上)我们继续实现ListView的拖拽效果. 7.重写onTouchEvent()方法.     在这个方法中我们主要是处理 ...

  9. Android学习系列(10)--App列表之拖拽ListView(上)

     研究了很久的拖拽ListView的实现,受益良多,特此与尔共飨.      鉴于这部分内容网上的资料少而简陋,而具体的实现过程或许对大家才有帮助,为了详尽而不失真,我们一步一步分析,分成两篇文章. ...

随机推荐

  1. Rookey.Frame v1.0极速开发平台稳定版发布

    Rookey.Frame v1.0经过一年时间的修改及沉淀,稳定版终于问世了,此版本经过上线系统验证,各个功能点都经过终端用户验证并持续优化,主要优化以下几个方面: 1.性能较原来提升3倍之多 2.修 ...

  2. 【HDOJ 2150】线段交叉问题

    Pipe Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submissi ...

  3. 深入tornado中的IOStream

    IOStream对tornado的高效起了很大的作用,他封装了socket的非阻塞IO的读写操作.大体上可以这么说,当连接建立后,服务端与客户端的请求响应都是基于IOStream的,也就是说:IOSt ...

  4. 告别findViewById(),ButterKnife,使用Google Data Binding Library(1)

    Data Binding Library 用数据绑定编写声名性布局,可以最大限度的减少findViewById(),setOnClickListener()之类的代码.并且比起findViewById ...

  5. python在cmd上导包成功,但是python charm上面就提示找不到

    失败 成功 原因:我的python file名称和numpy 的名字一样了,把python file 的名字改了就好了

  6. Let's Encrypt: 为CentOS/RHEL 7下的nginx安装https支持-具体案例

    环境说明: centos 7 nginx 1.10.2 前期准备 软件安装 yum install -y epel-release yum install -y certbot 创建目录及链接 方法1 ...

  7. OpenCV 玩九宫格数独(二):knn 数字识别

    欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:刘潇龙 前言 首先需要说明,这里所说的数字识别不是手写数字识别! 但凡对机器学习有所了解的人,相信看到数 ...

  8. 针对Mac的DuckHunter攻击演示

    0x00 HID 攻击 HID是Human Interface Device的缩写,也就是人机交互设备,说通俗一点,HID设备一般指的是键盘.鼠标等等这一类用于为计算机提供数据输入的设备. DuckH ...

  9. Yii2框架---GII自动生成

    本地环境配置完成后.访问路径直接加上/gii 例如 localhost/gii 即可生成YII活动记录类 即可生成模块

  10. jmeter导入DB数据再再优化

    前言:分享和规定命名规范后,各位测试人员一致认为这样jmeter的jmx文件限制太死,主要体现六方面: 第一:规定了一个jmx文件只能录入一个接口,这样会导致jmx文件很多 第二:导入DB的jmx文件 ...