最近有个需求需要定制系统级别的SDK架包,应用能够像访问framework.jar一样,只参与编译,不参与打包,但google从andorid 9开始对应用能使用的非 SDK 接口实施了限制,到android 10 后直接拒绝访问。故此有以下方案。
方案是否会影响CTS认证不确定,没有试过
主要是把customapi以java_sdk_library的方式集成到系统里面
然后在把需要集成调用customapi架包的第三方非系统签名应用设置相应的白名单
第三方非系统签名需要以这种方式加入架包,在build.gradle添加 compileOnly files(‘libs/customapi.jar’) —此架包由客户提供,不是android原生系统编译生成出来的架包。
还需要在AndroidManifest.xml 的application标签内部 增加
<uses-library
android:name="com.xxx.api"
android:required="true" />
1 build/target/product/aosp_x86_64.mk(增加customapi接口架包和两个test应用的编译链接)
PRODUCT_ARTIFACT_PATH_REQUIREMENT_WHITELIST += \
system/etc/permissions/com.xxx.api.xml \
system/framework/com.xxx.api.jar \
system/app/TestCustomApi/TestCustomApi.apk \
vendor/app/TestCustomApi/TestCustomApi2.apk \
PRODUCT_PACKAGES += \
com.xxx.api \
TestCustomApi \
TestCustomApi2 \
PRODUCT_BOOT_JARS += \
com.xxx.api \
2 build/tasks/check_boot_jars/package_whitelist.txt (增加boot jars的白名单)
# Packages used for customapi
com\.xxx\.api
com\.xxx\.api\..*
3 packages/apps/Hsae_Apps/CustomApi/Android.bp (编译customapi的bp脚本,相关接口代码让入src目录)
java_sdk_library {
name: "com.xxx.api",
srcs: ["src/**/*.java"],
api_packages: ["com.xxx.api"],
}
4 frameworks/base/data/etc/hiddenapi-package-whitelist.xml (给两个test应用增加白名单权限)
<hidden-api-whitelisted-app package="com.example.testcustomapi" />
<hidden-api-whitelisted-app package="com.example.testcustomapi2" />
5 packages/apps/ThirdParty/TestCustomApi/Android.mk (同级目录放入对应的apk文件)
LOCAL_PATH := $(my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := TestCustomApi
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX :=$(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_SRC_FILES := TestCustomApi.apk
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT)/app
include $(BUILD_PREBUILT)
6 vendor/ThirdParty/TestCustomApi2/Android.mk(同级目录放入对应的apk文件)
LOCAL_PATH := $(my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := TestCustomApi2
LOCAL_MODULE_TAGS := optional
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_SUFFIX :=$(COMMON_ANDROID_PACKAGE_SUFFIX)
LOCAL_SRC_FILES := TestCustomApi2.apk
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_CERTIFICATE := PRESIGNED
LOCAL_MODULE_PATH := $(TARGET_OUT_VENDOR)/app
include $(BUILD_PREBUILT)
PS: 如果单纯的想调试,可以直接使用如下命令来调试,无需集成添加白名单工作,但此方案仅用于debug调试。
adb shell settings put global hidden_api_policy 1