友盟的多渠道打包
在AndroidManifest中添加<meta-data
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.lanyu96.loadinglayout">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme"
tools:ignore="ExtraText">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!--多渠道打包 -->
<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />
</application>
</manifest>
然后修改app级别的gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 28
defaultConfig {
applicationId "com.lanyu96.loadinglayout"
minSdkVersion 23
targetSdkVersion 28
versionCode 2
versionName '2.3'
//解决报错 All flavors must now belong to a named .....
flavorDimensions "versionCode"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
//多渠道打包方式 1 (未优化前)
// productFlavors{
// wandoujia{
// manifestPlaceholders = [UMENG_CHANNEL_VALUE:"wandoujia"]
// }
// xiaomi{
// manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
// }
// }
//多渠道打包方式 2 (优化 , 当进行大量渠道打包时 , 减少代码量 )
// productFlavors {
// wandoujia {
// }
// xiaomi {
// }
// productFlavors.all {
// flavor ->
// flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
// }
// }
//多渠道打包方式 3 (优化2 , 在生成的包后添加当前版本信息)
productFlavors {
wandoujia {
}
xiaomi {
}
huawei {
}
productFlavors.all {
flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
}
applicationVariants.all { variant ->
variant.outputs.all { output ->
def fileName
if (outputFile != null && outputFile.name.endsWith('.apk')) {
fileName = outputFile.name.replace(".apk", "-${defaultConfig.versionName}.apk")
outputFileName = fileName
}
}
}
}
}
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
//noinspection GradleCompatible
implementation 'com.android.support:appcompat-v7:26.1.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
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'
}
然后选择自己的证书, 打包就可以了 , app文件夹下就会有对应渠道的Apk包, 如果要增加渠道只需在上方的代码中添加 对应渠道名称即可
获取渠道信息 , 可以借助我封装的工具类 传送门
缺点 : 打包效率比较低下 , 如果是几十个包还可以应付 , 打一个包最快的话需要十几秒 , 慢的话需要几分钟不等 , 跟机器性能很有关系
但是是最安全稳定的 , 推荐使用此类方法
美团多渠道打包
原理 : 把一个Android应用包当作zip文件包进行解压 , 然后发现在签名生成的目录下(META_INF)添加一个空文件不需要重新签名 . 利用这个机制 , 该文件下的文件名就是渠道名 . 这种方式不需要重新签名等步骤 , 非常高效.
缺点 : google如果哪天更改打包规则 , 使得在 META-INF中建立空文件还需要重新打包 , 这种方式将不可用
一些不法的渠道商很容易通过工具修改渠道 , 如果一个渠道商,通过网络劫持和篡改渠道的组和方式来获取暴利 , 对于程序开发者来说可能会存在着巨大的经济损失
操作, 通过python脚本 具体 可以参考GitHub上的介绍 传送门
360多渠道打包
原理 : apk文件本质就是zip文件 , 利用zip文件 "可以添加comment(摘要) " 的数据结构特点 , 在文件的末尾写入任意数据 , 而不用重新解压zip文件,我们就可以将渠道信息写入到摘要区
优点是 : 5M的apk , 一秒能打包300个 , 在下载apk的同时 , 服务端可以写入一些信息 , 例如邀请码 , 分享信息等
缺点 : 渠道信息也很容易修改 , 虽然可以加密 , 只是提高了修改的门槛