目的:加固、多渠道配置
1.准备工作
A.需要在app的manifest中配置Channel_Id和Channel_Name
<application
...
>
<!--多渠道配置-->
<meta-data
android:name="Channel_Id"
android:value="${CHANNEL_ID}" />
<meta-data
android:name="Channel_Name"
android:value="${CHANNEL_NAME}" />
</application>
B.为了方便运行时也有渠道信息,需要在gradle中替换
android {
...
flavorDimensions "default"
//公开发布商店渠道配置
productFlavors {
//程序员本地跑的包(只直接在AS中跑,不打包给其他人)
Developer {
dimension "default"
manifestPlaceholders = [CHANNEL_ID : "-1",
CHANNEL_NAME: "内部"]
}
//打包后★必须使用多渠道设置渠道★(不直接跑包,打包时使用)
Package {
dimension "default"
manifestPlaceholders = [CHANNEL_ID : "10000",
CHANNEL_NAME: "公司内部流通"]
}
}
...
}
2.工具使用流程
1.打包(使用V1签名)完毕后,需要使用360加固助手进行加固和多渠道操作
2.设置签名:选择应用加固-签名设置-添加签名后勾选启用自动签名
3.加固助手多渠道配置:将Channel_Info.txt文件中的Channel信息复制到txt文件中,选择应用加固-多渠道设置-导入摸板-勾选启用多渠道打包
4.设置生成包的地址:选择应用加固-基础设置-选择加固包的输出路径
5.加固和多渠道:选择应用加固-添加应用-等待加固和多渠道整个流程完成
6.查看加固情况:选择应用加固-右键加固包-选择任务详情-即可查看加固情况
7.手动设置渠道和签名(当遇到有加固失败的情况,就需要手动设置渠道和签名):
①选择失败的渠道,将Channel_Info.txt文件中对应的Channel信息复制到新的txt文件中
②选择工具包-渠道打包-自己选择APK和输出路径(选择加固后没有渠道的包,结尾为_jiagu_sign.apk)-使用多渠道配置文件(刚才自己新建的txt)-生成渠道包
③选择工具包-签名APK-自己选择APK和输出路径(选择第②步生成的渠道包)-使用已配置的签名(V1)-开始签名-->完成失败APK的签名
附:Channel_Info.txt内容(APP内部自动末尾添加:测试版末尾0,正式版末尾1)
Channel_Id|Channel_Name Company 10000|公司内部流通
Channel_Id|Channel_Name Official 10001|公司官网
Channel_Id|Channel_Name Tencent 10002|腾讯
Channel_Id|Channel_Name Baidu 10003|百度
Channel_Id|Channel_Name XiaoMi 10004|小米
Channel_Id|Channel_Name HuaWei 10005|华为
Channel_Id|Channel_Name Oppo 10006|OPPO
Channel_Id|Channel_Name Vivo 10007|VIVO
Channel_Id|Channel_Name MeiZu 10008|魅族
Channel_Id|Channel_Name Smartisan 10009|锤子
Channel_Id|Channel_Name 360 10010|360
Channel_Id|Channel_Name SamSung 10011|三星
Channel_Id|Channel_Name Ali 10012|阿里
Channel_Id|Channel_Name Operations 10099|运营
3.APP读取渠道信息
interface BuildConfigApp {
companion object {
//DEBUG为系统BuildConfig.DEBUG加上http是否使用正式服的判断合集
val DEBUG = if (ApiConstants.Host.FORCE_RELEASE) {
false
} else {
BuildConfig.DEBUG
}
private var channelId: String? = null
private var channelName: String? = null
//获取渠道ID
fun getChannelId(context: Context? = App.INSTANCE): String {
if (channelId.isNullOrBlank()) {
//0对应测试版,1对应正式版
val buildType = if (DEBUG) "0" else "1"
if (context == null) {
return ChannelConstants.DEFAULT_ID + buildType//DEFAULT_ID为内部渠道10000
}
//application信息
val app = context.applicationContext
//读取渠道信息
val appInfo =
app.packageManager.getApplicationInfo(app.packageName, PackageManager.GET_META_DATA)
//以dev结尾的是没有进行渠道打包的版本
//channelId debug 要取Int;release 因为使用了360生成多渠道要取String
var id = appInfo.metaData.getInt("Channel_Id", -1)
if (id == -1) {
val idStr = appInfo.metaData.getString("Channel_Id")
if (!idStr.isNullOrBlank()) {
try {
id = idStr.toInt()
} catch (e: Exception) {
e.printStackTrace()
}
}
}
channelId = (if (id == -1) ChannelConstants.DEFAULT_ID else id.toString()) + buildType
}
return channelId!!
}
//根据渠道名称
fun getChannelName(context: Context? = Utils.getApp()): String {
if (context == null) {
return "公司内部流通"
}
if (channelName.isNullOrBlank()) {
//application信息
val app = context.applicationContext
//读取渠道信息
val appInfo =
app.packageManager.getApplicationInfo(app.packageName, PackageManager.GET_META_DATA)
//渠道名称
val name = appInfo.metaData.getString("Channel_Name")
channelName = if (name == null || name.contains("内部")) "公司内部流通" else name
}
return channelName!!
}
//是否是开发者运行版本(没有打渠道信息的版本) 提供给bugly统计上报信息使用的
fun isDeveloper(app: Application): Boolean {
//读取渠道信息
val appInfo =
app.packageManager.getApplicationInfo(app.packageName, PackageManager.GET_META_DATA)
//以dev结尾的是没有进行渠道打包的版本
val id = appInfo.metaData.getInt("Channel_Id", -1)
return id == -1
}
}
}
网友评论