X (java:sdk) 不应该 link 到 Y (java:platform)
X (java:sdk) should not link to Y (java:platform)
我是一名 android 固件开发人员。我使用 android 9 的源代码。我为 AOSP 固件编写了一个自定义网络位置提供程序,名为离线位置服务。我已将此应用程序添加到 AOSP 构建树中的 packages/apps/offlinelocatonservice
路径。
我已经为它创建了一个 Android.mk
文件以将其包含在 android OS 的默认包中。
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)
为什么我不应该 link 到 com.android.location.provider
和 framework
?
在以前的 android 中,例如 android 8 和更早版本,不会发生此错误。
如何解决这个错误?
我在 Android 9.0 中遇到同样的问题
临时我通过更改 OfflineLocationService/Android.mk
替换:
解决了
LOCAL_SDK_VERSION := current
与:
LOCAL_PRIVATE_PLATFORM_APIS := true
不过如果有人能找到更好的解决方案就好了。
来自 Android 文档:
Starting in Android 9 (API level 28), the platform restricts which non-SDK interfaces your app can use.
理想情况下,您应该重写您的应用程序以仅使用 Android public SDK。
您可以在此页面上阅读更多信息:https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces
没有直接回答问题,但对于那些使用 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,这可能是不需要的)。
我是一名 android 固件开发人员。我使用 android 9 的源代码。我为 AOSP 固件编写了一个自定义网络位置提供程序,名为离线位置服务。我已将此应用程序添加到 AOSP 构建树中的 packages/apps/offlinelocatonservice
路径。
我已经为它创建了一个 Android.mk
文件以将其包含在 android OS 的默认包中。
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)
为什么我不应该 link 到 com.android.location.provider
和 framework
?
在以前的 android 中,例如 android 8 和更早版本,不会发生此错误。
如何解决这个错误?
我在 Android 9.0 中遇到同样的问题
临时我通过更改 OfflineLocationService/Android.mk
替换:
LOCAL_SDK_VERSION := current
与:
LOCAL_PRIVATE_PLATFORM_APIS := true
不过如果有人能找到更好的解决方案就好了。
来自 Android 文档:
Starting in Android 9 (API level 28), the platform restricts which non-SDK interfaces your app can use.
理想情况下,您应该重写您的应用程序以仅使用 Android public SDK。
您可以在此页面上阅读更多信息:https://developer.android.com/distribute/best-practices/develop/restrictions-non-sdk-interfaces
没有直接回答问题,但对于那些使用 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,这可能是不需要的)。