Добавьте один проект android в качестве библиотеки в приложение AOSP
Я хочу добавить некоторые функции в приложение браузера, запустив действие из другого приложения android. Это дает мне package does not exist
пока я делаю основной проект. Обратите внимание, что я вижу, что AndroidLib успешно встроен в out/target/product/generic/data/app/AndroidLib.apk
вот два android.Mk файлы: AndroidLib(обычное приложение для Android)
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_STATIC_JAVA_LIBRARIES :=
google-ps
android-support-v4
LOCAL_SRC_FILES :=
$(call all-java-files-under, src)
LOCAL_MODULE := AndroidLib
LOCAL_PACKAGE_NAME := AndroidLib
LOCAL_MODULE_TAGS := tests
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := google-ps:libs/google-play-services.jar
include $(BUILD_PACKAGE)
# additionally, build tests in sub-folders in a separate .apk
include $(call all-makefiles-under,$(LOCAL_PATH))
Браузер
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
LOCAL_STATIC_JAVA_LIBRARIES :=
android-common
guava
android-support-v13
android-support-v4
LOCAL_SRC_FILES :=
$(call all-java-files-under, src)
src/com/android/browser/EventLogTags.logtags
LOCAL_PACKAGE_NAME := Browser
LOCAL_PROGUARD_FLAG_FILES := proguard.flags
LOCAL_EMMA_COVERAGE_FILTER := *,-com.android.common.*
# We need the sound recorder for the Media Capture API.
LOCAL_REQUIRED_MODULES := SoundRecorder, AndroidLib
include $(BUILD_PACKAGE)
# additionally, build tests in sub-folders in a separate .apk
include $(call all-makefiles-under,$(LOCAL_PATH))
затем я делаю:
make -j Browser
это дает мне:
packages/apps/Browser/src/com/android/browser/BrowserActivity.java:36: package com.om.AndroidLib does not exist
import com.om.AndroidLib.MainActivity;
3 ответов
обновление
по сути ваша проблема заключается в том, что строка:
LOCAL_REQUIRED_MODULES := SoundRecorder, AndroidLib
сообщает Android build, что Ваш браузер зависит от AndroidLib
строится первым, однако он не будет связан с AndroidLib
в любом случае. Для этого Вам необходимо:
LOCAL_JAVA_LIBRARIES := AndroidLib
за исключением того, что требует AndroidLib
чтобы быть проектом библиотеки java, используя тип сборки:
include $(BUILD_JAVA_LIBRARY)
и библиотеки java не могут включать ресурсы, к сожалению. И нет способа связать одно приложение с другим приложением в системе сборки Android.
мы часто работаем над этим вопросом, и, честно говоря, это немного беспорядок, чтобы сделать это. Но единственное решение, которое мы нашли, - это включить все ресурсы непосредственно в приложения, которые используют эти ресурсы. Извиняюсь.
как сделать AndroidLib
библиотека java и ссылка на нее
ваш Android lib, вероятно, должен быть построен как библиотека java, и не как пакет приложения. Поэтому вместо:
include $(BUILD_PACKAGE)
вы должны:
include $(BUILD_JAVA_LIBRARY)
тогда вы lib будет помещен в out/target/product/generic/system/framework/AndroidLib.jar
наряду с другими системными библиотеками.
Также вам не нужен LOCAL_MODULE_NAME
для lib, это применимо только для приложения. Так что раздевайся.
и вы, вероятно, должны рассмотреть возможность изменения вашего LOCAL_MODULE_TAGS
в:
LOCAL_MODULE_TAGS := user
tests
указывает, что вы lib должны быть построены только для тестирования,user
говорит чтобы построить вам lib для всех пользовательских сборок (и неявно также для инженерных сборок)
в приложения Android.mk
затем вы должны добавить строку:
LOCAL_JAVA_LIBRARIES := AndroidLib
таким образом, что ваше приложение будет построено с AndroidLib
в classpath.
в ВЫ приложения AndroidManifest.xml
вам также нужно поместить библиотеку uses в application
tag:
<uses-library android:name="AndroidLib" />
и последнее, что вам нужно создать XML-файл разрешений, со следующим содержание:
<?xml version="1.0" encoding="utf-8"?>
<permissions>
<library name="AndroidLib"
file="/system/framework/AndroidLib.jar"/>
</permissions>
и обновите файл конфигурации продукта, чтобы xml-файл был развернут в target:
PRODUCT_COPY_FILES += device/XXX/libs/AndroidLib.xml:system/etc/permissions/AndroidLib.xml
заменить device/XXX/libs/
С путем к xml-файлу разрешений.
вот как мы добавляем и используем библиотеку Android в наших сборках Android. Надеюсь, это поможет. :)
Я знаю, что я выкапываю это из могилы немного, но никогда не было ответа на то, как на самом деле включить проект библиотеки Android (или другой apk ресурсы) в AOSP от приложения.
вот что я сделал с двумя проектами. "main" - это основное приложение, для которого я создаю apk. "util" - это служебная библиотека с ресурсами, на которые я ссылаюсь. Оба проекта находятся в внешние/seabold/{пакет}:
Android.mk
в seabold/
LOCAL_PATH := $(call my-dir)
UTIL_PATH := $(LOCAL_PATH)/util
UTIL_JAVA_SRC := $(call all-java-files-under, util/src)
#Filter out if the util library isn't present
UTIL_RES_DIR := $(wildcard $(UTIL_PATH)/res)
include $(call all-subdir-makefiles)
Android.mk
в seabold / main/
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_PACKAGE_NAME := main
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := $(call all-java-files-under, src)
#Since the BUILD_PACKAGE makefile expects java files to be relative paths,
#we need to add the ../ in front of each file (which is stored as relative
#to seabold/
LOCAL_SRC_FILES += $(patsubst %.java,../%.java,$(UTIL_JAVA_SRC))
#Make sure both packages' resources are included
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res $(UTIL_RES_DIR)
#Since we are including resouces for two packages (This app and the util lib),
#we need to tell aapt to generate an R.java for the util package as well
LOCAL_AAPT_FLAGS := --generate-dependencies --extra-packages com.seabold.util --auto-add-overlay
include $(BUILD_PACKAGE)
будьте осторожны здесь, чтобы убедиться, что вы правильно возиться с именами. Для меня файлы, определенные в UTIL_JAVA_SRC
в форме util/src/com/seabold/util/*.java
. Поскольку сценарий сборки для основного приложения ожидает, что файлы java будут относительными путями к местоположению Android.mk
, Я добавляю ../ чтобы правильно добраться до пути библиотеки util.
в ключ для ресурсов-LOCAL_AAPT_FLAGS. Это говорит упаковщику ресурсов убедиться, что он генерирует R.java для пакета в служебной библиотеке. Без этого все ресурсы утилиты будут помещены в основные приложения R.java, и служебные классы не удастся скомпилировать, потому что его R.java пропадет.
чтобы добавить файл jar предварительной сборки в фреймворк, я сделал это:
-
найдите папку с jar и Android.Mk файл под
prebuilds / разное / общее/
Андроид.МК:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := <jar name>
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := <jar name>.jar
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_MODULE_SUFFIX := $(COMMON_JAVA_PACKAGE_SUFFIX)
include $(BUILD_PREBUILT)
запустите make на Android.файл mk:
make prebuilds/misc/common/Android.mk
добавьте файл jar в фреймворки / base/services / Android.МК:
LOCAL_STATIC_JAVA_LIBRARIES := $(addprefix services.,$(services)) jar-name