#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 Спасибо за ваш отзыв.