android - 如何将Android R8混淆应用于 native 代码?

标签 android c++ gradle java-native-interface proguard

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

我的问题是,由于我不想只保持这些类和字段不混淆,因此如何根据输出的 mapping.txt 编写 C++ 代码的自动修改脚本R8?

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

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

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

最佳答案

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

  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";
}
  • 现在,在需要引用类、字段或类型名称的任何地方使用 mapping("foo")
  • brief experiment中编译器完全内联并消除了映射函数,只保留了混淆的类型。

    关于android - 如何将Android R8混淆应用于 native 代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77584708/

    相关文章:

    c++ - 没有默认 ctor 的间接虚拟基会阻止子级拥有默认 ctor,除非中间的每个类也有一个

    c++ - 如何从 WinRT (8.1) 中的 MediaElement 捕获当前帧?

    java - 将机器人部署到Heroku的困难

    android-studio - 如何强制停止在 Android Studio 中运行的 Gradle Build

    android - 处理 DateTimes 的最有效方法是什么,特别是因为 DATETIME 的一列导致 NUMERIC?

    android - AppWidget 第一次添加时没有完成更新

    c++ - 导出类的客户端未使用 dllimport 时出现问题?

    android - setOnCompletionListener 仅在第一次检测完成

    android - 从多个类调用 setOnClickListener 是否只会导致一个回调?

    java - 如何在 Mac OS 上使用 Intellij 中的 gradle 和 java9 设置环境变量?