多渠道打包和资源混淆的作用这里我就不再阐述了。网上有很多。
本篇博客我们来介绍一下如何实现多渠道打包之前先进行资源混淆,这样一来我们打出来的包都是已经进行过资源混淆的了。
如果你还有其他的需求,也可以按照这个方法实现。
多渠道打包(Walle)
这里多渠道打包我使用的是美团的Walle,具体的使用方式Github上已经介绍的很详细了。
这里我先来实现一下多渠道打包
首先按照说明集成一下walle和签名配置
配置build.gradle
在位于项目的根目录 build.gradle 文件中添加Walle Gradle插件的依赖, 如下:
buildscript {
dependencies {
classpath 'com.meituan.android.walle:plugin:1.1.6'
}
}
然后在app模块下的build.gradle中添加依赖以及应用插件
如下
apply plugin: 'walle'
dependencies {
implementation '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")
}
这里我们还需要配置一下签名和渠道名称文件
签名文件自己创建一下,记住文件路径和密码等信息。channel文件中就是要打的渠道包的名称
配置一下签名信息
至此,多渠道相关的配置我们就已经完成了。下面我们来使用打包命令来进行打包试试
点击命令行,输入gradlew assembleReleaseChannels
,然后回车
出现BUILD SUCCESSFUL 表示已经完成
下面我们去指令的存放文件夹看一下打的包
可以看到,已经根据channel文件打出了对应的包了。
资源混淆(AndResGuard)
资源混淆这里我用的是微信的AndResGuard
使用方法也很简单,相关配置按照文档走就可以了,为了节省篇幅这里我就不再赘述了。
我们来直接使用
打开命令行输入gradlew resguardRelease
回车既可开始资源混淆
执行完成之后我们可以看到混淆过后的包
下面我们来反编译一下看看资源文件到底有没有被混淆过,关于反编译的方法可以看一下我的这篇博客Android反编译工具jadx详细使用方法以及混淆和加固的对比
下图就是我们对资源混淆过后的包进行的反编译,可以看到资源文件名已经被混淆了。
我们再来看一下之前的多渠道打的包,可以看到资源文件名称是没有变化的
这样一来,App的资源混淆我们已经完成了
实现多渠道打包时自动进行资源混淆
上面我们已经分别实现了多渠道打包和资源混淆。但是我们也看到了,多渠道打包和资源混淆是两个命令,也就是说他们实际上是两个任务。我们想要达到的目的是我们输入一行命令时,先执行资源混淆任务,然后再进行多渠道打包,这样一来,我们打出来的所有包就都是已经进行过资源混淆的包了。
搞清楚如何实现就好说了,我们只需要在执行assembleReleaseChannels
打包任务之前先执行resguardRelease
资源混淆任务即可。
那么,熟悉gradle的话你肯定会知道gradle是使用Groovy语言来实现的,不熟悉Grovvy也没关系。你只需要在app模块的build.gradle中粘贴以下代码
afterEvaluate {
tasks.getByName('assembleReleaseChannels') {
dependsOn(resguardRelease)
}
}
这几行代码表示assembleReleaseChannels
任务是依赖于resguardRelease
任务的,也就是说先执行完资源混淆后再执行多渠道打包。
那么,我们以后再使用gradlew assembleReleaseChannels
命令进行打包时就会先执行资源混淆的任务。这样一来,我们就实现了打出来的包就是已经进行过资源混淆的包了。
下面我们来执行一下打包命令gradlew assembleReleaseChannels
可以看到,我们执行打包任务之前会先执行资源混淆的任务,然后再打包
然后我们再来反编译一下apk,可以看到我们反编译的是应用宝渠道的包,该包也已经进行过资源混淆了
到此为止,我们就实现了一行命令实现多渠道打包并自动进行资源混淆,同样的,如果你还有其他的需求,也可以使用类似的方法去实现。
最后要说的是,gradle是使用Groovy语言的,作为一名Android工程师,还是很有必要去了解一下Groovy语言的。毕竟有些插件能在开发上帮助我们节省很多时间。
下面是demo地址