Android应用程序App应用上线流程
http://blog.****.net/wenzhi20102321/article/details/54175238
链接:http://www.cnblogs.com/zhengtu2015/p/6050011.html安卓应用商店(一个商店也叫做一个渠道,如360,baidu,xiaomi)众多,大大小小几百个,我们发布应用之后需要统计各个渠道的用户下载量,所以才有了多渠道打包
2、怎么样统计各个渠道的下载量呢?
现在有比较成熟的第三方应用帮我们实现统计功能(比如友盟),统计的本质就是收集用户信息传输到后台,后台生成报表,帮助我们跟踪分析并完善app。通过系统的方法已经可以获取到,版本号,版本名称,系统版本,机型,地区等各种信息,唯独应用商店(渠道)的信息我们是没有办法从系统获取到的,所以我们就人为的在apk里面添加渠道信息(其实就用一个字段进行标识,如360,baidu),我们只要把这些信息打包到apk文件并将信息传输到后台,后台根据这个标识,可以统计各个渠道的下载量了,并没有多么的高大上。
说了那么多,其实多渠道打包只需要关注两件事情:
- 将渠道信息写入apk文件
- 将apk中的渠道信息传输到统计后台
1、为什么要进行多渠道打包?
(一)在AndroidManifest.xml里设置动态渠道变量
<meta-dataandroid:name="UMENG_CHANNEL"android:value="${UMENG_CHANNEL_VALUE}" />
(二)在build.gradle设置productFlavors
这里假定我们需要打包的渠道为酷安市场、360、小米、百度、豌豆荚 android { productFlavors { kuan {manifestPlaceholders = [UMENG_CHANNEL_VALUE: "kuan"]} xiaomi { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"] }qh360 { manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qh360"] } baidu{ manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"] } wandoujia {manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"] } } }
或者批量修改
android {productFlavors { kuan {} xiaomi {} qh360 {} baidu {} wandoujia {} }productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE:name] } }
所谓ProductFlavors其实就是可定义的产品特性,配合 manifest merger 使用的时候就可以达成在一次编译过程中产生多个具有自己特性配置的版本。上面这个配置的作用就是,为每个渠道包产生不同的 UMENG_CHANNEL_VALUE 的值。
(三)执行打包操作
在AndroidStudio菜单栏点击Build菜单–>Generate signed APK–>选择key,并输入密码(android 7.0以下版本)
然后下一步,选择打包渠道
android7.0以上版本(多了个签名版本选择v1、v2)
v1与v2的区别:
从图中可以看到多了签名版本的选择,因为刚开始默认勾选的v2(Full APK Signature),没多想一路下一步下去,
结果在测试机上(5.0.1)一直都安装失败,想着和那个选择签名版本有关系,那就查查吧。
问题描述(v1和v2)
Android 7.0中引入了APK SignatureScheme v2,v1呢是jar Signature来自JDK
V1:应该是通过ZIP条目进行验证,这样APK 签署后可进行许多修改 - 可以移动甚至重新压缩文件。
V2:验证压缩文件的所有字节,而不是单个 ZIP 条目,因此,在签名后无法再更改(包括 zipalign)。正因如此,现在在编译过程中,我们将压缩、调整和签署合并成一步完成。好处显而易见,更安全而且新的签名可缩短在设备上进行验证的时间(不需要费时地解压缩然后验证),从而加快应用安装速度。
解决方案一
v1和v2的签名使用
只勾选v1签名并不会影响什么,但是在7.0上不会使用更安全的验证方式
只勾选V2签名7.0以下会直接安装完显示未安装,7.0以上则使用了V2的方式验证
同时勾选V1和V2则所有机型都没问题
解决方案二
在app的build.gradle的android标签下加入如下
1. signingConfigs {
2. debug {
3. v1SigningEnabled true
4. v2SigningEnabled true
5. }
6. release {
7. v1SigningEnabled true
8. v2SigningEnabled true
9. }
10. }
最后点击完成按钮
上图可以看到,我们已经成功的将五个渠道包打好。
(四)执行打包命令 ./gradlewassembleRelease
除了使用AndroidStudio图形打包操作以外,我们也可以使用命令行进行打包操作,具体步骤如下:
- 在AndroidStudio窗口左下角打开Terminal面板,输入gradlew assembleRelease命令
- 如果系统中没有安装Gradle,则会自动下载完成安装及初始化
- 打包成功后会提示BUILD SUCCESSRUL
- 在app–>build–>outputs–>apk路径中就可以看到打包成功后的APK
注意,此时这里的APK包名显示为unsigned,也就是说未签名,我们可以继续在build.gradle文件中配置签名信息
signingConfigs{ release{ storeFile file("../wooyun_keystore")//签名文件路径storePassword "123456" keyAlias "123456" keyPassword"123456" //签名密码} }
- 然后再次执行gradlew assembleRelease命令
这次生成的就是含有签名的渠道包。
- 当我们的渠道包版本比较多时,可以自定义所打APK包名称,用以区分
//自定义输出配置,这里我们加上APK版本号1.0applicationVariants.all { variant -> variant.outputs.each { output -> defoutputFile = output.outputFile if (outputFile != null&& outputFile.name.endsWith('.apk')) { //输出apk名称为wooyun_v1.0_wandoujia.apkdef fileName = "wooyun_v${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"output.outputFile = new File(outputFile.parent, fileName) }} }
- assemble是Gradle中的编译打包命令,有如下用法:
如果我们想打包wandoujia渠道的release版本,执行如下命令就好了:
gradlewassembleWandoujiaRelease
如果我们想打包wandoujia渠道的debug版本,执行如下命令就好了:
gradlewassembleWandoujiaDebug
如果我们只打wandoujia渠道版本,则:
gradlew assembleWandoujia
此命令会生成wandoujia渠道的Release和Debug版本
同理我想打全部Release版本:
gradlewassembleRelease
这条命令会把Product Flavor下的所有渠道的Release版本都打出来。
下面是我个人的build.gradle配置文件,分享给大家,以作参考
apply plugin:'com.android.application' android {compileSdkVersion 23 buildToolsVersion "23.0.3" defaultConfig {applicationId "com.wooyun.castiel" minSdkVersion 15 targetSdkVersion23 versionCode 1 versionName "1.0" } //签名signingConfigs { debugConfig { storeFile file("../wooyun_keystore")//签名文件storePassword "123456" keyAlias "123456" keyPassword"123456" //签名密码} release{ storeFile file("../wooyun_keystore") //签名文件storePassword "123456" keyAlias "123456" keyPassword"123456" //签名密码} } buildTypes { release { minifyEnabled falseproguardFiles getDefaultProguardFile('proguard-android.txt'),'proguard-rules.pro' // 自定义输出配置applicationVariants.all { variant -> variant.outputs.each { output -> defoutputFile = output.outputFile if (outputFile != null&& outputFile.name.endsWith('.apk')) { //输出apk名称为wooyun_v1.0_wandoujia.apkdef fileName = "wooyun_v${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"output.outputFile = new File(outputFile.parent, fileName) }} } } } productFlavors { kuan {} xiaomi {} qh360 {} baidu {} wandoujia {} } productFlavors.all{ flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] } }dependencies { compile fileTree(dir: 'libs',include: ['*.jar']) testCompile 'junit:junit:4.12' compile'com.android.support:appcompat-v7:23.4.0' }
上面的signingConfigs配置中,可以写两个代码块,分别名为debugConfig和releaseConfig,并在其中写好一个完整签名需要的keyAlias、keyPassword、storeFile file、storePassword。
然后在buildTypes中,分两个代码块,分别是debug时用的,和release时用的。在其中引用刚刚写好的debugConfig和releaseConfig即可。
注意:signingConfigs代码块一定要写在buildTypes前面,否则会报下面这种错:
Could notfind property 'debugConfig' on SigningConfigcontainer.
签名密码写在gradle中不安全,故最好在打包上线的时候将相关代码注释掉。
Android Gradle Plugin
Gradle Plugin本身提供了多渠道的打包策略:
首先,在AndroidManifest.xml中添加渠道信息占位符:
<meta-dataandroid:name="InstallChannel"android:value="${InstallChannel}" />
然后,通过Gradle Plugin提供的productFlavors标签,添加渠道信息:
productFlavors{ "YingYongBao"{manifestPlaceholders = [InstallChannel : "YingYongBao"] }"360"{ manifestPlaceholders = [InstallChannel : "360"] } }