Как мне разработать приложение для конкретной сборки AOSP из Android Studio? - PullRequest
0 голосов
/ 17 ноября 2018

Мой текущий телефон (Pixel 2 XL) работает под сборкой PQ1A.181105.017.A1. Согласно source.android.com , это означает, что он был собран из ветки android-9.0.0_r16. Глядя на исходный файл из этой конкретной ветки, например SignalStrength.java , есть открытый метод getWcdmaRscp (). Однако, похоже, что этот метод был добавлен после выпуска SDK версии 28, поэтому, если я пытаюсь вызвать его из моего приложения в Android Studio при таргетинге на 28, он не собирается.

Я предполагаю, что мой телефон с удовольствием позволит мне вызвать соответствующий метод, так как я могу настроить мою Android Studio так, чтобы она могла работать на этой версии фреймворка?

Кажется, мне нужен новый framework.jar, но где я могу это найти? Пожалуйста, не говорите мне, что мне нужно скачать и собрать все компоненты AOSP локально.

Ответы [ 2 ]

0 голосов
/ 17 ноября 2018

Вам не нужен весь framework.jar

Хотя одним из способов было бы использование отражения, как предложил TheWanderer, другой вариант - добавить единственный исходный файл, с которым вы связаны, SignlaStrength.java, в свойproject.

Вам просто нужно убедиться, что вы добавили его в исходный путь к пакету / android / telephony

Студия будет использовать его для компиляции для разрешения сигнатур методов, но при запуске на телефоневызовы пройдут к исходному классу фреймворка.Я не видел в файле какого-либо непубличного импорта, но если он не компилируется, вам, возможно, придется превратить его в заглушку, удалив некоторые внутренние функции.

0 голосов
/ 17 ноября 2018

Я сомневаюсь, что он был добавлен после выпуска API 28.Он помечен @hide, что означает, что когда SDK был создан, он не был встроен. Он все еще находится в самой среде, но Android Studio этого не знает.

Чтобы обойти это, выПридется использовать отражение.Что-то вроде:

try {
    Method getWcdmaRscp = SignalStrength.class.getMethod("getWcdmaRscp");
    int rscp = Integer.parseInt(getWcdmaRscp.invoke(signalStrength).toString()); //signalStrength is the instance you have
} catch (Exception ignored) {}

Однако это, вероятно, не сработает.Android Pie ввел ограничения на доступ к скрытым методам и классам.В Oreo вы можете просто использовать отражение.В Pie большинство классов, к которым вы пытаетесь получить доступ, выдают исключение ClassNotFound или NoSuchMethodError, поскольку система запрещает доступ к ним сторонним приложениям.Некоторые скрытые API по-прежнему доступны, но окончательного списка нет.

...