Замена некоторых файлов перед упаковкой системной папки в system.img

Поскольку название говорит само за себя, я хотел бы заменить некоторые файлы в system/bin/ и system/lib/ непосредственно перед созданием system.img.

Точнее, у меня есть несколько готовых .so файлов, которые нужно скопировать поверх существующих. Например libart.so. Обратите внимание, что замена art/ (исходный код изображения) модифицированным исходным кодом изображения не возможна.

Для этого какой mk файл я должен изучить и вставить свой заменяющий код?


person frogatto    schedule 13.06.2017    source источник


Ответы (3)


Вы можете следовать той же структуре, что предложена в этом другом вопросе, но используйте этот макрос:

PRODUCT_COPY_FILES += \
     device/common/my_bin.bin:cache/my_bin.bin \
     device/common/my_so.so:system/art/my_so.so

Это работает следующим образом:

  • Файл копируется слева направо (:).
  • При создании изображения, в данном случае cache или system, оно будет создано с файлами, содержащимися в этих папках.
  • Поскольку мы скопировали наши файлы в это место назначения, при создании system.img наш файл будет сохранен.

Кроме того, порядок, в котором эти файлы копируются, имеет значение. Например, если вы копируете файл, который уже существует, следовательно, вы хотите заменить его. (Как ваш libart.so), вам потребуется ВАШ вызов этой копии, который должен быть выполнен до вызова по умолчанию.

Для этого я рекомендую сделать:

  • source build/envsetup.sh
  • lunch <<device>>
  • mgrep libart.so -> Это выполняет grep через файлы mk, поэтому вы можете увидеть, где делается копия по умолчанию.
  • Вставьте вызовы $(info whatever) в нужные файлы mk, чтобы отследить, где лучше всего добавить свой PRODUCT_COPY_FILES.

Не так просто ответить, куда его добавить. Я никогда не модифицировал libart.so сам, но я скопировал много файлов таким образом, и это работает как шарм.

Я надеюсь, что это сработает и для вашего случая.

person Olaia    schedule 13.06.2017

Быстрый грязный путь к этому:

  1. Скопируйте нужные файлы в out(..)/system/lib или куда угодно после сборки system.img
  2. make snod

Другой способ — использовать Android.mk. Создайте новый каталог в дереве устройств, например, libart-prebuilt. Поместите сюда свою библиотеку, затем создайте файл Android.mk с содержимым

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := libart-prebuilt
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT)/lib
LOCAL_MODULE_STEM := libart
LOCAL_MODULE_SUFFIX := $(TARGET_SHLIB_SUFFIX)
LOCAL_SRC_FILES := libart.so
LOCAL_MODULE_CLASS := SHARED_LIBRARIES

include $(BUILD_PREBUILT)

Теперь просто добавьте libart-prebuilt к PRODUCT_PACKAGES в вашем устройстве.mk

person Bartosz J    schedule 13.06.2017

Также есть возможность добавить бинарную библиотеку .so в качестве пакета продукта, используя параметр PREBUILT_SHARED_LIBRARY в файле .mk: android-aosp">Включить предварительно созданную общую библиотеку в Android AOSP или BUILD_PREBUILT https://stackoverflow.com/a/25682674/1028256

person Mixaz    schedule 13.06.2017