Как создать Android SDK со скрытыми и доступными внутренними API? - PullRequest
80 голосов
/ 25 октября 2011

Я хочу перестроить Android SDK (точнее, только android.jar), чтобы включить скрытые и внутренние API.

Я не смог найти какую-либо документацию или обсуждение того, как это сделать.У меня уже есть среда сборки Ubuntu CyanogenMod, которая может собирать cm7.

Теперь я прочитал, что make SDK создаст SDK, но я хочу создать SDK, который включает методы и поля, помеченные как скрытые.используя @hide.Возможно ли это?

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

Ответы [ 10 ]

63 голосов
/ 15 ноября 2012

Это то, что я всегда делаю, чтобы использовать скрытый API.

  1. Построй репо или скачай фляги с https://sites.google.com/site/hippunosource/home/android/androidnohide-apiwo-shi-yongsuru-rifurekushonha-wei-shi-yong
  2. копировать out / target / common / obj / JAVA_LIBRARIES / framework_intermediates / classes.jar (лучше переименовать его в что-то вроде framework_all.jar)
  3. настроить путь сборки вашего проекта -> библиотеки -> добавить этот внешний jar. В порядке заказа и экспорта переместите его вверх и до android.jar
40 голосов
/ 05 марта 2012

Я провел некоторые исследования по этому вопросу, и мой вывод таков: Это невозможно сделать без особых усилий. Прочитайте оставшуюся часть этого ответа, чтобы узнать подробнее о том, что я нашел.


android.jar на самом деле состоит из "public api" framework.jar и core.jar, которые находятся в system/frameworks/ на устройстве. android.jar является своего рода тем, что я бы назвал заголовком библиотеки Java, все реализации в реальном байт-коде являются просто throw new RuntimeException("stub");, это позволяет вам строить против android.jar (например, в Eclipse), но выполнение должно быть выполнено на устройстве или эмуляторе.

Публичный API Android SDK определяется классами / методами / полями, которые не с префиксом аннотации @{hide} javadoc. То есть все, что не аннотировано, включено в SDK.

android.jar построен из источников, расположенных в out/target/common/obj/JAVA_LIBRARIES/android_stubs_current_intermediates, который сам генерируется инструментом DroidDoc , расположенным в build/tools/droiddoc.

DroidDoc - инструмент (вероятно, адаптированный из javadoc или использующий javadoc), который генерирует фактическую документацию по Android SDK. Как побочный эффект, и, вероятно, потому что он уже разбирает весь Javadoc, он также извергает заглушки Android, которые затем компилируются в android.jar, который распространяется в SDK.

Таким образом, чтобы включить скрытый материал, вы можете, если хотите включить только определенные части, просто удалите аннотацию @hide и пересоберите SDK.

Однако, если вы хотите включить все скрытые части, все становится намного сложнее. Вы можете изменить DroidDoc (соответствующий источник в build/tools/droiddoc/src/Stubs.java) так, чтобы ничего не было обнаружено как скрытое. Это довольно тривиально, и я попробовал это, однако генерируемые заглушки вообще не компилируются.

К настоящему моменту я пришел к выводу, что это просто невозможно. Заглушки, созданные при удалении части DroidDoc, которая обнаруживает скрытые аннотации, просто не компилируются, и для правильной компиляции потребуется немало усилий.

Итак, мой ответ на ваши вопросы: нет, этого нельзя сделать, не выполнив много работы. К сожалению.


Примечание по поводу инструмента mkstubs. mkstubs используются при создании дополнения SDK , то есть надстроек, которые вы можете найти в диспетчере Android SDK от поставщиков, например, Samsung предоставляет вам дополнительный API для вещей, характерных для телефонов Samsung. mkstubs делает то же самое, что и процесс создания заглушек DroidDoc, однако он не использует аннотации @hide, он использует файл .defs, описывающий, какие пакеты / классы / поля следует включать или исключать из дополнения SDK.

Однако все это не имеет отношения к вопросу, поскольку сборка Android SDK не использует инструмент mkstubs. (К сожалению.)

29 голосов
/ 25 ноября 2012

Мы можем восстановить файлы * .jar с платформы Android.

Сначала подключите ADB к вашему устройству.Затем выполните:

adb pull /system/framework/core.jar .
adb pull /system/framework/framework.jar .

core.jar содержит стандартные библиотеки Java (java.*), а framework.jar содержит библиотеки Android (android.*).Это пока не используется, так как фактические файлы представлены в формате DEX, а не в формате JAR.

Мы могли бы преобразовать эти * .jar в формате DEX в реальные JAR-файлы, используя такие инструменты, как dex2jar :

dex2jar core.jar
dex2jar framework.jar

Затем извлеките эти jar-файлы, используя «Добавить внешние JAR-файлы».... "(при условии, что вы используете Eclipse ADT)

  • щелкните правой кнопкой мыши Project → Properties → Java Build Path → Libraries → Add External JARs ... → (выберите core-dex2jar.jar и framework-dex2jar.jar сверху).

Это позволит вам использовать внутренний и некоторые API Java 7.(Насколько я вижу, сгенерированный APK не содержит никакого реального кода из файлов JAR.)

16 голосов
/ 22 февраля 2015

Для Lollipop поток немного отличается:

  1. Получить /system/framework/arm/boot.oat с устройства lollipop

  2. Использование'java -jar oat2dex.jar boot boot.oat'

  3. Вы получите две папки: dex и odex.Перейдите к dex и сделайте 'java -jar dex2jar.jar framework.dex'
  4. Переименуйте получившийся framework.jar в .zip, извлеките и найдите нужные классы
  5. Goв [sdk_path] / platform / [target_platform] и распакуйте android.jar (сначала переименуйте его в zip).
  6. Скопируйте файлы из извлеченного фреймворка в извлеченный android.jar.Затем сожмите в zip и переименуйте в .jar:)

