3

我正在使用反射来调用 AudioManager.startBluetoothSco() 方法。它必须通过反射来完成,因为它只存在于 2.2 或更高版本的 SDK 中,但我的应用程序是为 2.0 的最低版本构建的。如果我只是在不使用 ProGuard 的情况下编译我的应用程序,一切都会正常工作——metod 在 2.2 中被正确调用,而在较低版本中则完全没有。但是当我使用 ProGuard 时,它根本不起作用。我假设 ProGuard 配置中有一个 KEEP 语句可以解决这个问题,但我不知道它应该是什么。这是我的代码中的 3 行:

AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);
Method startBT = AudioManager.class.getMethod("startBluetoothSco");   
startBT.invoke(am);
4

1 回答 1

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

}
于 2011-02-22T14:56:54.013 回答