我正在开发一个 Android 应用程序,出于安全原因必须对其进行混淆。我的 C++ 代码中使用了 R8 混淆的一些类和字段,因此混淆步骤当然会破坏这部分代码。
我的问题是,由于我不想只保持这些类和字段不混淆,因此如何根据输出的 mapping.txt
编写 C++ 代码的自动修改脚本R8?
更具体地说,我在尝试解决此问题时面临的问题如下:
- 我应该如何编辑源代码以进行编译,而不在我的项目中永久修改它
- 我相信原生部分首先被编译,然后再编译 Kotlin 部分,然后再生成
mapping.txt
文件,那么我如何重新排序任务或解决问题这个问题
如有任何帮助,我们将不胜感激。
最佳答案
这是一个想法的 Spark ,由你来看看它是否可行:
- 获取构建的
mapping.txt
并删除除 JNI 代码所需部分之外的所有内容。 - 在所有后续构建中使用
-applymapping
选项将该文件传递到 R8。这将使 JNI 符号保持困惑但稳定。其他符号仍会被随机混淆。 - 使用mapping.txt作为以下函数中
m
表的源:
inline constexpr const char * mapping(const char* in) {
std::pair<const char *, const char *> m[] = {
{"important/class","a"},
{"important/other/class", "a.b"},
};
for (const auto& [normal, obfuscated]: m) {
if (!strcmp(normal, in)) return obfuscated;
}
return "ERROR";
}
- 现在,在需要引用类、字段或类型名称的任何地方使用
mapping("foo")
。
在brief experiment中编译器完全内联并消除了映射
函数,只保留了混淆的类型。
关于android - 如何将Android R8混淆应用于 native 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77584708/