apk多渠道打包(android 渠道包)
apk多渠道打包(android 渠道包),本文通过数据整理汇集了apk多渠道打包(android 渠道包)相关信息,下面一起看看。
在平时的机器人开发中,我们经常会遇到在不同网络环境(比如:开发环境、测试环境)之间的切换、一次打多个渠道包等需求,如何优雅的管理网络环境的配置?如何快速的打出多个渠道包?这是一个值得研究的问题。
如果每一次在不同网络环境间切换,都需要更改代码,然而重新打包,那未免有点低效。下面是我的实践探索,看网上很多人都是根据构建类型来切换网络环境,感觉有点不好,因为网络环境可能很多种,而构建类型我们一般是2种,而且,不同网络环境的包最好能同时安装在手机上,以便我们调试。最好,我一看这个包的名称和图标,就能知道这是什么环境的包。
一、概述
1.多版本
基于构建类型
(1)调试:调试版本,无混淆
(2)发布:发布版本,有混淆、压缩
2.多环境
基于产品风味
(1)开发:开发环境,开发和自测时使用
(2)检查:测试环境,克隆一份生产环境的配置,在这里测试通过后,再发布到生产环境。
之所以没命名为试验是因为在格拉德勒编译时:产品风味名称不能以“测试”开头
(3)产品:生产环境,正式提供服务的。
3.多渠道
基于机器人新的应用签名方案APK签名方案v2中的APK签名区区块
我这里使用的是美团封装的沃勒库。使用沃勒库请确保你的Android Gradle插件版本在2.2.0以上。
为什么不直接使用产品风味来打包多渠道?因为产品风味打多渠道包太慢了,打30个包差不多十几分钟,无法忍受!
为什么不使用美团之前基于元信息进行渠道标识的方案?因为安卓7.0之后的这种黑科技已经失效了!
二、示例
1、配置build.gradle
(1) 在位于项目的根目录build.gradle文件中添加瓦尔格拉德勒插件的依赖,如下:
构建脚本{
依赖关系{
类路径'com。安卓。工具。构建:gradle:2。2 .3 '
类路径'com。美团。安卓。瓦力:插件:1。0 .3 '
}
}
(2) 在当前应用的build.gradle文件中应用这个插件,并添加上用于读取渠道号的碱集料反应
应用插件:" com.android.application "
应用插件:" walle "
android {
编译版本25
buildToolsVersion & # 03925.0.2 '
defaultConfig {
minSdkVersion 15
目标版本25
版本代码一
版本名称'1.0 '
testInstrumentationRunner & # 039;安卓。支持。测试。奔跑者。androidjunitrunner & # 039
}
签名配置{
发布{
keyAlias KEY_ALIAS
密钥密码
存储文件根项目。文件(密钥库文件)
存储密码密钥库_密码
}
}
构建类型{
//调试版本,无混淆
调试{
minifyEnabled false
签名配置签名配置。版本
}
//发布版本,有混淆
发布{
minifyEnabled true
zipAlignEnabled true
shrinkResources true
签名配置签名配置。版本
proguardFiles getDefaultProguardFile(& # 039;proguard-Android。txt & # 039),'proguard-rules . pro & # 039;
}
}
产品风味{
//开发环境
开发{
buildConfigField & # 039int & # 039,'ENV _ TYPE & # 039,'1 '
应用程序id & # 039嗯。苏布。walle演示。发展& # 039;
清单占位符=[
'应用程序名称: '开-瓦莱德莫,
app _ icon:& # 039;@ drawable/icon _ develop & # 039;
]
}
//测试环境
检查{
buildConfigField & # 039int & # 039,'ENV _ TYPE & # 039,'2 '
应用程序id & # 039嗯。苏布。walle演示。检查& # 039;
清单占位符=[
'应用程序名称: '测-瓦莱德莫,
app _ icon:& # 039;@ drawable/icon _ check & # 039;
]
}
//生产环境
产品{
buildConfigField & # 039int & # 039,'ENV _ TYPE & # 039,'3 '
应用程序id & # 039com。苏布。walle演示。产品& # 039;
清单占位符=[
app _ name:& # 039;WalleDemo & # 039,
app _ icon:& # 039;@ drawable/icon _ product & # 039;
]
}
}
}
依赖关系{
编译文件树(目录:'libs & # 039,包含:['*。jar & # 039])
Android测试编译(& # 039;com。安卓。支持。测试。浓缩咖啡:浓缩咖啡核心:2。2 .2 '{
排除群组:'com . Android . support & # 039;模组:'支持-注释& # 039;
})
编译“通讯器。安卓。支持:app compat-V7:25。1 .0"
测试编译" junit:junit:4.12 "
编译“通讯器。美团。安卓。walle:图书馆:1。0 .3"
}
(3) 这里,我根据不同的环境生成了不同包名的apk,方便在手机上同时安装多个环境的应用。为了让格拉德勒动态更改apk的名称和图标,我们需要在显示文件中使用
{app_name}等占位符
?可扩展标记语言版本='1.0 '编码='utf-8 & # 039;
package=& # 039com . soubu . walle demo & # 039;
Android:allow backup=& # 039;真& # 039;
Android:icon=& # 039;$ { app _ icon } & # 039
Android:label=& # 039;$ { app _ name } & # 039
Android:supports RTL=& # 039;真& # 039;
Android:theme=& # 039;@ style/app theme & # 039;
(4) 在代码中获取多渠道信息
string channel=wallechanneleader。获取通道(getApplicationContext());
(5) 在代码中获取多环境信息
int envType=BuildConfig .环境类型
这里的构建配置是由格拉德勒动态生成的:
包com。苏布。walle demo
公共最终类构建配置{
公共静态最终布尔调试=布尔。解析布尔值(& # 039;真& # 039;);
公共静态最终字符串APPLICATION _ ID=& # 039嗯。苏布。walle演示。发展& # 039;
公共静态最终字符串BUILD _ TYPE=& # 039调试
public static final String FLAVOR=& # 039;发展& # 039;
public static final int VERSION _ CODE=1;
公共静态最终字符串VERSION _ NAME=" 1.0
//产品风味字段:开发
公共静态final int ENV _ TYPE=1;
}
而环境类型这个字段其实就来自于我们的build.gradle:
产品风味{
//开发环境
开发{
buildConfigField & # 039int & # 039,'ENV _ TYPE & # 039,'1 '
应用程序id & # 039嗯。苏布。walle演示。发展& # 039;
清单占位符=[
'应用程序名称: '开-瓦莱德莫,
app _ icon:& # 039;@ drawable/icon _ develop & # 039;
]
}
{
这里我们最好定义一个常量类区分这些环境的类型:
公共类EnvType {
public static final int DEVELOP=1;//开发环境
公共静态最终int CHECK=2;//测试环境
公共静态最终(同Internationalorganizations)国际组织乘积=3;//正式环境
}
2、打包多环境
这里我们直接执行装配命令,打包所有的buildType*productFlavors
或者使用命令行也可以:
梯度组装
执行结果:26秒搞定6个包:2个版本*3个环境
这里我们可以看到调试包都是1.4M,而释放;排放;发布包都是0.7M,显然,我们的混淆和压缩配置是生效了的,虽然这里我并没写混淆规则
我们分别安装3个环境的包到自己的手机上:
看三个包的名称和图标都不一样,显然我们之前在显示文件中配置的占位符生效了。
然后我们点进去分别看看这3个应用的区别:
这样,我们就可以在代码中,根据环境字段envType的不同,来选择不同的网络环境了。
界面的代码如下:
公共类主要活动扩展AppCompatActivity {
@覆盖
受保护的void onCreate(Bundle saved instancestate){
超级棒。oncreate(savedInstanceState);
setContentView(r . layout。活动_主);
TextView tvEnv=(TextView)findViewById(r . id。TV _ env);
TextView TV channel=(TextView)findViewById(r . id。TV _ channel);
TextView TV package=(TextView)findViewById(r . id。TV _ package);
string channel=wallechannelreader。获取通道(此。getapplicationcontext());
int envType=BuildConfig .环境类型
string包名=get包名();
开关(环境类型){
案例环境类型。开发:
tvenv . settext(& # 039;envType=& # 039)开发环境');
打破;
案例环境类型。检查:
tvenv . settext(& # 039;envType=& # 039)测试环境');
打破;
案例环境类型。产品:
tvenv . settext(& # 039;envType=& # 039)生产环境');
打破;
}
电视频道。settext(& # 039;channel=& # 039渠道);
电视套餐。settext(& # 039;package=& # 039包名);
}
}
3、打包多渠道
在项目的根目录下新建频道文件:
安智#安智
百度#百度
华为#华为
oppo #oppo
wdj #豌豆荚
小米#小米
yyb #应用宝
执行格拉德勒命令:
(1) 打包文件内的渠道包
分级装配产品发布-PchannelFile=channel
(2) 打包自定义数组内的渠道包
gradle装配产品发布-PchannelList=胡琦、vivo、联想
关于沃勒库的更多使用:详见Github-walle
运行结果:17秒搞定8个包:1个默认包七个渠道包
最后,奉上源码:WalleDemo
常见问题
1、找不到签名文件的配置?
汗,因为我的演示中并没有上传我的jks文件,你可以添加自己的jks文件,然后在gradle.properties里面配置好签名文件的密码即可
在gradle.properties中添加签名文件的配置键值
引用build.gradle中配置的密钥
2.开发、检查和生产。如果直接运行代码,如何设置默认环境?
点击AndroidStudio左下角的BuildVariants,然后选择设置默认运行环境。
build variants=build types * product flavors
文末送福利!
同时,经过多年的收集,我收集了一套完整的学习资料,还有高清详细的Android架构进阶学习图和笔记免费分享,希望能给想成为架构师的朋友提供一些参考和帮助。
* *以下是部分资料截图,诚意满满:特别适合有开发经验的Android程序员学习。
更多apk多渠道打包(android 渠道包)相关信息请关注本站。