android - 如何在每个构建中随机化 ProGuard 字典?
问题描述
我发现一篇文章介绍了随机化字典条目的概念,而不是在混淆时对类名和变量使用标准的“a、b、c、...”。他解释说,可以在构建时在 gradle 中运行任务以生成一个随机文本文件,该文件可以替换默认提供的文件:
tasks.whenTaskAdded { currentTask ->
//Android Gradle plugin may change this task name in the future
def prefix = 'transformClassesAndResourcesWithProguardFor'
if (currentTask.name.startsWith(prefix)) {
def taskName = currentTask.name.replace(prefix,
'createProguardDictionariesFor')
task "$taskName" {
doLast {
createRandomizedDictonaries()
}
}
//append scramble task to proguard task
currentTask.dependsOn "$taskName"
}
}
但是,我不知道他如何createRandomizedDictonaries()
在 gradle 中运行,以及他如何创建一个包含字母/整数/符号随机列表的文本文件。逻辑可能是这样的:
- 在 gradle 的类中运行一个函数。
- 读取主文本文件(在应用程序内)中的字符串并将它们一一添加到带有循环的字符串 Arraylist 中?可能将其与一些随机化逻辑结合起来,仅从文本文件中添加 X 字符串?
- 如果所有字符串都被添加到一个 Arraylist 中,则使用一些随机化逻辑将 X 个字符串添加到另一个字符串 Arraylist 中,该字符串将用于 ProGuard 的混淆。
- 使用 Arraylist 中的随机字符串创建一个新的文本文件。
- 指导 ProGuard 使用新生成的文本文件进行混淆。
欢迎使用 kotlin 和 java 的解决方案。
解决方案
我找到了一个关于使用 gradle 构建混淆字典的网站。 https://yrom.net/blog/2019/06/19/simple-codes-to-generate-obfuscation-dictionary/
我在我的 gradle 任务中运行代码,但它需要稍作修改。以下是我的gradle代码:
task genDict{
outputs.file('D:/ProjectName/build/tmp/builddict.txt')
doLast{
def r =new Random()
println(r)
def begin = r.nextInt(1000) + 0x0100
def end = begin + 0x40000
println("end: "+end)
def chars = (begin..end)
.findAll { Character.isValidCodePoint(it) && Character.isJavaIdentifierPart(it) }
.collect { String.valueOf(Character.toChars(it)) }
println("chars: "+chars)
int max = chars.size()
println(max)
def start = []
def dict = []
for (int i = 0; i < max; i++) {
char c = chars.get(i).charAt(0)
if (Character.isJavaIdentifierStart(c)) {
start << String.valueOf(c)
}
}
println(start.size())
def f = outputs.files.getSingleFile()
f.getParentFile().mkdirs()
f.withWriter("UTF-8") {
it.write(start.join(System.lineSeparator()))
it.write()
}
}
我想你可以设置你的字典规则。这是一个例子。不要忘记在你的 proguard-rules.pro 文件中添加混淆规则
-obfuscationdictionary 'D:\ProjectName\build\tmp\builddict.txt'
-classobfuscationdictionary 'D:\ProjectName\build\tmp\builddict.txt'
-packageobfuscationdictionary 'D:\ProjectName\build\tmp\builddict.txt'
推荐阅读
- mysql - 如何为使用两个数据库(mysql和mongo)的django项目编写单元测试
- mysql - 如何在 my.cnf 中更改时区,同时考虑夏令时
- android - 如何使用 mockito 编写单元测试代码以测试从 android 中的 firestore 检索到的数据?
- mysql - EF Code First 多对多关系创建重复的连接表?
- apache-spark - Spark 如何处理比 Spark 存储大得多的数据?
- javascript - HTML 脚本标记灰显且未加载
- c++ - 如何在 Visual Studio 中设置依赖 DLL 路径?
- parametric-equations - 求解具有参数指数的方程
- ios-universal-links - 通用链接在 ios 14 上随机失败
- c - 在c中对结构的链表进行排序