跳转到主要内容
PRODUCT DOCUMENTS

快速找到所需文档,高效完成接入与排障

浏览产品文档与友盟 Skill,展开目录并阅读正文。

[SA10219]混淆类问题

SA10219

关键字:

代码混淆、NoSuchMethod、混淆后运行报错

问题描述:

问法1: 为什么用proguard混淆后,【友盟+】AndroidSDK的一些功能不可用?

问法2: 代码混淆前SDK工作正常,混淆后运行时报错,提示NoSuchMethod,如何解决此问题?

问法3: 使用umeng-crash-vx.x.x.aar插件和OAID相关插件混淆如何设置?

解决方案:

  • 使用umeng-crash-vx.x.x.aar插件和OAID相关插件,请您加入混淆设置,详细参考集成文档的混淆设置:查看文档
  1. -keep class com.uc.** {*;}
  2. -keep class com.zui.** {*;}
  3. -keep class com.miui.** {*;}
  4. -keep class com.heytap.** {*;}
  5. -keep class a.** {*;}
  6. -keep class com.vivo.** {*;}
  • 如果您的应用使用了proguard代码混淆, 请在您工程混淆配置文件中添加
  1. -keepclassmembers class * {
  2. public <init>(org.json.JSONObject);
  3. }

这是由于SDK中的部分代码使用反射来调用构造函数, 如果被混淆掉, 在运行时会提示”NoSuchMethod”错误。

  • 另外,由于SDK需要引用导入工程的资源文件,通过了反射机制得到资源引用文件R.java,但是在开发者通过proguard等混淆/优化工具处理 apk时,proguard可能会将R.java删除,如果遇到这个问题,请在proguard配置文件中添加keep命令如:
  1. -keep public class [您的应用包名].R$*{
  2. public static final int *;
  3. }
  4. -keep class com.umeng.** {*;}
  • 把[您的应用包名] 替换成您自己的包名,如com.yourcompany.example。如果您使用5.0.0及以上版本的SDK,请添加如下命令:
  1. -keepclassmembers enum * {
  2. public static **[] values();
  3. public static ** valueOf(java.lang.String);
  4. }