在Android应用程序中使用ProGuard和startBluetoothSCO()的反射

时间:2011-02-22 14:37:07

标签: android reflection bluetooth proguard

我正在使用反射来调用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);

1 个答案:

答案 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;
        }
    }

}