Как создать Android SDK со скрытыми и доступными внутренними API?
Я хочу перестроить Android SDK (точнее, только android.jar), чтобы включить скрытые и внутренние API.
Я не мог найти какую-либо документацию или дискуссию о том, как это сделать. У меня уже есть среда сборки Ubuntu CyanogenMod, которая может собирать cm7.
Теперь я прочитал, что make SDK создаст SDK, но я хочу создать SDK, который включает методы и поля, помеченные как скрытые с помощью @hide. Это возможно?
Я хочу внести изменения в приложение, использующее скрытый API, и для его перестройки я бы хотел использовать модифицированный SDK.
11 ответов
Это то, что я всегда делаю, чтобы использовать скрытый API.
- Создайте репозиторий или скачайте фляги с https://sites.google.com/site/hippunosource/home/android/androidnohide-apiwo-shi-yongsuru-rifurekushonha-wei-shi-yong
- скопируйте out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar (лучше переименовать его в что-то вроде framework_all.jar)
- Сконфигурируйте ваш путь сборки проекта -> библиотеки -> добавьте этот внешний jar. В порядке заказа и экспорта переместите его вверх и до android.jar
Я провел некоторое исследование этого, и мой вывод прост: это не может быть сделано без небольшого количества работы. Прочитайте остальную часть этого ответа для деталей о том, что я нашел.
android.jar
на самом деле состоит из "публичного 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
инструмент. (К несчастью.)
Мы могли бы восстановить файлы *.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.
Мы могли бы преобразовать эти *.jars в формате DEX в настоящие JAR-файлы, используя такие инструменты, как dex2jar:
dex2jar core.jar
dex2jar framework.jar
Затем извлеките эти банки, используя "Добавить внешние файлы JAR..." (при условии, что вы используете Eclipse ADT)
- щелкните правой кнопкой мыши на
Project → Properties → Java Build Path → Libraries → Add External JARs
... → (Выберитеcore-dex2jar.jar
а такжеframework-dex2jar.jar
сверху).
Это позволит вам использовать внутренний и некоторые API Java 7. (Насколько я вижу, сгенерированный APK не содержит никакого реального кода из JAR-файлов.)
Вы можете скачать модифицированный android.jar
для использования в качестве скрытых API из этого хранилища. Следуйте инструкциям там.
Для Lollipop поток немного отличается:
Получить /system/framework/arm/boot.oat с устройства lollipop
Используйте 'java -jar oat2dex.jar boot boot.oat'
- Вы получите две папки: dex и odex. Перейдите к dex и создайте 'java -jar dex2jar.jar framework.dex'
- Переименуйте получившийся framework.jar в.zip, распакуйте и найдите нужные вам классы
- Перейдите в [sdk_path]/platform /[target_platform] и извлеките android.jar (сначала переименуйте его в zip).
- Скопируйте файлы из извлеченного фреймворка в извлеченный android.jar. Затем сожмите в zip и переименуйте в.jar:)
PS: вероятно, вам нужно повторить шаги 4-6 для 'framework_classes2.dex'
Здесь Эрик Хеллман из 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.
Попробуйте посмотреть на это:
Конечной целью этих статей является предоставление разработчикам возможностей внутренних и скрытых API без использования рефлексии. Если вы выполните все шаги, описанные в следующих нескольких частях, вы сможете использовать внутренние и скрытые API, как если бы они были открытыми открытыми API. Там не будет необходимости для размышлений.
Но если вы используете эти непубличные API, вы должны знать, что ваше приложение находится под большим риском. По сути, нет никаких гарантий, что API не будут нарушены при следующем обновлении до ОС Android. Нет даже гарантий относительно согласованного поведения устройств разных производителей. Вы полностью по своему усмотрению.
Есть три сценария, которым вы можете следовать:
- Включить как внутренние, так и скрытые API (сценарий A)
- Включить только скрытый API (сценарий B)
- Включить только внутренний API (сценарий C)
Сценарий A представляет собой сумму B и C. Сценарий B является самым простым (не требует модификаций плагина ADT затмения).
Сценарий A: прочитайте части 1, 2, 3, 4, 5
Ответ Лонга работал на меня, но я все еще пропускал некоторые классы, которые мне были нужны, в частности, android.provider.Telephony. Я смог добавить это так:
Найдите, где находится класс
$ 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
Добавьте новые классы и пересоберите 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 .
Или вы можете просто быть ленивым и включить все классы в один гигантский jar-файл:
cd /path/to/temp/folder
cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/*/classes .
cd classes
jar cvf ../framework.jar .
Однажды я написал несколько скриптов Groovy для извлечения java-файлов из кассы репозитория с http://source.android.com/ а затем для их компиляции без необходимости полного набора инструментов для компиляции всех исходников Android, включая другие необходимые шаги (упаковка, генерирующие ресурсы и т. д.).
Их можно найти здесь:
https://github.com/thoutbeckers/CollectAndroid
Но наверняка это потребуется обновить для чего-либо после Gingerbread, в основном, путем установки правильных каталогов в "rootdirs" в файле конфигурации (CollectConfig.groovy).
В то время я регулярно использовал это для разработки со всеми доступными скрытыми API и источниками (также проблемными в то время).
Как уже упоминалось, com/android/internal/** будет по-прежнему скрыт в последних версиях ADT из-за исправленного правила доступа.
Я не могу комментировать, но это в основном комментарий к превосходному ответу @KennyTM ( /questions/40820025/kak-sozdat-android-sdk-so-skryityimi-i-dostupnyimi-vnutrennimi-api/40820029#40820029):
Если вы обнаружите следующую ошибку в 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 У меня есть эта дополнительная банка. На моем HTC One есть даже framework3.jar.
На веб-странице Sony Ericsson есть пост в блоге с речью и кодом Эрика Хеллмана, а также некоторые ссылки, которые, я думаю, будут вам полезны.
С уважением
/Johan