安卓14上蓝牙调用SystemProperties.set(),解决找不到SystemProperties.set()的问题

近期遇到一个需求,要在安卓14的蓝牙模块中调用SystemProperties.set()。

安卓14中的蓝牙,和安卓12的版本有较大的不同。它在packages/modules目录下,而安卓12是分散在packages/apps和frameworks/base等目录下;安卓14的蓝牙打包产物为apex,安卓12则是apk等。

接口的校验也更加严格,安卓12上SystemProperties.set()可以正常编译,安卓14上则会编译报错

这个报错比较特别,它找不到的不是SystemProperties这个类,而是set这个方法。实际上,AdapterState这个类里面还有SystemProperties.getInt()。这个get方法就是可以正常编译的。

进一步尝试,发现packages/modules目录下其它模块,SystemProperties.set()也编译不过,但get方法就可以。

于是看看frameworks/base/core/java/android/os/SystemProperties.java这个类

可以看到set方法和getInt方法都是有的,只是注解不同。再进行尝试,发现同样注解了UnsupportedAppUsage的reportSyspropChanged()方法也编译不过,看来问题就在于这个注解了。

找到这个类/tools/platform-compat/java/android/compat/annotation/UnsupportedAppUsage.java,从注释上看,它会根据sdk版本限制访问。

考虑到这次是要修改原生蓝牙,不方便对配置做太多改动。实际上在Android.bp里尝试注释掉min_sdk_version和sdk_version也不行,会报错。

于是采用的方案是,做一个jar,其中包裹SystemProperties.set()。如下图

这样可以通过MySystemProperties.set()调用SystemProperties.set()。也避免了SystemProperties.set()的注解的影响。

打包jar很简单,Android Studio中File->New->New Module->Java or Kotlin Library,完成代码后Build->Make Project。创建的module的目录下build/libs里就是生成的jar包。

这个jar包要放在加到对应模块的Android.bp中。关键代码

java_import {

name: "mypropertylib",

sdk_version: "system_current",

min_sdk_version: "Tiramisu",

jars: [

"lib/mypropertylib.jar",

],

installable: false,

apex_available: [

"com.android.xxxxxxx",

],

}

static_libs: [

........

"mypropertylib",

],

注意这个库要加在static_libs中,因为是作为静态库加入。

如果加在libs中,编译时会当作动态库。虽然编译能通过,但是运行时,会因为在系统库找不到对应的类而报错。

这样在蓝牙的代码中使用MySystemProperties.set(),就可以正常编译了,验证功能也OK。

相关推荐
2601_9495758610 小时前
Flutter for OpenHarmony二手物品置换App实战 - 表单验证实现
android·java·flutter
龚礼鹏12 小时前
图像显示框架八——BufferQueue与BLASTBufferQueue(基于android 15源码分析)
android·c语言
1登峰造极12 小时前
uniapp 运行安卓报错reportJSException >>>> exception function:createInstanceContext, exception:white screen
android·java·uni-app
木易 士心12 小时前
Android Handler 机制原理详解
android
kkk_皮蛋12 小时前
作为一个学生,如何用免费 AI 工具手搓了一款 Android AI 日记 App
android·人工智能
金山毒霸电脑医生12 小时前
植物大战僵尸杂交版最新v0.2版下载安装|2025图文解析教程
android·游戏·ios·植物大战僵尸·软件下载安装
羑悻的小杀马特12 小时前
Docker-Android 容器化 + cpolar 穿透,完善异地调试
android·运维·docker·容器·cpolar
恋猫de小郭12 小时前
Android Gradle Plugin 9.0 发布,为什么这会是个史诗级大坑版本
android·flutter·ios·开源
Calebbbbb14 小时前
Ubuntu 24.04 + Android 15 (AOSP) 环境搭建与源码同步完整指南
android·linux·ubuntu
小小码农Come on15 小时前
QT中窗口位置、相对位置、绝对位置
android·开发语言·qt