在AOSP应用程序中添加一个Android项目作为库

我想通过从另一个Android应用程序启动一个活动添加一些function到浏览器应用程序。 当我做主项目时,它给我package does not exist 。 请注意,我看到AndroidLib已成功构build到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; 

Solutions Collecting From Web of "在AOSP应用程序中添加一个Android项目作为库"

更新

基本上你的问题是,行:

 LOCAL_REQUIRED_MODULES := SoundRecorder, AndroidLib 

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

 LOCAL_JAVA_LIBRARIES := AndroidLib 

除了需要AndroidLib成为一个java库项目,使用构buildtypes:

 include $(BUILD_JAVA_LIBRARY) 

而不幸的是,Java库不能包含资源。 在Android构build系统中,没有办法将一个应用程序链接到另一个应用程序。

我们正在频繁地处理这个问题,坦白地说这样做有点乱。 但我们发现的唯一解决方法是直接在使用这些资源的应用程序中包含所有资源。 抱歉。


如何使你的AndroidLib成为一个Java库并链接到它

你的Android库可能应该被构build为一个Java库,而不是作为一个应用程序包。 所以,而不是:

 include $(BUILD_PACKAGE) 

你可能应该这样做:

 include $(BUILD_JAVA_LIBRARY) 

然后你的lib将被放置在out/target/product/generic/system/framework/AndroidLib.jar以及其他系统库中。

你也不需要一个LOCAL_MODULE_NAME作为一个库,它只适用于一个应用程序。 所以,剥离。

而且您应该考虑将您的LOCAL_MODULE_TAGS更改为:

 LOCAL_MODULE_TAGS := user 

tests表明你的lib应该只为testing而build, user说为你所有的用户构build构build你的lib(并且隐含地也用于工程构build)


在你的应用程序Android.mk你应该添加一行:

 LOCAL_JAVA_LIBRARIES := AndroidLib 

这样,您的应用程序将在类path中使用AndroidLib构build。


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

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

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

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

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

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

device/XXX/libs/replace为权限xml文件的path。


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

我知道我正在从坟墓中挖掘出一点点,但从未真正回答过如何在AOSP构build的应用程序中实际包含Android库项目(或其他apk 与资源 )。

这是我做了两个项目。 “主”是我正在构buildapk的主要应用程序。 “util”是一个实用程序库,包含我正在链接的资源。 这两个项目都驻留在external / seabold / {package}中:

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中定义的文件的forms是util/src/com/seabold/util/*.java 。 因为主应用程序的构build脚本需要java文件作为Android.mk位置的相对path,所以我添加了../以正确地进入util库的path。

资源的关键是LOCAL_AAPT_FLAGS。 这告诉资源打包器确保它为实用程序库中的包生成一个R.java。 如果没有这个,所有的实用程序的资源将被放到主应用程序R.java中,并且实用程序类将由于缺lessR.java而无法编译。

为了添加一个预先构build的jar文件到框架,我做到了这一点:

  1. find一个包含jar和Android.mk文件的文件夹

    预构build/杂项/通用/

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:

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