X(java:sdk)不应链接到Y(java:platform)

时间:2019-03-05 13:49:31

标签: android-source

我是一名Android固件开发人员。我使用android 9的源代码。我为AOSP固件编写了一个自定义网络位置提供程序,名为离线位置服务。我已将此应用程序添加到AOSP构建树的packages/apps/offlinelocatonservice路径中。

我已经创建了一个Android.mk文件,以将其包含在android操作系统的默认软件包中。

LOCAL_PATH:= $(call my-dir)

include $(CLEAR_VARS)

LOCAL_PACKAGE_NAME := OfflineLocationService

LOCAL_SDK_VERSION := current

LOCAL_SRC_FILES := $(call all-java-files-under, src)

LOCAL_CERTIFICATE := platform

LOCAL_USE_AAPT2 := true

# Include libraries

LOCAL_JAVA_LIBRARIES := framework com.android.location.provider

LOCAL_STATIC_JAVA_LIBRARIES := android-common

LOCAL_STATIC_ANDROID_LIBRARIES := \
    android-support-v4 \
    android-support-v7-appcompat \
    android-support-design \
    android-support-v7-preference \
    android-support-v7-recyclerview \

LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res

LOCAL_AAPT_FLAGS := --auto-add-overlay

LOCAL_AAPT_FLAGS += --extra-packages android.support.v7.appcompat

LOCAL_AAPT_FLAGS += --extra-packages android.support.design

include $(BUILD_PACKAGE)

但是当我构建AOSP时,会遇到此错误:

packages/apps/OfflineLocationService/Android.mk: error: OfflineLocationService (java:sdk) should not link to com.android.location.provider (java:platform)
packages/apps/OfflineLocationService/Android.mk: error: OfflineLocationService (java:sdk) should not link to framework (java:platform)

为什么我不应该链接到com.android.location.providerframework? 在以前的Android(例如android 8及更早版本)中,不会发生此错误。

如何解决此错误?

3 个答案:

答案 0 :(得分:2)

我在Android 9.0中遇到相同的问题 临时我通过更改OfflineLocationService/Android.mk替换来解决:

LOCAL_SDK_VERSION := current

具有:

LOCAL_PRIVATE_PLATFORM_APIS := true

但如果有人能找到更好的解决方案,那将是很好的。

答案 1 :(得分:0)

来自Android文档:

  

从Android 9(API级别28)开始,该平台会限制您的应用可以使用哪些非SDK接口。

理想情况下,您应该重写应用程序以仅使用Android公共SDK。

您可以在此页面上阅读更多信息:https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces

答案 2 :(得分:0)

不是直接回答问题,但对于那些使用 LOCAL_STATIC_JAVA_LIBRARIES 结合 LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES 编写模块的人,这在 Android 9 中停止工作:

include $(CLEAR_VARS)
(...)
LOCAL_MODULE := foo
LOCAL_STATIC_JAVA_LIBRARIES := bar
(...)
include $(BUILD_WHATEVER)

include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := bar:path/to/bar.jar
include $(BUILD_MULTI_PREBUILT)

这将产生 error: foo (java:sdk) should not link to bar (java:platform)。解决方案是像这样集成预构建的 JAR:

include $(CLEAR_VARS)

LOCAL_MODULE := bar
LOCAL_MODULE_CLASS := JAVA_LIBRARIES
LOCAL_SDK_VERSION := current
LOCAL_SRC_FILES := path/to/bar.jar
LOCAL_UNINSTALLABLE_MODULE := true

include $(BUILD_PREBUILT)

然后像以前一样使用 LOCAL_STATIC_JAVA_LIBRARIES 从模块 foo 中引用它。

有关真实示例,请参阅 how Google did it in the Dialer app

或者只使用 LOCAL_PRIVATE_PLATFORM_APIS := true(但这让模块可以使用私有 API,这可能是不需要的)。