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

Cuo*_*hai 7 android android-ndk android-build android-source 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))
Run Code Online (Sandbox Code Playgroud)

浏览器应用

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))
Run Code Online (Sandbox Code Playgroud)

然后我做:

make -j Browser
Run Code Online (Sandbox Code Playgroud)

它给了我:

packages/apps/Browser/src/com/android/browser/BrowserActivity.java:36: package com.om.AndroidLib does not exist
import com.om.AndroidLib.MainActivity;
Run Code Online (Sandbox Code Playgroud)

Bja*_*sen 13

更新

基本上你的问题是这条线:

LOCAL_REQUIRED_MODULES := SoundRecorder, AndroidLib
Run Code Online (Sandbox Code Playgroud)

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

LOCAL_JAVA_LIBRARIES := AndroidLib
Run Code Online (Sandbox Code Playgroud)

除了需要AndroidLib成为java库项目,使用构建类型:

include $(BUILD_JAVA_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

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

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


如何制作AndroidLib一个java库并链接到它

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

include $(BUILD_PACKAGE)
Run Code Online (Sandbox Code Playgroud)

你应该这样做:

include $(BUILD_JAVA_LIBRARY)
Run Code Online (Sandbox Code Playgroud)

然后你将lib out/target/product/generic/system/framework/AndroidLib.jar与其他系统库一起放入.

此外,您不需要LOCAL_MODULE_NAMElib,它只适用于应用程序.剥掉那个.

您应该考虑将您LOCAL_MODULE_TAGS改为:

LOCAL_MODULE_TAGS := user
Run Code Online (Sandbox Code Playgroud)

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


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

LOCAL_JAVA_LIBRARIES := AndroidLib
Run Code Online (Sandbox Code Playgroud)

这样您的应用程序将AndroidLib在类路径中构建.


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

<uses-library android:name="AndroidLib" />
Run Code Online (Sandbox Code Playgroud)

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

<?xml version="1.0" encoding="utf-8"?>
<permissions>
    <library name="AndroidLib"
            file="/system/framework/AndroidLib.jar"/>
</permissions>
Run Code Online (Sandbox Code Playgroud)

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

PRODUCT_COPY_FILES += device/XXX/libs/AndroidLib.xml:system/etc/permissions/AndroidLib.xml
Run Code Online (Sandbox Code Playgroud)

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


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

  • 有两种相关的Android库.在制作第三方应用程序时,可以创建库项目类型(例如在Eclipse中).这些将被编译到使用它们的所有应用程序中.但是当你从源代码构建Android操作系统时,没有这样一个android库项目的概念.但是有一些java库将作为jar文件安装在目标上.但不幸的是,它们不能包含资源.您必须直接在应用程序中包含所需的资源,而不是lib,这是目前唯一可行的方式.抱歉. (3认同)