Proguard 使 Android 应用程序中的 R 类反射不再起作用

2024-02-11

自从我尝试在 Google Play 上发布它以来,我已经在我的项目中激活了 proguard。尽管 proguard-android.txt 有

-keepclassmembers class **.R$* {
public static <fields>;

}

这意味着它不应该混淆我需要的 R.raw 类,我发现运行此代码时

import headwayEnt.Blackhole_Darksun.R;

private static final String RES_PATH = "headwayEnt.Blackhole_Darksun.R";

public static int getFileHandle(String fileName, String path) {
    String fullPath = RES_PATH + '$' + path;
    if (subClass == null) {
        Class<headwayEnt.Blackhole_Darksun.R> c = null;     
        try {
            c = (Class<R>)Class.forName(RES_PATH);
        } catch(ClassNotFoundException e) {
            e.printStackTrace();
        } catch(ClassCastException e) {
            e.printStackTrace();
        }
        subClass = c.getDeclaredClasses();
    }
    int fileHandle = 0;
    try {
        int i = 0;
        System.out.println("fullPath: " + fullPath + " subclass len: " +
                subClass.length);
        for (; i < subClass.length; ++i) {
            String name = subClass[i].getName();
            if (subClass[i].getName().equals(fullPath)) {
                break;
            }
        }
        System.out.println("found i: " + i);
        Field[] f = subClass[i].getDeclaredFields();
        for (i = 0; i < f.length; ++i) {
            if (f[i].getName().equals(fileName)) {
                break;
            }
        }

        try {
            fileHandle = f[i].getInt(null);
        } catch(IllegalAccessException e) {

        }
    } catch (RuntimeException e) {
        System.out.println("Could not find filename: " + fileName + 
                " with path: " + path);
        throw e;
    }
    return fileHandle;
}

例如,使用路径 raw 和那里的文件名,我在该行收到 ArrayIndexOutOfBoundsException

Field[] f = subClass[i].getDeclaredFields();

因为 subClass.length 是 0。

如果不混淆的话,这个东西工作得很好,所以我认为问题出在混淆器上。

我尝试使用不同的方法来使其不会混淆 R 类,如下所示:

-keep public class headwayEnt.HotshotEngine.Resource.ENG_Resource { *; }
-keep class headwayEnt.HotshotEngine.** { *; }
-keep class **.R$*
-keep public class headwayEnt.Blackhole_Darksun.R { *; }
-keep public class headwayEnt.Blackhole_Darksun_Full.R { *; }
-repackageclasses ''
-keep public class **.R {
  public *;
}
-keep public class **.R$* {
  public *;
}

但仍然不起作用。

我必须提到,我的所有代码都在一个库 (headwayEnt.Blackhole_Darksun) 中,并且我在 headwayEnt.Blackhole_Darksun_Full 中引用了该库。基本上我正在使用相同的代码构建两个版本,一个用于完整版本,一个用于免费演示。所有这些混淆都发生在应用程序中,而不是在引用的库中(只是为了清楚起见)。


这应该有效:

-keepattributes InnerClasses

-keep class **.R
-keep class **.R$* {
    <fields>;
}

The InnerClasses属性是获取任何内容所必需的Class$getDeclaredClasses()。 -keep 选项对于保留相关类和字段及其原始名称是必需的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Proguard 使 Android 应用程序中的 R 类反射不再起作用 的相关文章