ps: вероятно, вам нужно повторить шаги 4-6 для 'framework_classes2.dex'

15 голосов
/ 25 октября 2011

DroidCon 2011

Здесь Эрик Хеллман из Sony Ericson объясняет, как получить доступ к скрытому API Android:

http://vimeo.com/30180393 (ссылка Хмм непохоже на работу).

Перейдите на веб-страницу DroidCon. День 2 . Прокрутите вниз до Используя скрытые API 10: 15 , и вы сможете просмотреть его там.

Ссылки умирают!

Я нашел это: http://skillsmatter.com/podcast/os-mobile-server/hidden-api Не знаю, как долго он будет работать

Официальные API в Android SDK обычнодостаточно для большинства обычных приложений.Однако иногда возникают ситуации, когда разработчику требуется доступ к внутренним системным службам, API и ресурсам, которые не опубликованы в официальных API.К счастью, эти API все еще доступны через некоторые хитрые уловки и часто могут быть полезны при разработке нового и инновационного решения на базе Android.На этом занятии вы узнаете, как получить доступ к этим скрытым и защищенным API-интерфейсам и использовать их, ограничения их использования и некоторые полезные советы о том, как использовать их безопасным и контролируемым образом на устройствах разных производителей и версиях Android.Аудитория увидит несколько продвинутых демонстраций, которые вы обычно не можете сделать с Android.Ожидайте довольно продвинутую сессию со множеством идей о внутреннем устройстве платформы Android.

12 голосов
/ 10 ноября 2011

Попробуйте взглянуть на это :

Конечная цель этих статей - дать разработчикам возможность использовать внутренние и скрытые API без использования рефлексии.Если вы выполните все шаги, описанные в следующих нескольких частях, вы сможете использовать Внутренние и Скрытые API, как если бы они были открытыми открытыми API.Не нужно будет размышлять.

Но если вы используете эти непубличные API-интерфейсы, вы должны знать, что ваше приложение находится под большим риском.По сути, нет никаких гарантий, что API не будут нарушены при следующем обновлении до ОС Android.Нет даже гарантий относительно согласованного поведения устройств разных производителей.Вы полностью по своему усмотрению.

Существует три сценария, по которым вы можете захотеть следовать:

  1. Включение обоих внутренних и скрытых API (сценарий A)
  2. Включить только скрытый API (сценарий B)
  3. Включить только внутренний API (сценарий C)

Сценарий A представляет собой сумму B и C. Сценарий B является самым простым (не требует модификаций плагина ADT Eclipse).

Сценарий A : чтение частей 1 , 2 , 3 , 4 , 5

Сценарий B : читать части 1 , 2 , 3 , 5

Сценарий C :читать части 1 , 2 , 3 , 4 , 5

11 голосов
/ 17 сентября 2015

Вы можете скачать модифицированный android.jar для использования в качестве скрытых API из этого хранилища .Следуйте инструкциям там.

1 голос
/ 18 сентября 2013

Однажды я написал несколько скриптов Groovy для извлечения java-файлов из кассы репозитория из http://source.android.com/ и последующей их компиляции без необходимости полного набора инструментов для компиляции всех исходников Android, включая необходимые другие шаги (упаковка , создание ресурсов и т. д.).

Их можно найти здесь:

https://github.com/thoutbeckers/CollectAndroid

Но наверняка это потребует обновления для чего-либо после Gingerbread, в основном, путем установки правильных каталогов в "rootdirs" в файле конфигурации (CollectConfig.groovy).

В то время я регулярно использовал это для разработки со всеми доступными скрытыми API и источниками (также проблемными в то время).

Как уже упоминалось, com / android / internal / ** будет по-прежнему скрыт в последних версиях ADT из-за исправленного правила доступа.

0 голосов
/ 03 ноября 2014

Длинный ответ работал для меня, но я все еще пропускал некоторые классы, которые мне были нужны, в частности android.provider.Telephony.Я смог добавить его так:

  1. Найти, где находится класс

    $ cd /path/to/out/target/common/obj/JAVA_LIBRARIES
    $ find . | grep "/Telephony.class"
    ./telephony-common_intermediates/classes/android/provider/Telephony.class
    ./android_stubs_current_intermediates/classes/android/provider/Telephony.class
    
  2. Добавить новые классы и перестроить фреймворк JARфайл

    cd /path/to/temp/folder
    cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes .
    cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/telephony-common_intermediates/classes .
    cd classes
    jar cvf ../framework.jar .
    

Или вы можете просто быть ленивым и включить все классы в один файл гигантской фляги:

cd /path/to/temp/folder
cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/*/classes .
cd classes
jar cvf ../framework.jar .
0 голосов
/ 19 июня 2014

Я не могу комментировать, но это в основном комментарий к @ KennyTM (https://stackoverflow.com/a/13550030/2923406) отличный ответ:

Если вы обнаружите следующую ошибку в Eclipse:

The type com.android.internal.util.Predicate cannot be resolved. It is indirectly referenced from required .class   files

(то есть, android.internal. * Недоступно)

Тогда одним из возможных решений является применение того же метода для /system/framework/framework2.jar. Использование эмулятора Android для SDK19 У меня естьэтот дополнительный jar. На моем HTC One есть даже framework3.jar.

...