工作小笔记——利用反射需要注意的问题
更新日期:
文章目录
java 中的反射可以实现很多方便的功能。例如在配置文中写一些布局文件,运行的时候载入配置文件,然后利用反射创建配置文件中的对象(android 的 LayoutInflater 就是利用反射的)。
运用得好的话,会很方便,但是需要注意一点。混淆过后,就导致通过名字创建对象的反射机制无法正确的找到 class 。这个问题我在改 framework 的 SystemUI 出现过,我自己弄了一个东西通过 xml 去实现一些自定义的界面,然后里面就用到反射了。刚开始 eng debug 模式下爽歪歪,后面发正式版本,换成 user release 模式就给跪了,各种 class not found 的异常。
后来发现是混淆的问题,eng 模式是不带混淆的,user 模式才开启混淆。要用反射的话,就不要混淆要使用反射的类的构造函数,或是某些你反射中要用到的方法。
在对应的模块的 proguard.flags 的文件中增加配置就行了:
-keep class com.android.systemui.statusbar.tablet.TabletStatusBarService { public void notificationIconsClicked(android.view.View); public void systemInfoClicked(android.view.View); public void recentButtonClicked(android.view.View); public void toggleLightsOut(android.view.View); } -keep class com.android.systemui.statusbar.policy.KeyButtonView { public float getDrawingAlpha(); public float getGlowAlpha(); public float getGlowScale(); public void setDrawingAlpha(float); public void setGlowAlpha(float); public void setGlowScale(float); } -keep class com.android.systemui.statusbar.tv.TvStatusBar -keep class * extends com.android.systemui.statusbar.toggle.NotificationToggleController {(...); } -keep class com.android.systemui.statusbar.toggle.NotificationToggleScroller { public void setScrollPos(int); public int getScrollPos(); }
下面那几个 toggle 相关就是我自己增加的,其它的都是系统原来 SystemUI 的。这个问题以后要注意一下,别调试的时候乐呵呵,发布之后各种崩溃一时半会还不知道原因。