多渠道打包的方案,现在基本上分为Flavors的方案还有美团walle的方案。

一开始我个人选择的是的Flavors 的方案,在gradle中配置了flavors,但是很快发现弊端,打包很慢,尤其是执行assemble任务,六个渠道大概编译了十几分钟,这个是万万不能接受的。然后就开始采用美团的walle,这里先贴一下地址:

博客地址:https://tech.meituan.com/2017/01/13/android-apk-v2-signature-scheme.html

Github:https://github.com/Meituan-Dianping/walle

美团的多渠道打包的原理也很容易理解:

瓦力通过在Apk中的APK Signature Block区块添加自定义的渠道信息来生成渠道包,从而提高了渠道包生成效率,

Walle的配置和使用也很简单,这里不做多介绍,详情请看官方文档。

在多渠道打包完之后,怎样进行加固还是个问题,我的加固方案采用的是360加固宝的加固方案,一个一个的加固,让我感觉太浪费时间,太麻烦,也属实有点low。

我最初的想法是通过一个task任务,来依赖walle 的assembleReleaseChannels 任务,然后遍历多渠道的输出路径来遍历多渠道apk,来进行遍历加固。然后通过实践发现,此方案也不可行,加固会报出 以下错误

上传失败10418提交次数过于频繁,请稍后再试

由于渠道信息是写在APK Signature Block区块中,apk的其他信息是相同的,加固也会报出重复提交相同文件的错误。

上传失败10419相同文件频繁提交,请稍后再试

除此之外,加固流程也是避免不了每个apk都上传,加固,下载,签名的过程。

除了加固的问题,还会面临一个跟严重的问题,加固重新签名之后,渠道信息就失效了。关于这个问题,在walle 的github上也说明了此问题:

Wiki:https://github.com/Meituan-Dianping/walle/wiki/360加固失效?

在Wiki中 也有大神给出了解决方案,但是需要Python环境,原谅我属实有点懒了,这样的流程让我感觉起来有点繁琐。

这不是我想要的最优解,于是我就另寻他法。

在使用Walle的过程中我发现 :

在assembleReleaseChannels 任务 执行前会先执行assembleRelease 任务,这就说明 assembleReleaseChannels 是依赖于assembleRelease 任务去执行的,assembleRelease 任务会在outputs目录下构建出release包,然后walle 在用这个apk 去写入多渠道,那么,我们是不是可以在这个原始的 release apk做下手脚,将 多渠道打包->加固 的流程进行 转变为 加固->多渠道打包。这样只需要对原始apk 加固一次,然后再进行写入渠道信息,这样就极大缩短了加固的时间,最重要的是,先加固,加固完成之后再写入渠道信息,这样渠道信息就不会进行覆盖了。

多渠道打包功能主要是由walle插件完成的,所以主要看下这部分过程。

walle项目源码中,library moudle 主要是开放给用户读取渠道信息使用的,具体实现是在payload_reader中,payload_writer moudle的功能就是写渠道信息了,walle-cli 是walle提供的命令行程序,plugin 就是多渠道打包的主要插件了。

在plugin中,groovy 目录下是 插件的主要实现源码。

GradlePlugin 是插件执行的入口, Extension 主要是Gradle 的配置信息,ChannelMaker 是主要task 实现。

方案的实现,主要是通过修改Extension 和 ChannelMaker 来实现。

先来看Extension

class Extension {static final String DEFAULT_APK_FILE_NAME_TEMPLATE = '${appName}-${buildType}-${channel}.apk'File apkOutputFolderString apkFileNameFormatFile channelFile;File configFile;String variantConfigFileName;......
}

这些字段看上去是不是很熟悉,没错,就是在我们在gradle 中 配置walle 的信息

walle {apkOutputFolder = new File("${project.buildDir}/outputs/channels")apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-     ${buildTime}-${flavorName}.apk'//configFile与channelFile两者必须存在一个,否则无法生成渠道包。两者都存在时优先执行configFilechannelFile = new File("${project.getProjectDir()}/channel")//configFile = new File("${project.getProjectDir()}/config.json")
}

我们通过这里,就可以把加固宝的信息配置进去

class Extension {static final String DEFAULT_APK_FILE_NAME_TEMPLATE = '${appName}-${buildType}-${channel}.apk'File apkOutputFolderString apkFileNameFormatFile channelFile;File configFile;String variantConfigFileName;//加固宝jar路径String jiaguPath//加固宝用户名String jiaguUser//加固宝 密码String jiaguPwd
}

然后对应的,我们就可以在gradle中进行对应的配置

walle {// 指定渠道包的输出路径apkOutputFolder = new File("${project.buildDir}/outputs/channels");// 定制渠道包的APK的文件名称apkFileNameFormat = '${appName}-${channel}-${buildType}-v${versionName}-${buildTime}.apk';// 渠道配置文件channelFile = new File("${project.getProjectDir()}/channel")jiaguPath ="/Users/wyl/Downloads/360jiagubao_mac/jiagu/jiagu.jar"jiaguUser ="182xxxxx10"jiaguPwd  ="xixxxa1"
}

