文章目录

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 的。这个问题以后要注意一下,别调试的时候乐呵呵,发布之后各种崩溃一时半会还不知道原因。

文章目录