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
实现的库会执行以下操作:
- 生成存根库,将
stubs
、stubs.system
和stubs.test
包括在内。这些存根库是通过识别@hide
、@SystemApi
和@TestApi
注释创建的。在构建时,当 SDK 版本分别为current
、system_current
和test_current
时,会自动引用它们。 - Android 通过存根文件获取 API 列表,并通过将 master 中的当前 API 列表与最近发布的 Android 版本中的 API 列表进行比较来验证是否以向后兼容的方式维护 API。
- 如果安装了运行时的实现库,就会生成并安装 XML 文件。
图 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
属性,如 hostdex
、compile_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_lib
、srcs_lib_whitelist_dirs
、srcs_lib_whitelist_pkgs
、merge_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'