Я хочу перестроить Android SDK (или, скорее, только android.jar), чтобы включить скрытые и внутренние API.
Я не смог найти никакой документации или обсуждения того, как это сделать. У меня уже настроена среда сборки Ubuntu CyanogenMod, которая может создавать cm7.
Теперь я прочитал, что make SDK создаст SDK, но я хочу создать SDK, который включает методы и поля, которые помечены как скрытые с помощью @hide. Это возможно?
Я хочу внести изменения в приложение, использующее скрытый API, и для его перестройки я хотел бы использовать модифицированный SDK.
android
android-sdk-2.3
android-source
Томас Хофманн
источник
источник
@Hidden
ярлык API, к которому хотите получить доступ, затем выполнитьmake update-api
иmake SDK
создать свой собственный SDK.Ответы:
Я всегда делаю это, чтобы использовать скрытый API.
источник
.iml
файл модуля и перенести желаемую библиотеку<orderEntry>
до Android SDK . К сожалению, этот метод не является постоянным, так как файл будет перезаписан после нажатия кнопки gradle-sync.Я провел некоторое расследование по этому поводу, и мой вывод простой: это невозможно сделать без небольшой работы. Прочтите оставшуюся часть этого ответа, чтобы узнать о том, что я нашел.
android.jar
фактически состоит из «общедоступного API»framework.jar
иcore.jar
находитсяsystem/frameworks/
на устройстве.android.jar
- это своего рода то, что я бы назвал заголовком библиотеки Java, вся реализация в фактическом байтовом коде - это просто athrow 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
инструмент. (К сожалению.)источник
@hide
аннотации, он «просто» использует.defs
файл, описывающий, какие пакеты / классы / поля должны быть включены в API аддона.$(hide)
, ты сбиваешься с толку.$(hide)
это просто префикс в make-файлах, чтобы скрыть фактическую командную строку выполняемой программы, не более того, и он используется практически везде. Это не имеет никакого отношения к Android SDK или@hide
аннотации в исходном коде.Мы могли восстановить файлы * .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-файлы ...» (при условии, что вы используете Eclipse ADT).
Project → Properties → Java Build Path → Libraries → Add External JARs
... → (Выберитеcore-dex2jar.jar
иframework-dex2jar.jar
сверху).Это позволит вам использовать внутренний API и некоторые API Java 7. (Сгенерированный APK, насколько я понимаю, не содержит фактического кода из JAR.)
источник
/system/framework/core.odex
,/system/framework/framework.odex
и , вероятно , больше. Их можно deodexed (java -jar baksmali-2.0.3.jar -d system.framework -x system.framework/core.odex -o core
) и reodexed (java -jar smali-2.0.3.jar -x -o core.dex core
), и только после этогоdex2jar core.dex
они выполнят свою работу.Для Lollipop поток немного отличается:
Получите /system/framework/arm/boot.oat с устройства Lollipop
Используйте 'java -jar oat2dex.jar boot boot.oat'
ps: возможно, вам нужно повторить шаги 4-6 для 'framework_classes2.dex'
источник
Вы можете загрузить измененные
android.jar
API для использования в качестве скрытых API из этого репозитория . Следуйте инструкциям там.источник
DroidCon 2011
Здесь Эрик Хеллман из Sony Ericson объясняет, как получить доступ к скрытым API Android:
http://vimeo.com/30180393 (хм, ссылка не работает).
Перейти на веб-страницу DroidCon. День 2, прокрутите вниз до Использование скрытого API , 10:15 и вы можете посмотреть его там.
Ссылки умирают!
Я нашел вот это: http://skillsmatter.com/podcast/os-mobile-server/hidden-api не знаю, как долго он будет работать
источник
Попробуйте посмотреть на это :
источник
Однажды я написал несколько сценариев Groovy для извлечения файлов java из проверки репо с http://source.android.com/, а затем их компиляции без необходимости в полной цепочке инструментов для компиляции всех источников Android, включая необходимые другие шаги ( упаковка, создание ресурсов и т. д.).
Их можно найти здесь:
https://github.com/thoutbeckers/CollectAndroid
Но наверняка это потребует обновления для чего-либо после Gingerbread, в основном путем установки правильных каталогов в "rootdirs" в файле конфигурации (CollectConfig.groovy).
В то время я регулярно использовал это для разработки со всеми доступными скрытыми API и источниками (также проблемными в то время).
Как упоминалось в другом месте, com / android / internal / ** по-прежнему будет скрыт в последних версиях ADT из-за добавленного правила доступа.
источник
Длинный ответ сработал для меня, но мне все еще не хватало некоторых необходимых мне классов, в частности android.provider.Telephony. Я смог добавить это так:
Распакуйте файл framework.jar
mkdir /tmp/framework cp framework.jar /tmp cd /tmp/framework jar xvf ../framework.jar mv android classes
Создайте репозиторий Android, который создаст каталог out / target / common / obj / JAVA_LIBRARIES.
Найдите недостающие классы
$ 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 /tmp/framework 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 /tmp/framework cp -r /path/to/out/target/common/obj/JAVA_LIBRARIES/*/classes . cd classes jar cvf ../framework.jar .
источник
Я не могу комментировать, но это в основном комментарий к отличному ответу @ 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, у меня есть дополнительная банка. На моем HTC One даже есть framework3.jar.
источник