然后我们再看 ChannelMaker

这里主要看 packaging 方法。

Extension extension = Extension.getConfig(targetProject);

这是拿到我们在gradle 配置中信息。

def iterator = variant.outputs.iterator();
while (iterator.hasNext()) {def it = iterator.next();def apkFile = it.outputFiledef apiIdentifier = null;if (!it.outputs[0].filters.isEmpty()) {def tempIterator = it.outputs[0].filters.iterator();while (tempIterator.hasNext()) {FilterData filterData = tempIterator.next();if (filterData.filterType == "ABI") {apiIdentifier = filterData.identifierbreak;}}}if (apkFile == null || !apkFile.exists()) {throw new GradleException("${apkFile} is not existed!");}
}

这里就是遍历构建后的apk,然后对apk进行判空验证。

其实我们了解到这里,就已经够了,因为后续的多渠道,写入渠道号都是基于这个apk来进行操作的,我们只要在这里加上加固的流程就可以满足我们的需求了。

首先创建一个文件夹,来存放我们加固后的apk文件

def appFilePath = project.getProjectDir().absolutePath + "/build/outputs/jiagu"
File appDoc = new File(appFilePath)
if (!appDoc.exists()) appDoc.mkdir()

获取签名的方法在GrdlePlugin中 已经给到了,可以直接拿来用

SigningConfig getSigningConfig(BaseVariant variant) {return variant.buildType.signingConfig == null ? variant.mergedFlavor.signingConfig :     variant.buildType.signingConfig;
}

然后就可以进行加固操作了

if (extension.jiaguPath != null && extension.jiaguUser != null && extension.jiaguPwd != null) {project.exec {it.commandLine("java", "-jar", extension.jiaguPath, "-login", extension.jiaguUser, extension.jiaguPwd)}project.exec {it.commandLine("java", "-jar", extension.jiaguPath, "-importsign", signingConfig.storeFile, signingConfig.storePassword, signingConfig.keyAlias, signingConfig.keyPassword)}def iterator = variant.outputs.iterator();while (iterator.hasNext()) {def it = iterator.next();def apkFile = it.outputFileproject.exec {it.commandLine("java", "-jar", extension.jiaguPath, "-jiagu", apkFile, appFilePath, "-autosign")}}
}

然后通过遍历加固文件夹的apk文件,就可以对我们加固后的apk进行多渠道了。

File[] files = appDoc.listFiles()
for (i in 0..<files.size()) {File apkFile = files[i]if (apkFile == null || !apkFile.exists()) {throw new GradleException("${apkFile} is not existed!");}checkV2Signature(apkFile).......
}

后续的流程和原流程一样就可以了。

我是通过maven插件 将插件发布在了本地 进行测试

在插件目录的build.gradle中依赖maven插件

apply plugin: 'maven'

然后配置发布信息:

group = 'com.xl.channel-plugin'
version = "1.0.0"//打包上传到本地
uploadArchives {repositories {flatDir {dirs '../repo/'}}
}

点击这个任务,进行插件的发布。

在根目录的gradle中 引入仓库地址和插件

repositories {google()mavenCentral()flatDir {dirs './repo/'}
}classpath 'com.xl.channel-plugin:channel_plugin:1.0.0'//app 的build.gradle 中
apply plugin: 'xl-channel'

然后对walle进行配置

walle {// 指定渠道包的输出路径apkOutputFolder = new File("${project.buildDir}/outputs/channels");// 定制渠道包的APK的文件名称apkFileNameFormat = '${appName}-${channel}-${buildType}-v${versionName}-${buildTime}.apk';// 渠道配置文件channelFile = new File("${project.getProjectDir()}/channel")jiaguPath ="/Users/wyl/Downloads/360jiagubao_mac/jiagu/jiagu.jar"jiaguUser ="182xxlxlxl10"jiaguPwd  ="xixixixi"
}

然后执行这个task 来测试一下我们的成果

最后在build/outputs 目录下,会生成一个两个文件夹,jiagu 和 channles 。jiagu存放的加固后的apk,channels存放的是多渠道的apk。

至此,这个方案站在巨人的肩膀上就完成了,感谢美团walle。

代码地址:https://github.com/WngYilei/ChannelReinforce

有问题欢迎留言讨论。

