Android.bp java_sdk_library记录

本文详细介绍了如何构建和管理Android的Java SDK库,强调了不使用@hide方法、确保包名正确、维护API稳定性和向后兼容性的重要性。通过java_sdk_library构建规则,生成存根库和实现库,并通过对比API文件来检查兼容性。同时,讨论了库的分发方式,包括系统集成和APK开发中的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

java_sdk_library记录

1、不要使用android的@hide方法去实现api,会编译不过

error: Class android.media.MediaTimeProvider is hidden but was referenced (as return type) from public method com.media.ext.MediaPlayerWrap.getMediaTimeProvider() [ReferencesHidden]

2、包名要正确,每个文件的包名要好好对应;

3、要自己把api填到api目录的current.txt

如下:

java_sdk_library {
    name: "com.my.api",
    srcs: ["src/**/*.java"],
    api_packages: ["com.my.api"],
    srcs_lib: "framework",
    srcs_lib_whitelist_dirs: ["media/java"],
    srcs_lib_whitelist_pkgs: ["android.media"],
}

java_sdk_library {
    name: "android.test.runner",

    srcs: ["src/**/*.java"],

    errorprone: {
        javacflags: ["-Xep:DepAnn:ERROR"],
    },

    libs: [
        "android.test.base",
        "android.test.mock",
    ],
    stub_only_libs: [
        "android.test.base",
        "android.test.mock",
    ],
    api_packages: [
        "android.test",
        "android.test.suitebuilder",
        "junit.runner",
        "junit.textui",
    ],

    compile_dex: true
}

5、生成的jar包分两部分

一部分是系统image集成:

/system/etc/permissions/com.my.api.xml

/system/framework/com.my.api.jar

另一部分用于apk开发:

1、如集成在Android studio时,拷贝out\target\common\obj\JAVA_LIBRARIES\com.my.api.stubs_intermediates\classes.jar到libs目录;

2、在AndroidManifest.xml中加入

<application>
<uses-library
    android:name="com.my.api"
    android:required="true" />
</application>

在安装的时候如果系统image没有集成以上提到的两个文件会报错,安装不上

There are two libraries defined in this directory:
First, com.android.mediadrm.signer.jar is a shared java library
containing classes required by unbundled apps running on devices that use
the certficate provisioning and private key signing capabilities provided
by the MediaDrm API.
Second, com.android.mediadrm.signer.stubs.jar is a stub for the shared library
which provides build-time APIs to the unbundled clients.

At runtime, the shared library is added to the classloader of the app via the
<uses-library> tag. And since Java always tries to load a class from the
parent classloader, regardless of whether the stub library is linked to the
app statically or dynamically, the real classes are loaded from the shared
library.

--- Rules of this library ---
o The stub library is effectively a PUBLIC API for unbundled CAST receivers
  that may be distributed outside the system image. So it MUST BE API STABLE.
  You can add but not remove. The rules are the same as for the
  public platform SDK API.
o This library can see and instantiate internal platform classes, but it must not
  expose them in any public method (or by extending them via inheritance). This would
  break clients of the library because they cannot see the internal platform classes.

This library is distributed in the system image, and loaded as
a shared library. So you can change the implementation, but not
the interface. In this way it is like framework.jar.

--- Why does this library exist? ---

Unbundled apps cannot use internal platform classes.

This library will eventually be replaced when the provisioned certificate-
based signing infrastructure that is currently defined in the support library
is reintegrated with the framework in a new API.  That API isn't ready yet so
this library is a compromise to make new capabilities available to the system
without exposing the full surface area of the support library.

from:实现 Java SDK 库  |  Android 开源项目  |  Android Open Source Project

实现 Java SDK 库

Android 平台包含大量的共享 Java 库,可以使用应用清单中的 <uses-library> 标记选择性地将其纳入应用的类路径中。由于应用与这些库相关联,因此在兼容性、API 审核和工具支持方面,应将其与其他 Android API 一样对待。不过,大多数库都没有这些功能。

Android 10 引入了 java_sdk_library,这是一个新的构建规则,可解决共享 Java 库的兼容性问题。设备制造商可在自己的共享 Java 库中运用此机制,以保持其 API 的向后兼容性。如果设备制造商通过 <uses-library> 标记(而不是 bootclass 路径)使用自己的共享 Java 库,则 java_sdk_library 可以验证这些 Java 库是否能让 API 保持稳定。

java_sdk_library 是一个 Java 库,可为应用实现可选的 SDK API。通过 makefile (Android.bp) 中的 java_sdk_library 实现的库会执行以下操作:

  • 生成存根库,将 stubsstubs.system 和 stubs.test 包括在内。这些存根库是通过识别 @hide@SystemApi 和 @TestApi 注释创建的。在构建时,当 SDK 版本分别为 currentsystem_current 和 test_current 时,会自动引用它们。
  • Android 通过存根文件获取 API 列表,并通过将 master 中的当前 API 列表与最近发布的 Android 版本中的 API 列表进行比较来验证是否以向后兼容的方式维护 API。
  • 如果安装了运行时的实现库,就会生成并安装 XML 文件。

