1. 程式人生 > >android 混淆後,反射R檔案內部類報錯

android 混淆後,反射R檔案內部類報錯

專案中由於用到了下面方法來 反射R檔案獲取layout的佈局id。但是混淆後,發現報錯 android.content.res.Resources$NotFoundException: Resource ID #0x0
經過網上查詢都是在 proguard-rules.pro 中加 -keep class *.R$ {*;} ,但是沒有徹底解決,最後加上
-keepattributes InnerClasses 就可以了

public  int getIdByName(Context context, String className, String name) {
        String
packageName = context.getPackageName(); Class r = null; int id = 0; try { r = Class.forName(packageName + ".R"); Class[] classes = r.getClasses(); Class desireClass = null; for (int i = 0; i < classes.length; ++i) { if
(classes[i].getName().split("\\$")[1].equals(className)) { desireClass = classes[i]; break; } } if (desireClass != null) { id = desireClass.getField(name).getInt(desireClass); } } catch (Exception e) { e.printStackTrace(); } return id; }

最終解決辦法:

在proguard-rules.pro 中加上

-keep class *.R$ {*;}
-keepattributes InnerClasses

備註:
如果專案中用泛型,混淆後報錯
java.lang.ClassCastException: java.lang.Class cannot be cast to java.lang.reflect.ParameterizedType,可以加上

-keepattributes Signature (避免混淆泛型)