在AOSP App中添加一个android项目作为库

时间:2013-08-22 04:20:14

标签: android android-ndk android-source android-build android-framework

我想通过从另一个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;

4 个答案:

答案 0 :(得分:13)

<强>更新

基本上你的问题是这一行:

LOCAL_REQUIRED_MODULES := SoundRecorder, AndroidLib

告诉您的浏览器依赖于AndroidLib首先构建的Android版本,但它不会以任何方式链接到AndroidLib。要做到这一点,你需要:

LOCAL_JAVA_LIBRARIES := AndroidLib

除非要求AndroidLib成为java库项目,否则使用构建类型:

include $(BUILD_JAVA_LIBRARY)

遗憾的是,java库不能包含资源。并且无法将一个应用程序链接到Android构建系统中的另一个应用程序。

我们经常解决这个问题,坦率地说这样做有点乱。但我们发现的唯一解决方法是将所有资源直接包含在使用这些资源的应用程序中。遗憾。


如何使AndroidLib成为一个java库并链接到它

你的android lib应该可以构建为java库,而不是app包。 所以而不是:

include $(BUILD_PACKAGE)

您应该这样做:

include $(BUILD_JAVA_LIBRARY)

然后,您将lib与其他系统库一起放在out/target/product/generic/system/framework/AndroidLib.jar中。

此外,对于lib,您不需要LOCAL_MODULE_NAME,它仅适用于某个应用。剥掉那个。

您应该考虑将LOCAL_MODULE_TAGS更改为:

LOCAL_MODULE_TAGS := user

tests表示你的lib应该仅用于测试,user表示要为所有用户构建构建lib(并且隐含地也用于工程构建)


在您的应用Android.mk中,您应该添加一行:

LOCAL_JAVA_LIBRARIES := AndroidLib

这样您的应用就会在类路径中使用AndroidLib构建。


在您的应用AndroidManifest.xml中,您还需要在application标记中放置一个使用库:

<uses-library android:name="AndroidLib" />

最后你需要创建一个权限xml文件,其中包含以下内容:

<?xml version="1.0" encoding="utf-8"?>
<permissions>
    <library name="AndroidLib"
            file="/system/framework/AndroidLib.jar"/>
</permissions>

并更新您的产品配置文件,以便将xml文件部署到目标:

PRODUCT_COPY_FILES += device/XXX/libs/AndroidLib.xml:system/etc/permissions/AndroidLib.xml

device/XXX/libs/替换为权限xml文件的路径。


这是我们在Android版本中添加和使用Android库的方式。我希望它有所帮助。 :)

答案 1 :(得分:4)

我知道我正在将这一点从坟墓中挖出来,但是对于如何在一个实际上包含一个Android库项目(或其他带有资源的 )的答案,从来没有真正的答案。 AOSP建立了应用程序。

以下是我对两个项目所做的工作。 “main”是我正在构建apk的主要应用程序。 “util”是一个实用程序库,其中包含我要链接的资源。这两个项目都位于external / seabold / {package}:

Android.mk in 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)



{/ 1}}在seabold / main /

Android.mk

这里要小心,确保你正确地摆弄文件名。对我来说,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的形式。因为,主应用程序的构建脚本要求java文件是util/src/com/seabold/util/*.java位置的相对路径,我正在添加../以正确访问util库的路径。

资源的关键是LOCAL_AAPT_FLAGS。这告诉资源包装器确保它为实用程序库中的包生成R.java。如果没有这个,所有实用程序的资源将被放入主应用程序R.java中,并且实用程序类将无法编译,因为它的R.java将丢失。

答案 2 :(得分:0)

要将预构建jar文件添加到框架中,我执行了以下操作:

  1. 使用jar和

    下的Android.mk文件找到一个文件夹

    预构建/杂项/通用/

  2. Android.mk:

    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. 在Android.mk文件上运行make:make prebuilds/misc/common/Android.mk

    2. 将jar文件添加到frameworks / base / services / Android.mk:

    3.   

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

答案 3 :(得分:0)

我偶然发现了一个关于Java库如何访问资源的解决方案。资源作为单独的apk构建。可以在清单中注明的任何应用程序中使用jar-lib。 Java库代码具有资源apk的R.java,并使用createPackageContext()来访问实际资源。 createPackageContext()获取应用程序上下文作为参数,每个应用程序使用需要访问资源的java-lib-function时必须提供此参数。

我还没有深入到AOSP-build-system,所以我希望我在这里记录的内容有意义。这也不是我的解决方案,我只是在自己的工作中改进了其他一些开发人员在此处创建的内容,因此我不知道他从何处获得这种方法。

对于仅资源apk ,我们有:

Android.mk

include $(CLEAR_VARS)

LOCAL_PATH := $(call my-dir)
LOCAL_PACKAGE_NAME := shared-resources
LOCAL_MODULE_TAGS :=  optional
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_APPS)
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res 

include $(BUILD_PACKAGE)

AndroidManifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
                package="my.company.common.resources">
<application android:hasCode="false"/>
</manifest>

对于 jar-lib ,我们有:

Android.mk

LOCAL_PATH:= $(call my-dir)

####################
# compile the jar  #
include $(CLEAR_VARS)
LOCAL_MODULE := helper-lib
LOCAL_SRC_FILES := $(call all-java-files-under, src)

# add package-context-ressources
resource-intermediates := $(call intermediates-dir-for,APPS,shared-resources,,common)
shared_res := $(resource-intermediates)/src/my/company/common/resources/R.java
$(shared_res): $(resource-intermediates)/src/R.stamp
LOCAL_GENERATED_SOURCES := $(shared_res)

LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR_JAVA_LIBRARIES)
LOCAL_ADDITIONAL_DEPENDENCIES := helper-lib.xml
include $(BUILD_JAVA_LIBRARY)

######################
# deliver permisions #
include $(CLEAR_VARS)
LOCAL_MODULE := helper-lib.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/permissions
LOCAL_SRC_FILES := helper-lib.xml
include $(BUILD_PREBUILT)

AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="my.company.helper">
    <uses-permission android:name="android.permission.INTERACT_ACROSS_USERS" />
    <uses-permission android:name="android.permission.MANAGE_USERS" />
    <application />
</manifest>

helper-lib.xml

<?xml version="1.0" encoding="utf-8"?>
<permissions>
    <library name="helper-lib" file="/vendor/framework/helper-lib.jar" />
</permissions>

最后但并非最不重要的是,我们在整个文件中声明它们的内容-> base_packages.mk

PRODUCT_PACKAGES += \
    my.company.common \
    shared-resources \
    helper-lib