Замените только framework.jar и соответствующие библиотеки на Android MarshMallow

Кто-нибудь знает шаги для замены frameworks.jar и соответствующих библиотек на устройстве Android Marshmallow?

Моя работа заключается в том, чтобы изменить исходный код фреймворка Android Marshmallow, выполнить полную сборку, затем обновить устройство, а затем проверить результат. Это занимает около 1,2 часа каждый раз.

Это нормально, если я делаю это 1,2,3 раза, но на самом деле мне пришлось повторять его даже 100 раз, если моя модификация не работает. Но я только модифицирую только небольшой фрагмент кода в фреймворках /, поэтому я думаю, что это сэкономит мне много времени, если я смогу перестроить только фреймворки/модуль в коде Android и заменить только фреймворки/часть на устройстве.

Я знаю, как использовать mmm для восстановления только фреймворков/модулей. Но я не знаю, как заменить фреймворки/часть на устройстве, потому что просто замените frameworks.jar не работает в случае Marshmallow.

Ответ 1

Предполагая, что вы изменяете вещи под frameworks/base/, откуда он приходит framework.jar, шаги, которые я использую:

  • Если у вас уже есть полная сборка, используйте команду mm в каталоге, в котором вы изменяете какой-либо код. Это быстрее, чем mmm, поскольку он еще не компилирует зависимостей структуры.

  • Перейдите в каталог <aosp-root>/out/target/product/<product-name>/system/framework/ и получите элементы framework.jar и services.jar.

  • Перейдите в каталог <aosp-root>/out/target/product/<product-name>/system/lib/ и получите любой файл libandroid*.so.

  • С уже установленным устройством adb push *.jar /system/framework/.

  • adb push *.so /system/lib/.

  • Factory reset устройство и перезагрузите его.

Изменения, внесенные в вашу структуру, могут теперь работать. Если ваше целевое устройство - 64 бита, замените lib на lib64 на указанные выше адресаты.

Объяснение

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

  • framework.jar: API, доступные для приложений
  • services.jar: Реализация менеджеров и системных служб, расположенных в frameworks/base/services.
  • libandroid*.so: Библиотеки, созданные из собственного кода (C/С++), такие как .cpp файлы, расположенные в frameworks/base/core/jni.

Но, как правило, каждый Android.mk внутри фреймворков будет генерировать хотя бы один вывод, названный переменной LOCAL_MODULE, а тип модуля зависит от следующей инструкции include:

# JAR file
include $(BUILD_JAVA_LIBRARY)

# Library to be used by other modules
include $(BUILD_SHARED_LIBRARY)

# Executables
include $(BUILD_EXECUTABLE)

Например, папка frameworks/base/cmds генерирует библиотеку Java и исполняемый файл для каждого элемента внутри него, например команду pm обычно используется для установки приложений через ADB. В любом случае это правило: библиотеки Java переходят к /system/framework/, общие библиотеки идут в /system/lib/, а исполняемые файлы идут в /system/bin.

Более официальную информацию о Android.mk можно найти здесь, но она не охватывает все переменные и макросы, используемые системой Android Build System, Я получаю большую часть этой информации из самого кода AOSP.

Надеюсь, что это поможет.