8

我想通过从另一个 android 应用程序启动一个活动来将一些功能添加到浏览器应用程序中。它package does not exist在我制作主项目时给了我。请注意,我看到 AndroidLib 已成功构建到out/target/product/generic/data/app/AndroidLib.apk

这里有两个 android.mk 文件: AndroidLib(一个普通的 Android App)

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

4 回答 4

16

更新

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

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与其他系统库一起放置。

你也不需要一个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 库的方式。我希望它有所帮助。:)

于 2013-08-23T08:29:09.657 回答
4

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

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

Android.mk在海胆/

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在海胆/主要/

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_SRCutil/src/com/seabold/util/*.java. 由于主应用程序的构建脚本期望 java 文件是位置的相对路径,因此Android.mk我添加了一个 ../ 以正确访问 util 库的路径。

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

于 2014-09-08T22:06:28.853 回答
0

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

我还没有深入了解 AOSP 构建系统,所以我希望我在这里记录的内容是有意义的。这也不是我的解决方案,我只是改进了其他一些开发人员在我的工作中创建的东西,所以我不知道他从哪里得到的方法。

对于我们拥有的仅资源 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>

最后但并非最不重要的一点是,我们如何在整个 makefile 中声明它们,该文件说明了要包含的所有内容 ->base_packages.mk

PRODUCT_PACKAGES += \
    my.company.common \
    shared-resources \
    helper-lib
于 2019-11-14T13:03:24.933 回答
0

要将预构建 jar 文件添加到框架中,我这样做了:

  1. 在下面找到一个包含 jar 和 Android.mk 文件的文件夹

    预构建/杂项/常见/

安卓.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

于 2016-11-01T13:23:56.047 回答