Приложение для создания AOSP с библиотеками jni

#android #android-source #ninja

#Android #android-исходный код #ниндзя

Вопрос:

Я пытаюсь создать приложение для Android внутри AOSP.

Я определил Android.bp файл следующим образом

 cc_prebuilt_library_shared {
    name: "libPrintString",
    target: {
        android_arm: {
            srcs: ["lib/libPrintString.so"],
        },
        android_arm64: {
            srcs: ["lib64/libPrintString.so"],
        },
    },
    strip: { none:true, },
}

java_import {
    name: "stringutils",
    jars: ["libs/stringutils.jar"],
}

android_app {
    name: "HelloWorld",
    srcs: ["src/**/*.java",],
    platform_apis: true,
    product_specific: true,
    certificate: "platform",
    privileged: true,
    static_libs: [
        "com.google.android.material_material",
        "androidx-constraintlayout_constraintlayout",
        "stringutils",
    ],
    jni_libs: ["libPrintString"]
}

 

Я поместил свое приложение в /packages/apps папку, проект имеет следующую структуру

   HelloWorld
  - Android.bp
  - AndroidManifest.xml
    lib
    - libPrintString.so
    lib64
    - libPrintString.so
    libs
    - stringutils.jar
    res
    src
 

Когда я вызываю make, я получаю сообщение об ошибке

 FAILED: ninja: 'out/target/product/mydroid/product/lib64/libPrintString.so', needed by 'out/target/product/mydroid/product.img', missing and no known rule to make it
 

Может кто-нибудь, пожалуйста, помочь мне найти решение?

Ответ №1:

Ваше HelloWorld определение приложения обладает этим свойством product_specific: true , что означает, что приложение перейдет к /product разделу и будет искать библиотеки /product/lib*/ .
Но в вашем libPrintString определении библиотеки нет product_specific: true , что означает, что библиотека переходит к system/lib*/ .

Так что ошибка имеет смысл.

Чтобы решить вашу проблему, вы должны добавить это свойство product_specific: true в определение вашей библиотеки.

 cc_prebuilt_library_shared {
    name: "libPrintString",
    target: {
        android_arm: {
            srcs: ["lib/libPrintString.so"],
        },
        android_arm64: {
            srcs: ["lib64/libPrintString.so"],
        },
    },
    strip: { none:true, },
    product_specific: true
}
 

Комментарии:

1. Я следил за этим, но .so файл не является частью apk. Мне пришлось выполнить полную сборку, чтобы получить файл в /system каталоге моей цели.

Ответ №2:

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

Как создать приложение для Android с системными привилегиями

Я все еще не до конца понимал, почему оно не работало в начале, скорее всего, потому, что каким-то образом моя система сборки не очищала старые библиотеки, но теперь все работает правильно.

Комментарии:

1. В упомянутой статье я не видел Android.bp , о каком из них идет речь. Итак, кажется, что вы используете другой подход ( Android.mk сборку) для решения данной проблемы, и это означает, что проблема с использованием Android.bp для таких целей осталась, я прав?

2. Ах, да, вы правы, я не пробовал с файлом .bp, я сделаю это и посмотрю, возможно ли это, @NikolayKhilyuk Спасибо за ваш отзыв.