随机推荐

  • iOS 8 远程通知 - 我什么时候应该调用 registerForRemoteNotifications()?

    正如苹果关于推送通知的官方信息页面所述 设备令牌可能会更改 因此您的应用程序需要重新注册每次启动时 我试图理解他们所说的 每次启动 是什么意思 这是否意味着我必须在 AppDelegate 中的 didFinishLaunchingWith
  • Firebase Firestore 与侦听器的成本

    有几个与消防成本相关的问题 但我找不到能够澄清我脑海中问题的问题 我有两个案例 我想知道每种情况下的估计成本 文档读取次数 假设我有一个显示 10 个用户的一页应用程序 打开应用程序会将侦听器附加到 userList 集合并侦听该集合中的
  • 具有纤薄框架的读取令牌

    我正在使用 SlimFramework 和 JWT 来处理基于登录名和密码的基于令牌的身份验证 我成功登录并发送令牌作为响应 这是我的代码
  • 在 Hive 中创建临时表?

    Hive 支持临时表吗 我在 apache 文档中找不到它 从 Hive 0 14 0 开始感谢 hwrdprkns 的评论 从 Hive 0 14 0 开始 支持临时表https cwiki apache org confluence d
  • ASP.NET MVC RC - 使用代码隐藏创建 MVC 用户控件

    尝试在候选版本中创建一个 MVC 用户控件 但我无法使用代码隐藏文件来创建一个 MVC 视图页面也是如此 在 Beta 版中创建视图会产生代码隐藏 我错过了什么吗 代码隐藏有点违背了 MVC 框架的目的 功能应该与视图分离 MVC 团队认为
  • 确保 C++ 中的 OpenGL 兼容类型

    OpenGL 缓冲区对象支持各种明确定义宽度的数据类型 GL FLOAT是32位的 GL HALF FLOAT是16位的 GL INT是 32 位 如何确保 OpenGL 的跨平台和面向未来的类型 例如 喂食float数据从 C 数组到缓冲
  • .NET 中通过 Process.Start 生成的进程会挂起线程

    我们的应用程序有一个后台线程 它通过以下方式生成一个进程System Diagnostics Process Process Start new ProcessStartInfo FileName url UseShellExecute t
  • Java 运行时 ClassNotFoundException

    只是有一个关于我遇到的奇怪的运行时错误的问题 我正在使用一个 JSON 服务器 当外部源提示时 该服务器会响应 JSON 对象 然而 到目前为止 我只是尝试在发送 JSON 对象之前启动并运行它 我的代码编译时没有指定任何类路径 但是当涉及
  • Java 8 forEach 带索引[重复]

    这个问题在这里已经有答案了 有没有办法建立一个forEachJava 8 中使用索引迭代的方法 理想情况下我想要这样的东西 params forEach idx e gt query bind idx e 我现在能做的最好的事情就是 int
  • MySQL 5.7 无法匹配两个汉字

    表TB title keywords 企业贷款 该如何看懂银行流水 出口退税 贷款 现金流量表 利润表 最高人民法院关于审理民间 企业贷款 合同法 贷款 中国宏观经济数据点评 企业贷款 贷款 ngram token size 2 FULLT
  • iOS Swift didBeginContact 没有被调用

    这两天我一直在努力让两个SKSpriteNode注册碰撞并唤起didBegin contact 我已经设置了他们的位掩码 categoryBitMask contactTestBitMask and collisionTestBitMask
  • 在子文件夹中运行的 Angular 7 中的路由无法正常工作

    我们正在努力将我们的应用程序迁移到新的 Angular 版本 旧的 Angular JS 是它自己的应用程序 存储库 由 NET Framework 4 5 2 ASP NET MVC 应用程序提供服务 该应用程序会将每个调用路由到Home
  • Python:我尝试使用 tabula:ModuleNotFoundError:没有名为“tabula”的模块

    我尝试使用 python 模块 tabula 但显然我已经安装失败了 我只是使用了代码 import tabula 但是 我收到以下错误消息 ModuleNotFoundError No module named tabula 有什么想法吗
  • 带有 ExtJS 4 存储的 HTTP 标头

    我已经实例化了几家商店 但在某个时刻 我会在所有这些中添加一个 HTTP 标头 我怎样才能用 ExtJS 4 做到这一点 假设您使用的是 ajax 代理 您可以更新headers http docs sencha com ext js 4
  • (使用 SSH 运行命令时出错)命令行:第 0 行:配置选项错误

    错误消息 命令行 第 0 行 错误的配置选项 sh ssh i rundeck rsa key o StrictHostKeyChecking no o email protected cdn cgi l email protection
  • window.onbeforeunload - 在 Angular2 中导入

    我正在尝试使用window onbeforeunload在我的项目中 但我不知道如何使用它 我尝试过两种方式 1st way window on beforeunload function e return Are you sure you
  • 重定向到屏幕和管道

    我想将一些输出传输到另一个程序并显示进度条 代码看起来像这样 echo Progress for i in 1 10 do echo i echo gt screen sleep 1 done xargs echo where screen
  • 如何使用 pip 进行 pyenv?

    我在 Mac 上安装了 pyenv 来管理不同的 python 版本 之前 我有系统默认的 python 2 7 位于 Library Frameworks Python framework Versions 2 7 我还有 python3
  • SW2 更新后如何修复索尼 SmartWatch 2 上的自定义表盘时间 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 背景 索尼于 2014 年 12 月发布了索尼 SmartWatch 2 的更新 虽然更新为手表添加了新功能 但不幸的是 它导致了自定义表盘
  • Proguard 使 Android 应用程序中的 R 类反射不再起作用

    自从我尝试在 Google Play 上发布它以来 我已经在我的项目中激活了 proguard 尽管 proguard android txt 有 keepclassmembers class R public static