有没有类似android打包多渠道打包的方法

Android 多渠道打包(同一个工程不同包名,不同服务器地址等) - 简书
Android 多渠道打包(同一个工程不同包名,不同服务器地址等)
二、应用场景
1、一个APP针对多个应用市场,需要在不同应用市场看日活啊等等的
2、同一个工程代码,但是需要用到不同的省市区、挂在不同的服务器下面,等于多个有一样功能但又互相独立的APP,可以多个同时安装在手机上面
三、效果图
yourapp.png
四、实例:以应用场景2作为案例
1、app/build.gradle 文件的修改,增加:productFlavors
1.1、defaultConfig注释掉原本的applicationId,不然会和多渠道内的包名有冲突
1.2、versionCode和versionName也可以配置进productFlavors中去,不多说
1.3、buildTypes暂时就用默认的
1.4、productFlavors下一般有这几部分组成
applicationId
某个取到的应用包名
针对资源文件,包含string.xml等,注意两点,(1)keyname一定要有且一致
(2)原本main目录下的keyname注释掉,分别增加多渠道通道的资源文件库,后面会截图显示
buildConfigField
自动建立BuildConfig文件中的动态常量,注意String值的话是‘ “ xxx ” ’这样的格式
manifestPlaceholders
清单文件里可动态替换的内容,这里一般由打包的apk名字,还有fileprovider等等,还有各种第三方key,比如友盟,极光推送等等
1.5、学习几个英语单词,加深理解
变体 - 所以应该叫‘多变体打包’--好难听
特点 - 变体的特点/渠道的特点--就是需要替换的动态常量
渠道 - 这个才是渠道吗~~AS里完全没有,但是好听呀
apply plugin: 'com.android.application'
compileSdkVersion 26
buildToolsVersion "26.0.2"
defaultConfig {
//因为多渠道已经有包名了,此处注释掉
//applicationId "com.flavor.test.flavortestapp"
minSdkVersion 14
targetSdkVersion 26
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//默认的,会有release和隐藏的debug
buildTypes {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
* 多渠道打包
* 1、applicationId
= 软件-包名
* 2、app_name
= 资源文件string.xml下的,需要建立不同的res目录
* 3、BASE_SERVER_URL
= 基础服务器地址,在自动创建BuildConfig下
* 4、APP_File_Provider
= 文件provider,一般是包名+fileprovider命名
* 5、其他所需要配置的百度Key,极光推送key,友盟key等等...
productFlavors {
applicationId "com.flavor.myapp"
resValue "string", "app_name", "APP-我的"
buildConfigField "String"
, "APP_File_Provider"
, '"com.flavor.myapp.fileprovider"'
buildConfigField "String"
, "BASE_SERVER_URL"
, '"http://my/app/"'
//manifest里面的值
manifestPlaceholders = [
MTA_CHANNEL_VALUE
: "my_app",
FILE_PROVIDER
: "com.flavor.myapp.fileprovider" ]
applicationId "com.flavor.yourapp"
resValue "string", "app_name", "APP-你的"
buildConfigField "String"
, "APP_File_Provider"
, '"com.flavor.yourapp.fileprovider"'
buildConfigField "String"
, "BASE_SERVER_URL"
, '"http://your/app/"'
//manifest里面的值
manifestPlaceholders = [
MTA_CHANNEL_VALUE
: "your_app",
FILE_PROVIDER
: "com.flavor.yourapp.fileprovider" ]
* 打包导出apk时候的名字,或者各种服务的key配置等等
applicationVariants.all { variant -&
variant.outputs.each { output -&
def outputFile = output.outputFile
//如果打包release版本,则包名为
xx取到.apk
if (variant.buildType.name.equals('release')) {
def fileName = "Channel${defaultConfig.versionName}_${variant.productFlavors[0].name}"+releaseTime()+".apk"
output.outputFile = new File(outputFile.parent, fileName)
//打包时间
def releaseTime() {
return new Date().format("yyyy-MM-dd", TimeZone.getTimeZone("UTC"))
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
compile 'com.android.support:appcompat-v7:26.+'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
2、需要修改的工程目录和调试
这里my_app和your_app目录下的mipmap和values分别就改了唯一需要动态改变的图片和值,比如string.xml下的app_name,原本main下values中string.xml的app_name注释掉
&resources&
&string name="app_name"&APP-你的&/string&
&/resources&
3、清单文件
manifest.png
不忘初心,方得始终。念念不忘,必有回响。
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
最近在项目中遇到需要实现 Apk 多渠道、定制化打包, Google 、百度查找了一些资料,成功实现了上述功能,在此记录以备不时之需,温故而知新,可以为师矣~ 需求可以总结如下: 如何实现多个 Apk 安装在同一设备 在之前的印象中,同一个应用在同一设备上只能安装一个,除非...
写这篇文章主要是因为,公司的项目对打包有多重需求,有哪些需求呢?1.多渠道,这是最基本的;2.分为3个版本(内地版,海外版,精简版),每个版本包名不同(这就意味着第三方sdk的各种key都不一样),且logo,部分图标也不一样;3.开发版本的区别,分为debug版,pre预...
二战的背景 第一次世界大战结束后的20年间,资本主义各国经济政治力量发展极不平衡,德国和日本的工业发展比较突出,经济实力明显增长;英、法、美等国则先后出现停滞局面。1929年和1937年,资本主义世界发生两次严重的经济危机,更激化了帝国主义之间的矛盾,逐渐形成美、英、法和德...
要记住,生活的丧气都是别人造成的, 噢,还有你并不怎么厉害的爸妈。 永远是那条未选择的路,恰好能让你走上人生巅峰 当决定错误时,一定要把责任推在当初给你出主意的人 即使清楚的意识到自己做错了,也不要承认,那岂不是太丢脸了 集体协作中,别人都懒得做的事,你也不要做。才不能成为...
今天是15天行动营的第二天,今天读的是知乎大v采铜写的《精进——如何更为更厉害的人》。光名字就非常吸引人。以下是十点感悟: 001 做半衰期更长的事 看电视刷手机固然可以带给我们一时的欢愉,但这欢愉一闪而过。做半衰期更长的事,如学习新技能、构建新思维,能够让单位时间的效用无...
大学毕业了,接下来怎么办?毫无疑问,就是该工作了。说得文雅点,这是人生由一味索取到做出社会奉献的重要转变;说得现实点,这是养活自己、自我谋生的必由之路。 很多人在找工作的过程中都会屡屡受挫,但却总是找不到原因。究竟是面试官太苛刻,还是自己在面试过程中的表现出现了问题?下面这...
吾家有女,年方二八(加法)。亭亭玉立,貌美如花。相貌像爹,智商如妈。校园内外,人缘颇好。老师同学,关爱有嘉。无忧无虑,像个傻瓜。 粑粑说:“女儿的嫁妆我已经准备好,只等识货的女婿了!” 麻麻大有兴趣:“请问老岳父给女儿准备的什么嫁妆啊?还有,你是嫁女儿呢还是倒贴嫁妆免费赠送...2添加评论分享收藏感谢收起谈谈我的Android多渠道打包方式
每当发新版本时,Android客户端会被分发到各个应用市场,比如应用宝,360手机助手,小米应用市场等。为了统计这些市场的效果(活跃数,下单数等),需要有一种方法来唯一标识它们。
给每一个应用市场设置一个channel ID,用来区分不同的应用市场;客户端访问API时会在请求参数中带上渠道号和设备信息,以便后台接下来计算不同渠道的效果。
根据渠道列表,在每次发版时,都会打包相对应的渠道包发布到对应的应用市场,下面是我项目中使用到的方式和一些工具。
gradle自带的productFlavor方式
在AndroidManifest.xml的& application &节点中添加如下& meta-data &元素,用来定义渠道的来源:
android:name="CHANNEL"
android:value="${CHANNEL_VALUE}" /&
在app对应的build.gradle中配置productFlavor:
defaultConfig {
manifestPlaceholders = [CHANNEL_VALUE: "x2"]
productFlavors {
productFlavors.all {
flavor -& flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
输出的APK文件名格式(可选项):
android.applicationVariants.all { variant -&
variant.outputs.each { output -&
def outputFile = output.outputFile
if (outputFile != null && outputFile.name.endsWith('.apk')) {
File outputDirectory = new File(outputFile.parent);
def fileName
if (variant.buildType.name == "release") {
fileName = "lrzm${variant.productFlavors[0].name}.apk"
fileName = "lrzm${variant.productFlavors[0].name}_beta.apk"
output.outputFile = new File(outputDirectory, fileName)
app下build.gradle配置截图:
配置就完成了,遍历渠道列表,逐个替换并打包:
程序启动时读取渠道号:
private String getChannel(Context context) {
PackageManager pm = context.getPackageManager();
ApplicationInfo appInfo = pm.getApplicationInfo(context.getPackageName(), PackageManager.GET_META_DATA);
return appInfo.metaData.getString("CHANNEL");
} catch (PackageManager.NameNotFoundException ignored) {
return "";
简直就是神器,作者说 【100个渠道包只需10秒】。其实真的有这么快!
修改项目根目录的 build.gradle :
buildscript {
repositories {
mavenCentral()
dependencies{
classpath 'com.mcxiaoke.gradle:packer:1.0.+'
修改Android项目的 build.gradle :
apply plugin: 'packer'
创建多渠道文件markets.txt
渠道打包的命令行参数格式示例(在项目根目录执行):
./gradlew -Pmarket=markets.txt clean archiveApkRelease
其他配置可参考github上的使用说明。
最后打包运行:
速度就比打包单个apk慢一点点,看下结果:
输出的名字有进行了配置,所以apk的名字很长。
archiveNameFormat = ‘${appPkg}-${flavorName}-${buildType}-v${versionName}-${versionCode}-${fileMD5}’
在使用这两个工具加固应用,他们都有多渠道打包这个辅助功能,貌似360加固保多渠道支持的多一些。
对于多渠道打包,如果能直接修改apk的渠道号,而不需要再重新签名能节省不少打包的时间。幸运的是我们找到了这种方法。直接解压apk,解压后的根目录会有一个META-INF目录,如下图所示:
如果在META-INF目录内添加空文件,可以不用重新签名应用。因此,通过为不同渠道的应用添加不同的空文件,可以唯一标识一个渠道。
也看来很多相关的文章,目前推荐还是Packer-Ng方式,节省不少的时间,可以玩玩!
腾讯乐固的加固和多渠道打包客户端配置
Android多渠道打包以及分发策略
Android多渠道打包两种方式(带秒速打包)
分享两种最简单的Android打渠道包的方法
android中的两种打包方式,及多渠道打包
Android多渠道打包三种方式
android中多渠道打包的三种方式
Android多渠道打包(四):360多渠道打包
没有更多推荐了,以友盟统计为例。
在AndroidManifest.xml文件中声明channel信息,如下。
&meta-data
android:name="UMENG_APPKEY"
android:value="产品的APPKEY" /&
&meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" /&
在主module下的build.gradle文件中android节点下配置productFlavors,如下。
productFlavors {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "fir"]
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"]
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "91"]
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "hiapk"]
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "tqq"]
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
**上面的fir、_360、baidu, _91等是Flavor名称,双引号里面的fir、360、baidu、91等是渠道名称。**
最后可以 在android节点下的buildTypes节点下指定输出APK的文件名。
比如要输出文件名格式为“ipgw_4.2.5_fir.apk”,其中,ipgw为产品名称,4.2.5为版本名称,fir为渠道名称,各部分之间用下划线分割。
代码片段如下:
applicationVariants.all {
variant -&
variant.outputs.each {
def outFile = output.outputFile
if (outFile != null && outFile.name.endsWith(".apk")) {
def fileName = "ipgw_4.2.5_${variant.productFlavors[0].name.replaceAll("_", "")}.apk"
output.outputFile = new File(outFile.parent, fileName)
到此,配置就算完成了。
点击Android Studio菜单栏中的“Build”,选择“Generate Signed APK...”,选择keystore,输入密码等,点击“Next”,出现渠道选择界面,如下图。
此处可以选择需要打包的渠道,当然也可以按Ctrl + A全选。
点击Finish开始打包。
打包完成之后,在工程的主模块目录下就可以看到已经经过 打包、签名、命名 好的APK文件了,如下图所示。
阅读(...) 评论()

我要回帖

更多关于 android打包流程 的文章

 

随机推荐