如何在每个构建中随机化 ProGuard 字典?
Posted
技术标签:
【中文标题】如何在每个构建中随机化 ProGuard 字典?【英文标题】:How to randomize ProGuard dictionaries on each build? 【发布时间】:2020-07-15 20:29:38 【问题描述】:我发现了一个article,它引入了随机化字典条目的概念,而不是在混淆时对类名和变量使用标准的“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"
但是,我不知道他如何在 gradle 中运行 createRandomizedDictonaries()
,以及他如何创建一个包含字母/整数/符号随机列表的文本文件。逻辑可能是这样的:
欢迎使用 kotlin 和 java 的解决方案。
【问题讨论】:
【参考方案1】:我找到了一个关于使用 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'
【讨论】:
以上是关于如何在每个构建中随机化 ProGuard 字典?的主要内容,如果未能解决你的问题,请参考以下文章