Как создать SDK для Android со скрытыми и внутренними API-интерфейсами?

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

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

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

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

Ответ 1

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

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

Ответ 2

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


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

Открытый API SDK для Android определяется классами/методами/полями, которые не имеют префикса с аннотацией @{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.jar, который распространяется в SDK.

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

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

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

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


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

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

Ответ 3

Мы могли бы восстановить файлы *.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)

  • щелкните правой кнопкой мыши по проекту → Свойства → Путь сборки Java → Библиотеки → Добавить внешние JAR... → (Выберите kernel-dex2jar.jar и framework-dex2jar.jar сверху).

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

Ответ 4

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

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

  • Используйте 'java -jar oat2dex.jar boot boot.oat'

  • У вас будет 2 папки: 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'

Ответ 5

DroidCon 2011

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

http://vimeo.com/30180393 (Ссылка Hmm не работает).

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

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

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

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

Ответ 6

Попробуйте посмотреть this:

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

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

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

  • Включить как внутренние, так и скрытые API (сценарий A)
  • Включить только скрытый API (сценарий B)
  • Включить только внутренний API (сценарий C)

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

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

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

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

Ответ 7

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

Ответ 8

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

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

https://github.com/thoutbeckers/CollectAndroid

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

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

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

Ответ 9

Существует сообщение блога на веб-странице Sony Ericsson с разговором и кодом Эрика Хеллманса и некоторыми ссылками, которые, как я думаю, будут вам полезны.

С уважением, /Йохан

Ответ 10

Я не могу комментировать, но это в основном комментарий к @KennyTM (fooobar.com/questions/21662/...) отличный ответ:

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

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

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

Тогда одно из возможных решений - применить тот же метод для /system/framework/framework 2.jar. С помощью Android Emulator для SDK19 у меня есть эта дополнительная банка. На моем HTC One есть даже framework3.jar.

Ответ 11

Длинный ответ работал у меня, но я все еще отсутствовал в некоторых классах, в которых я нуждался, в частности, 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 .