当前位置: 首页 > article >正文

安卓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。


http://www.kler.cn/a/369101.html

相关文章:

  • 使用 telnet 连接 dubbo 服务调用暴露的 dubbo 接口
  • 一分钟学会MATLAB-数值计算
  • w003基于Springboot的图书个性化推荐系统的设计与实现
  • 软考:常用协议和端口号
  • 【rabbitmq】rabbitmq工作模式
  • 安徽对口高考Python试题选:输入一个正整数,然后输出该整数的3的幂数相加形式。
  • Ubuntu 2张4090,显卡安装,无法双屏显示
  • [产品管理-51]:产品经理:塑造未来的多面手,道、法、术、器的全面掌控
  • 【完整版】opencv-python-headless、opencv-python和opencv-contrib-python区别和联系
  • AI Weekly3:过去一周重要的AI资讯汇总
  • 记录一个docker volume映射目录创建文件报错问题
  • 量子容错计算
  • ts:数组的常用方法(filter)
  • 开源模型应用落地-Qwen2.5-7B-Instruct与vllm实现离线推理-使用Lora权重(三)
  • python包的其他安装方法:whl、.tar.gz
  • 2024 年 MathorCup 数学应用挑战赛——大数据竞赛-赛道 A:台风的分类与预测
  • 【Docker大揭秘】
  • 【力扣】[Java版] 刷题笔记-70. 爬楼梯
  • JavaScript 前端开发
  • Python 网络爬虫:基础与实践
  • Java并发学习总结:原子操作类
  • python:如何判断一个数是否为素数
  • Go语言初识
  • 基于Python和OpenCV的疲劳检测系统设计与实现
  • 解决vue使用pdfdist-mergeofd插件时报错polyfills
  • VMware各版本下载的镜像站(含windows和linux)