Walle和加固宝的优雅结合相关推荐

  1. android加固多渠道,Android 多渠道打包(使用友盟统计,结合360加固宝进行多渠道打包)...

    如有不正确的地方,望各路小哥哥.小姐姐指点,小女子在此谢过(*^__^*) 嘻嘻-- 一般app做推广的时候都需要渠道包,方便分析数据,查看渠道质量 一.先去友盟平台申请一个appkey a.   a ...

  2. 【Android 安全】使用 360 加固宝加固应用 ( 购买高级加固服务 | 设置资源加固 | 设置 SO 文件保护配置 | 设置 SO 防盗用文件配置 | 反编译验证加固效果 )

    文章目录 一. 购买加固服务 二. 设置资源加固 三. 设置 SO 文件保护配置 四. 设置 SO 防盗用文件配置 五. 反编译验证加固效果 本博客用于记录下 360 加固保 加固应用流程 ; ( 上 ...

  3. 使用360加固宝命令行方式加固

    使用360加固宝命令行方式加固 将360加固宝安装程序下载之后,解压,然后通过winodws 的dos命令来调用360加固程序,完成登录,设置,加固应用的操作. 优点:可以使用程序控制加固工作,将生成 ...

  4. 360加固宝客户端使用

    360加固宝客户端使用 360加固宝官网: http://jiagu.360.cn/#/global/index 使用360加固宝客户端在线加固. 步骤一: 下载360加固宝 步骤二: 注册并登录36 ...

  5. Android使用360加固宝多渠道打包

    Android使用360加固宝多渠道打包关键点: 1.设置多渠道打包模板 格式根据软件导出的版本自行设置,模板类似下面示例: UMENG_CHANNEL 华为 huawei UMENG_CHANNEL ...

  6. 【Android 安全】使用 360 加固宝加固应用 ( 加固工具准备 | 生成签名 APK | 加固操作 | 反编译验证加固效果 )

    文章目录 一. 加固工具准备 二. 生成签名 APK 三. 加固操作 四. 反编译验证加固效果 本博客用于记录下 360 加固保 加固应用流程 ; ( 上一次加固还是一年前 , 过程全忘了 o(╥﹏╥ ...

  7. 360加固宝加固应用后,出现java.lang.ClassNotFoundException异常

    最近360市场强制加固后才能上传,加固后安装在手机上,点击图标异常 java.lang.RuntimeException: Unable to get provider com.xx.xxx.xxxx ...

  8. 【错误记录】360 加固后的运行错误 ( 加固 SO 动态库时不能对第三方动态库进行加固 )

    文章目录 一.加固 SO 动态库报错 二.解决方案 一.加固 SO 动态库报错 在 [Android 安全]使用 360 加固宝加固应用 ( 购买高级加固服务 | 设置资源加固 | 设置 SO 文件保 ...

  9. 【安卓逆向】360加固-脱壳修复

    最近花了一些时间学习逆向脱壳,这方面一直投入的时间比较少.样本经过某加固宝进行加固,这里简单记录一下脱壳过程和思路,感谢某数字公司对安全加固的无私贡献,让我有机会小小的提高一下这方面的技能. *安卓逆 ...

  10. python 工程结构加固_【安卓逆向】360加固-脱壳修复

    360加固-脱壳修复 最近花了一些时间学习逆向脱壳,这方面一直投入的时间比较少.样本经过某加固宝进行加固,这里简单记录一下脱壳过程和思路,感谢某数字公司对安全加固的无私贡献,让我有机会小小的提高一下这 ...

最新文章

  1. 【cs229-Lecture2】Linear Regression with One Variable (Week 1)(含测试数据和源码)
  2. 校园音乐点歌平台的设计与开发 微信小程序 推荐点歌 java 开发
  3. php链接数据库地址填写ip地址,PHP使用IP地址联接MySQL数据库
  4. 干货!MySQL 资源大全
  5. Android 2.0中电话本contact的读写操作(增删改查一)
  6. 计算机对英语口语考试,计算机辅助高考英语口语考试中题型的设计与交际能力的实现.pdf...
  7. 数学分析 连续函数的孤立零点
  8. java学习(6):数据类型
  9. Win11更新22000.71:优化任务栏、右键菜单视觉风格
  10. python最新版安装图集_通过python简单的实现了plist、json图集的切割
  11. metasploit基本使用方法
  12. 一大波程序员血赚到腰疼...
  13. SparkSql 数据类型转换
  14. Java Script 基本知识点
  15. OpenStack OVSGRE/VXLAN网络
  16. 下载特定区域内街景照片数据 | Download Street View Photos within Selected Region
  17. 基于C# WinForms窗体——飞机大战
  18. win10装机之天涯若比邻长时间卡死
  19. TCP FIN扫描探测原理
  20. Android中白天模式与夜间模式的切换

热门文章

  1. 拯救者Y7000电脑一直呼呼呼 声音很大的解决办法
  2. 5G丨美国运营商Verizon年底在美国20座城市开通5G服务
  3. 调用百度地图或是高德地图直接导航
  4. 【转】94个比付费软件更好的免费软件
  5. :style动态设置背景图片
  6. 喝多了,头痛,发篇喝酒坏处的文章,提提醒,适量饮酒
  7. (论文笔记)NeRV: Neural Representations for Videos
  8. Opencv创建纯色图
  9. 2022,从阅读开始
  10. 国企直招,内推! 科陆电子--嵌入式工程师/C# 工程师