我正在使用反射来调用AudioManager.startBluetoothSco()方法。它必须通过反射完成,因为它只存在于2.2或更高版本的SDK中,但我的应用程序是为最低版本的2.0构建的。如果我只是在不使用ProGuard的情况下编译我的应用程序,一切正常 - 在2.2中正确调用metod,在较低版本中根本不调用。但是当我使用ProGuard时,它根本不起作用。我假设在ProGuard配置中有一个KEEP语句可以解决这个问题,但我无法弄清楚它应该是什么。以下是我的代码中的3行:
AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
Method startBT = AudioManager.class.getMethod("startBluetoothSco");
startBT.invoke(am);
答案 0 :(得分:1)
我建议您使用延迟加载而不是反射 - 它更快,我认为ProGuard也可以正常运行: http://android-developers.blogspot.com/2010/07/how-to-have-your-cupcake-and-eat-it-too.html
以下是我当前项目的一个简单示例,我在其中激活StrictMode(如果可用):
public abstract class StrictModeUtil {
private static class GingerbreadAndBeyond extends StrictModeUtil {
private static class Holder {
private static final GingerbreadAndBeyond INSTANCE = new GingerbreadAndBeyond();
}
public GingerbreadAndBeyond() {
// we just enable StrictMode here, but only in developer mode
if (C.D) {
android.os.StrictMode.enableDefaults();
}
}
}
public static StrictModeUtil getInstance() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
return GingerbreadAndBeyond.Holder.INSTANCE;
} else {
// we don't need an implementation before Android 2.3
return null;
}
}
}