Добавьте один проект 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 предварительной сборки в фреймворк, я сделал это:

  1. найдите папку с 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) 
  1. запустите make на Android.файл mk:make prebuilds/misc/common/Android.mk

  2. добавьте файл jar в фреймворки / base/services / Android.МК:

LOCAL_STATIC_JAVA_LIBRARIES := $(addprefix services.,$(services)) jar-name