Использование ProGuard с отражением для startBluetoothSCO () в приложении для Android - PullRequest
3 голосов
/ 22 февраля 2011

Я использую рефлексию для вызова метода AudioManager.startBluetoothSco ().Это должно быть сделано с помощью рефлексии, так как он существует только в 2.2 или выше SDK, но мое приложение построено для минимальной версии 2.0.Если я просто скомпилирую свое приложение без использования ProGuard, все будет работать нормально - метод запускается правильно в 2.2, а не в более низких версиях.Но когда я использую ProGuard, он вообще не работает.Я предполагаю, что в конфигурации ProGuard есть KEEP, но я не могу понять, каким он должен быть.Вот три строки из моего кода:

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

1 Ответ

1 голос
/ 22 февраля 2011

Я бы порекомендовал использовать ленивую загрузку вместо отражений - это быстрее, и я думаю, что ProGuard также будет работать нормально: http://android -developers.blogspot.com / 2010/07 / как к -имеют-ваш-кекс-и-едят его-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;
        }
    }

}
...