Intereting Posts
Android Studio: автоматическая сборка, подобная Eclipse Не удалось удалить подписку в приложении из моей консоли разработчика Google Play Как отправить объект JSON через Request с Android? OnClick в EditText внутри TextInputLayout, внутри RecyclerView Сделайте анимацию активности сверху донизу Как конвертировать миллисекунды на сегодняшний день в SQLite Фильтр Intent для запуска и отправки активности Проблема с передачей байта через jni на C на Android Android / Phonegap – onClick () не работает Android Dialog, держите диалог открытым, когда кнопка нажата Как нарисовать круг, прямоугольник вручную на видеоролике Android Как реализовать кнопку в ViewPager? Почему мое приложение в списке приложений не открывает файл txt? Не удалось добавить оконный токен android.os.BinderProxy недействителен; Работает ли ваша деятельность? Перекрывается панель состояния, когда отображается фрагмент диалога, только в Android4.4

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

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

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

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

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

Solutions Collecting From Web of "Как создать SDK Android со скрытыми и внутренними API-интерфейсами?"

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

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

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


android.jar фактически состоит из «public api» framework.jar и core.jar который находится в system/frameworks/ на устройстве. android.jar – это то, что я бы назвал заголовком библиотеки Java, вся реализация в фактическом throw new RuntimeException("stub"); коде – это просто 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 , если вы хотите включить только определенные части, просто удалите аннотацию @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.

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

 dex2jar core.jar dex2jar framework.jar 

Затем вставьте эти банки с помощью «Добавить внешние JAR …» (если вы используете Eclipse ADT)

  • Щелкните правой кнопкой мыши Project → Properties → Java Build Path → Libraries → Добавить внешние JAR … → (Выберите core-dex2jar.jar и framework-dex2jar.jar сверху).

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

DroidCon 2011

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

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

Перейти на веб-страницу DroidCon. День 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.

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

  1. Получить /system/framework/arm/boot.oat с устройства для леденцов

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

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

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

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

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

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

Вы можете использовать три сценария:

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

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

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

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

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

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

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

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

https://github.com/thoutbeckers/CollectAndroid

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

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

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

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

С уважением
/ Johan

Я не могу комментировать, но это в основном комментарий к замечанию @ 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 Emulator для SDK19 у меня есть эта дополнительная банка. На моем HTC One есть даже framework3.jar.

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

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

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