一行命令实现多渠道打包并自动进行资源混淆(Walle,AndResGuard)

时间:2024-05-19 11:21:13

多渠道打包和资源混淆的作用这里我就不再阐述了。网上有很多。
本篇博客我们来介绍一下如何实现多渠道打包之前先进行资源混淆,这样一来我们打出来的包都是已经进行过资源混淆的了。
如果你还有其他的需求,也可以按照这个方法实现。

多渠道打包(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文件中就是要打的渠道包的名称
一行命令实现多渠道打包并自动进行资源混淆(Walle,AndResGuard)

配置一下签名信息

一行命令实现多渠道打包并自动进行资源混淆(Walle,AndResGuard)

至此,多渠道相关的配置我们就已经完成了。下面我们来使用打包命令来进行打包试试

点击命令行,输入gradlew assembleReleaseChannels,然后回车
一行命令实现多渠道打包并自动进行资源混淆(Walle,AndResGuard)

出现BUILD SUCCESSFUL 表示已经完成
下面我们去指令的存放文件夹看一下打的包

一行命令实现多渠道打包并自动进行资源混淆(Walle,AndResGuard)

可以看到,已经根据channel文件打出了对应的包了。

资源混淆(AndResGuard)

资源混淆这里我用的是微信的AndResGuard

使用方法也很简单,相关配置按照文档走就可以了,为了节省篇幅这里我就不再赘述了。
我们来直接使用
打开命令行输入gradlew resguardRelease回车既可开始资源混淆
一行命令实现多渠道打包并自动进行资源混淆(Walle,AndResGuard)

执行完成之后我们可以看到混淆过后的包
一行命令实现多渠道打包并自动进行资源混淆(Walle,AndResGuard)

下面我们来反编译一下看看资源文件到底有没有被混淆过,关于反编译的方法可以看一下我的这篇博客Android反编译工具jadx详细使用方法以及混淆和加固的对比

下图就是我们对资源混淆过后的包进行的反编译,可以看到资源文件名已经被混淆了。
一行命令实现多渠道打包并自动进行资源混淆(Walle,AndResGuard)

我们再来看一下之前的多渠道打的包,可以看到资源文件名称是没有变化的
一行命令实现多渠道打包并自动进行资源混淆(Walle,AndResGuard)

这样一来,App的资源混淆我们已经完成了

实现多渠道打包时自动进行资源混淆

上面我们已经分别实现了多渠道打包和资源混淆。但是我们也看到了,多渠道打包和资源混淆是两个命令,也就是说他们实际上是两个任务。我们想要达到的目的是我们输入一行命令时,先执行资源混淆任务,然后再进行多渠道打包,这样一来,我们打出来的所有包就都是已经进行过资源混淆的包了。

搞清楚如何实现就好说了,我们只需要在执行assembleReleaseChannels打包任务之前先执行resguardRelease资源混淆任务即可。

那么,熟悉gradle的话你肯定会知道gradle是使用Groovy语言来实现的,不熟悉Grovvy也没关系。你只需要在app模块的build.gradle中粘贴以下代码

afterEvaluate {
    tasks.getByName('assembleReleaseChannels') {
        dependsOn(resguardRelease)
    }

}

这几行代码表示assembleReleaseChannels任务是依赖于resguardRelease任务的,也就是说先执行完资源混淆后再执行多渠道打包。
那么,我们以后再使用gradlew assembleReleaseChannels命令进行打包时就会先执行资源混淆的任务。这样一来,我们就实现了打出来的包就是已经进行过资源混淆的包了。

下面我们来执行一下打包命令gradlew assembleReleaseChannels
可以看到,我们执行打包任务之前会先执行资源混淆的任务,然后再打包

一行命令实现多渠道打包并自动进行资源混淆(Walle,AndResGuard)

然后我们再来反编译一下apk,可以看到我们反编译的是应用宝渠道的包,该包也已经进行过资源混淆了
一行命令实现多渠道打包并自动进行资源混淆(Walle,AndResGuard)

到此为止,我们就实现了一行命令实现多渠道打包并自动进行资源混淆,同样的,如果你还有其他的需求,也可以使用类似的方法去实现。
最后要说的是,gradle是使用Groovy语言的,作为一名Android工程师,还是很有必要去了解一下Groovy语言的。毕竟有些插件能在开发上帮助我们节省很多时间。

下面是demo地址

一行命令实现多渠道打包并自动进行资源混淆Demo