我想通过从另一个Android应用程序开始 Activity 来向浏览器应用程序添加一些功能。在创建主项目时,它会给我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;

最佳答案

更新

本质上,您的问题是该行:

LOCAL_REQUIRED_MODULES := SoundRecorder, AndroidLib

告知Android版本,您的浏览器首先依赖于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)

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

另外,您不需要lib的LOCAL_MODULE_NAME,它仅适用于应用程序。所以剥掉它。

您可能应该考虑将LOCAL_MODULE_TAGS更改为:
LOCAL_MODULE_TAGS := user
tests表示您应该只为测试而构建库,user表示要为所有用户版本(当然也包括工程版本)构建库。

然后在应用程序Android.mk中添加一行:
LOCAL_JAVA_LIBRARIES := AndroidLib

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

在您的应用程序AndroidManifest.xml中,您还需要在application标签中放置一个uses库:
<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库的方式。希望对您有所帮助。 :)

09-11 22:08