title: Android 软件打包
date: 2016-04-09 12:18:12
tags: 软件打包
category: Android
0 软件包的数字签名
- 公钥、私钥
- 使用私钥对软件包进行签名,并且在软件包中包含公钥,Android手机就能够在安装软件的时候,进行软件有效性的检查,检查软件是否被非法篡改。
keystore 生成
1
2
3
4
5
将 keystore加入到软件中
6
7
之后debug模式和release模式都是用这个keystore,或者两个申请不同的接口
1 Gradle UMeng 多渠道打包
修改 AndroidManifest.xml 里配置 (PlaceHolder)
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
在 build.gradle 设置 productFlavors
android {
...
productFlavors {
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
_360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "_360"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}
...
}
...
}
或者批量修改:
android {
productFlavors {
xiaomi {}
_360 {}
baidu {}
wandoujia {}
}
productFlavors.all {
flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
}
解释:productFlavors 类似于一个产品的不同特性的配置[2]. productFlavors.all 是一个遍历,每一个 productFlavors 中的值,其中productFlavors 的每一个值都有一个 name ,就是类似 wandoujia 这样的字符,每次循环的时候会替换掉 AndroidManifext.xml 中的${ONEAPMTESTCHANNEL}。
打包 执行 ./gradlew assembleRelease
打开命令行定位到 project 目录,执行:
./gradlew assembleRelease
注意事项:
- productFlavors 定义的时候里面的类似 wandoujia,不能是数字开头,不能是关键字 test 等,因为你要意识到你在写 gradle 脚本,要符合 groovy 语法。如下面的就不合法
- flavor.manifestPlaceholders = [ONEAPMTESTCHANNEL: name]中的ONEAPMTESTCHANNEL 一定要和 AndroidManifext.xml 定义的一致。
assemble 命令
assemble 这个命令,会结合 Build Type 创建自己的task,如:
./gradlew assembleDebug # 会打包 Debug apk
./gradlew assembleRelease # 打包 Release apk
除此之外 assemble 还能和 Product Flavor 结合创建新的任务(assemble + Build Variants),Build Variants = Build Type + Product Flavor
比如:打包wandoujia渠道的release版本
./gradlew assembleWandoujiaRelease # 打包 wandoujia Release 版本,大小写不敏感
./gradlew assembleWandoujia # 此命令会生成wandoujia渠道的Release和Debug版本
packer-ng-plugin 打包工具
项目地址:https://github.com/mcxiaoke/packer-ng-plugin
walle 打包工具使用 (推荐使用)
项目地址:https://github.com/Meituan-Dianping/walle
集成方法
project 的 build.gradle
添加:
dependencies {
classpath 'com.meituan.android.walle:plugin:1.0.3'
}
app/build.gradle
添加:
apply plugin: 'walle'
dependencies {
...
compile 'com.meituan.android.walle:library:1.0.3'
}
在工程目录下创建 channel
文件:
meituan # 美团
samsungapps #三星
hiapk
anzhi
xiaomi # 小米
91com
gfan
appchina
nduoa
3gcn
mumayi
10086com
wostore
189store
lenovomm
hicloud
meizu
wandou
# Google Play
# googleplay
# 百度
baidu
#
# 360
360cn
#
# 应用宝
myapp
动态设置 UMeng 渠道(见下文 umeng 渠道动态设置)
打包:在工程根目录下执行(或者使用 Android Studio 的 Terminal,其默认路径就是工程根目录)
./gradlew clean assembleRelease -PchannelFile=channel
// windows 下
gradlew.bat clean assembleRelease -PchannelFile=channel
umeng 渠道动态设置
在 Application 中添加下面的代码动态设置渠道
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
String umengAppkey = "58996177cae7e76cc3001737";
MobclickAgent.UMAnalyticsConfig umAnalyticsConfig = new MobclickAgent.UMAnalyticsConfig(this,
umengAppkey,
channel,
MobclickAgent.EScenarioType.E_UM_NORMAL,
true);
MobclickAgent.startWithConfigure(umAnalyticsConfig);
注意:
- 友盟渠道:每个设备只记录初始的安装渠道,新的渠道请用之前没有安装过别的渠道包的设备进行测试。
- 如果使用代码的形式设置 Appkey 和 channel ,需要删除 AndroidManifest.xml 中的 Appkey,channel