使用 Java SDK 库的构建流程

图 1. 使用 Java SDK 库的构建流程

示例和来源

存根库的最小组件是必需的 srcs 和 api_packages 属性。

java_sdk_library {
        name: "com.android.future.usb.accessory",
        srcs: ["src/**/*.java"],
        api_packages: ["com.android.future.usb"],
    }

如需构建用于运行时的实现库,请填充所有 java_library 属性,如 hostdexcompile_dex 和 errorprone

java_sdk_library {
        name: "android.test.base",

        srcs: ["src/**/*.java"],

        errorprone: {
          javacflags: ["-Xep:DepAnn:ERROR"],
        },

        hostdex: true,

        api_packages: [
            "android.test",
            "android.test.suitebuilder.annotation",
            "com.android.internal.util",
            "junit.framework",
        ],

        compile_dex: true,
    }

如需创建存根库,请填充 droidstubs 属性,如 srcs_libsrcs_lib_whitelist_dirssrcs_lib_whitelist_pkgsmerge_annotations_dirs 和 merge_inclusion_annotations_dirs。您还可以将以下属性用于存根库中:

  • api_srcs:属于 API 但不属于运行时库的可选源文件的列表。
  • stubs_only_libs:构建存根时位于类路径中的 Java 库的列表。
  • hidden_api_packages:必须对 API 隐藏的软件包名称的列表。
  • droiddoc_options:metalava 的附加参数。

    java_sdk_library {
              name: "android.test.mock",
    
              srcs: ["src/**/*.java"],
    
              api_packages: [
                  "android.test.mock",
              ],
    
              srcs_lib: "framework",
              srcs_lib_whitelist_dirs: ["core/java"],
              srcs_lib_whitelist_pkgs: ["android"],
              compile_dex: true,
          }

保持向后兼容性

构建系统通过在构建时将最新的 API 文件与生成的 API 文件进行比较来检查 API 是否保持向后兼容性。此操作通过一个名为 prebuilt_apis 的新构建规则来完成,该规则会创建预构建的存根库模块和 API 列表模块。使用 java_sdk_library 构建的所有库都必须在 prebuilt_apis 中的拥有最新版的 api_dirs 中的 API 文件。当您发布版本时,可以使用 PRODUCT-sdk_phone_armv7-sdk 通过 dist build 获取 API 列表文件和存根库。

api_dirs 属性是 prebuilt_apis 中的 API 版本目录的列表。API 版本目录应位于与 Android.bp 相同的目录级别。

prebuilt_apis {
        name: "sdk",
        api_dirs: [
            "1",
            "2",
              ....
            "28",
            "current",
        ],
    }

在 prebuilts 目录下配置 version/scope/api/ 结构的目录。version 与 API 级别相对应,而 scope 可确定目录是公开目录、系统目录还是测试目录。

  • version/scope 包含 Java 库。
  • version/scope/api 包含 API .txt 文件。在此处创建名为 module_name.txt 和 module_name-removed.txt 的空文本文件。

    ├── 28
          │   ├── public
          │   │   ├── api
          │   │   │   ├── android.test.base-removed.txt
          │   │   │   └── android.test.base.txt
          │   │   └── android.test.base.jar
          │   ├── system
          │   │   ├── api
          │   │   │   ├── android.test.base-removed.txt
          │   │   │   └── android.test.base.txt
          │   │   └── android.test.base.jar
          │   └── test
          │       ├── api
          │       │   ├── android.test.base-removed.txt
          │       │   └── android.test.base.txt
          │       └── android.test.base.jar
          └── Android.bp

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := mediaext
LOCAL_MODULE_TAGS := optional
LOCAL_DEX_PREOPT := false
#LOCAL_VENDOR_MODULE := true
#LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res
LOCAL_SRC_FILES := $(call all-java-files-under, com)
include $(BUILD_JAVA_LIBRARY)

include $(CLEAR_VARS)
LOCAL_MODULE := mediaext.xml  
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT_ETC)/permissions
LOCAL_SRC_FILES := $(LOCAL_MODULE)
include $(BUILD_PREBUILT)

生成的可以android studio可用的jar包在android\out\target\common\obj\JAVA_LIBRARIES\mediaext_intermediates\目录

 
repo forall -c 'git fetch --all ' 
repo forall -c 'git branch -vv '
repo forall -c 'git checkout master '
repo forall -c 'git clean -xdf;git reset --hard HEAD'
repo forall -c 'git checkout master '
repo forall -c 'git pull --all '
repo forall -c 'git checkout -b develop-1.0.0 aosp/develop-1.0.0'

repo forall -c 'git checkout develop-1.0.0'

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值