如何将Android R8混淆应用于本机代码?

问题描述 投票:0回答:1

我正在开发一个 Android 应用程序,出于安全原因必须对其进行混淆。我的 C++ 代码中使用了 R8 混淆的一些类和字段,因此混淆步骤当然会破坏这部分代码。

我的问题是,由于我不想只保持这些类和字段不混淆,我如何编写基于 R8 输出的

mapping.txt
自动修改 C++ 代码的脚本?

更具体地说,我在尝试解决此问题时面临的问题如下:

  • 我应该如何编辑源代码以进行编译而不在我的项目中永久修改它
  • 我相信原生部分首先被编译,然后再编译 Kotlin 部分,然后再生成
    mapping.txt
    文件,所以我如何重新排序任务或解决这个问题

如有任何帮助,我们将不胜感激。

android c++ gradle java-native-interface proguard
1个回答
1
投票

这是一个想法的火花,由你来看看它是否可行:

  1. 获取构建的
    mapping.txt
    并删除除 JNI 代码所需部分之外的所有内容。
  2. 在所有后续版本中使用
    -applymapping
    选项将该文件传递到 R8。这将使 JNI 符号保持混乱但稳定。其他符号仍会被随机混淆。
  3. 使用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";
}
  1. 现在在需要引用类、字段或类型名称的任何地方使用
    mapping("foo")

简短的实验中,编译器完全内联并消除了

mapping
函数,只留下混淆的类型。

© www.soinside.com 2019 - 2024. All rights reserved.