我想通过从另一个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库的方式。希望对您有所帮助。 :)