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 渠道包)相关信息请关注本站。