第一点:我们为什么需要打多渠道包。
答:老板想知道我们的APP在哪个应用市场渠道下载的最多,我们以后就重点推广这个渠道,用钱砸到排名前面。这就是原因。—— 所以不同渠道打包主要用来做统计分析,特别是游戏应用,特别注意哪个渠道推广的最有效。
第二点:在打包之前我们需要了解一下Android studio 在打包签名过程中V1签名和V2签名的一个区别。如下图所示。(这里我讲述的V1和V2的区别原文出自这里很厉害)
这里可以看到:v1签名是对jar进行签名,V2签名是对整个apk签名:官方介绍就是:v2签名是在整个APK文件的二进制内容上计算和验证的,v1是在归档文件中解压缩文件内容。
二者签名所产生的结果:
v1:在v1中只对未压缩的文件内容进行了验证,所以在APK签名之后可以进行很多修改——文件可以移动,甚至可以重新压缩。即可以对签名后的文件在进行处理
v2:v2签名验证了归档中的所有字节,而不是单独的ZIP条目,如果您在构建过程中有任何定制任务,包括篡改或处理APK文件,请确保禁用它们,否则您可能会使v2签名失效,从而使您的APKs与Android 7.0和以上版本不兼容。
google官方最后也说了:一个APK可以同时由v1和v2签名同时签署,所以它仍然可以向后兼容以前的Android版本。
这里开发经验表示 :
一定可行的方案: 只使用 v1 方案
不一定可行的方案:同时使用 v1 和 v2 方案
对 7.0 以下一定不行的方案:只使用 v2 方案
1, 如果要支持 Android 7.0 以下版本,那么尽量同时选择两种签
名方式,但是一旦遇到签名问题,可以只使用 v1 签名方案
2,如果需要对签名后的信息做处理修改,那就使用v1签名方案
3,如果最后遇到各种不同的问题,可以不勾选v1和v2,直接打包签名。
***
——————————————————————————————————————————————————————分割线
第一步 :配置build.gradle
在位于项目的根目录 build.gradle 文件中添加Walle Gradle插件的依赖, 如下:
classpath 'com.meituan.android.walle:plugin:1.1.6'
并在当前App的 build.gradle 文件中apply这个插件,并添加上用于读取渠道号的AAR
apply plugin: 'walle'
dependencies {
compile 'com.meituan.android.walle:library:1.1.6'
}
walle {
// 指定渠道包的输出路径
apkOutputFolder = new File("${project.buildDir}/outputs/channels");
// 定制渠道包的APK的文件名称
apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
// 渠道配置文件
channelFile = new File("${project.getProjectDir()}/channel")
}
对应的属性:
apkOutputFolder:指定渠道包的输出路径, 默认值为new File(“${project.buildDir}/outputs/apk”)。这里指定为build/outputs/apk。
apkFileNameFormat:定制渠道包的APK的文件名称, 默认值为’appName−appName−{buildType}-${channel}.apk’。
可使用以下变量:
projectName - 项目名字
appName - App模块名字
packageName - applicationId (App包名packageName)
buildType - buildType (release/debug等)
channel - channel名称 (对应渠道打包中的渠道名字)
versionName - versionName (显示用的版本号)
versionCode - versionCode (内部版本号)
buildTime - buildTime (编译构建日期时间)
fileSHA1 - fileSHA1 (最终APK文件的SHA1哈希值)
flavorName - 编译构建 productFlavors 名
channelFile:包含渠道配置信息的文件路径
channelFile:包含渠道配置信息的文件路径。
这里展示一下我的bulid文件:
apply plugin: 'com.android.application'
apply plugin: 'walle'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.example.kym.myapplication"
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
signingConfigs {
release {
keyAlias 'app'
keyPassword '123456'
storeFile file('F:/AndroidProjectS/MyApp/app/keystore/MyApp.keystore')
storePassword '123456'
}
}
buildTypes {
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
release {
minifyEnabled true
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
}
walle {
apkOutputFolder = new File("${project.buildDir}/outputs/channels")
apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}-${flavorName}.apk'
//configFile与channelFile两者必须存在一个,否则无法生成渠道包。两者都存在时优先执行configFile
channelFile = new File("${project.getProjectDir()}/channel")
//configFile = new File("${project.getProjectDir()}/config.json")
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation 'com.android.support:appcompat-v7:28.0.0-alpha3'
implementation 'com.android.support.constraint:constraint-layout:1.1.2'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
implementation 'com.meituan.android.walle:library:1.1.6'
}
第二步:创建channel,如下
在这里就算配置完成了。
第三部:接下来就是打渠道包了。在这里我们用Android studio 的Terminal来进行打包:(Terminal 下 运行一句命令:gradlew clean assembleReleaseChannels)
出现这个(BUILD SUCCESSFUL)就代表成功了。
。
这个时候就可以看到你的渠道包了。一般渠道包存放的路径是你app\build\outputs\channels。这个文件夹下面:
最后,第四部:查看 渠道
我是写在了application中,安装批量打包成功后得包,检测渠道是否写入成功
public class MyApp extends Application {
@Override
public void onCreate() {
super.onCreate();
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
Log.d("My_Channel","channel = " + channel);
}
}
还有一个就是错误提示,我在集成中遇到了几个错误,也是找了半天才找出来的,在这里我就贴出来吧。
报错内容
Error:Could not find method walle() for arguments [multi_channel_akilyv73y95cap8jiuga9hd1d$_run_closure1@531cd038] on project ‘:app’ of type org.gradle.api.Project
出现原因:plugins版本不对
解决办法:替换成对应的版本 即 app中的build.gradle和根目录下的builde.gradle中的引入版本要一致 如1.1.6,我是将我的wally版本都替换为1.1.6才解决的。
报错内容
Error:Plugin requires ‘APK Signature Scheme v2 Enabled’ for release.
出现原因:未设置v2签名
解决办法:设置签名并设置 v2SigningEnabled true,我是将app下的build文件中加入签名信息才好的。列入:
signingConfigs {
release {
keyAlias 'app'
keyPassword '123456'
storeFile file('F:/AndroidProjectS/MyApp/app/keystore/MyApp.keystore')
storePassword '123456'
}
}
buildTypes {
debug {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
release {
minifyEnabled true
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
————————————————————————————————————————————————
这是美团之前的一种多渠道打包方案(适用于V1签名打包方案,不适用于V2,用了V2后Android7.0版本会安装失败,切记!!!!)
话不多说,开始吧!请点击以下链接开始学习美团渠道打包方案!!!!
https://blog.csdn.net/qq_38367671/article/details/81026235
-