[RK3568 Android11] 教程之添加JNI系统服务—SystemService篇(四)

这篇教程详细介绍了如何在Android11中添加JNI系统服务,以LED控制为例。从创建AIDL文件、Manager接口类、服务端Service,到注册系统服务和编译方法,一步步教你完成LED系统服务的添加。

总目录链接:[RK3568 Android11] 本专栏说明和总目录

目录

前言

一、什么是System Service

二、创建LED系统服务

1、创建AIDL文件

2、创建Manager接口类

3、创建服务端service

4、创建LED系统服务名称

5、注册系统服务

6、添加到系统服务中

三、编译方法

1、更新API

2、编译Android

3、系统中led服务已在列表内


前言

        Android SDK源码添加JNI系统服务,以供给第三方应用调用;以JNI调用控制一个LED灯亮灭为例子;SystemService层主要向APP提供调用接口;
        整个调用路径为:APP应用-->frameworks层(JNI和SystemService)--> hardware层--> kernel层--> 硬件层;
        此篇讲解的是:frameworks层(SystemService部分)-->frameworks层(JNI部分);
        前三篇已分别完成了kernel层的LED驱动、HAL层和JNI层:
                [RK3568 Android11] 教程之添加JNI系统服务—底层驱动篇(一)

<think>我们正在讨论的是RK3568平台的蓝牙服务。根据引用内容,RK3568的蓝牙服务主要由bluetooth.apk作为蓝牙服务进程,通过JNI层与底层的bluetooth*.default.so交互,使用bt_interface_t接口进行控制和数据回调。同时,蓝牙启动流程中会读取Config.xml配置文件中的协议支持列表,并逐个拉起相应的profile service。 下面我将从蓝牙服务架构和使用方法两方面进行介绍: ### 一、RK3568蓝牙服务架构(系统层) 1. **软件栈分层**: - **应用层**:bluetooth.apk(蓝牙设置界面和服务进程) - **JNI适配层**:libblueooth_jni(Java与C++的桥梁) - **HAL层**:bluetooth.default.so(实现bt_interface_t接口) - **驱动层**:Linux内核的HCI驱动(如USB蓝牙模块驱动) 2. **核心组件交互**: ```mermaid graph TD A[bluetooth.apk] -->|JNI调用| B[libblueooth_jni] B -->|调用接口| C[bluetooth.default.so] C -->|ioctl操作| D[Linux内核蓝牙协议栈] D -->|数据交互| E[USB蓝牙模块] ``` 3. **协议支持配置**: 系统通过读取`packages/apps/Bluetooth/res/values/config.xml`中的`SUPPORTED_PROFILES`配置项决定支持的蓝牙协议[^2],典型配置如下: ```xml <string-array name="config_bluetooth_scan_classic"> <item>A2DP</item> <item>AVRCP</item> <item>HFP</item> <item>HSP</item> </string-array> ``` ### 二、RK3568蓝牙使用方法 #### 场景1:通过ADB控制蓝牙 1. **启动蓝牙服务**: ```bash adb shell am startservice -n com.android.bluetooth/.btservice.AdapterService ``` 2. **启用蓝牙适配器**: ```bash adb shell settings put global bluetooth_on 1 # 启用蓝牙 ``` 3. **扫描设备**(需在交互界面操作): ```bash adb shell input keyevent KEYCODE_SCAN # 模拟扫描按钮 ``` #### 场景2:底层串口调试(针对UART蓝牙模块) 引用[3]展示了串口调试方法,适用于RFCOMM协议测试: ```bash # 设置串口参数 stty -F /dev/ttyS7 ispeed 115200 ospeed 115200 cs8 -icanon # 发送测试数据 echo "AT+INQ" > /dev/ttyS7 # 查询设备指令 cat /dev/ttyS7 # 读取响应 ``` #### 场景3:配置文件修改(需系统权限) 修改支持的蓝牙配置文件: 1. 解压系统镜像中的`/system/priv-app/Bluetooth/Bluetooth.apk` 2. 修改`res/values/config.xml`中的协议配置 3. 重新打包并刷入系统 ### 三、常见问题排查 当蓝牙服务异常时,可检查: 1. **HCI层状态**: ```bash hciconfig -a # 查看控制器状态 hcitool cmd 0x01 0x0003 # 读取控制器支持特性 ``` 2. **服务日志**: ```bash adb logcat | grep Bluetooth # 过滤蓝牙相关日志 ``` §§相关问题§§ 1. RK3568如何添加新的蓝牙协议支持? 2. RK3568蓝牙连接出现HCI timeout错误如何解决? 3. 如何通过ADB命令管理RK3568的蓝牙配对设备? </think>### RK3568 蓝牙服务详解及使用方法 #### 一、蓝牙服务架构(系统层) 根据引用内容,RK3568 蓝牙服务采用分层架构: 1. **应用层**: - `bluetooth.apk` 作为蓝牙服务进程[^1] - 通过 JNI(`libblueooth_jni`)与底层交互 2. **HAL层**: - 调用 `bluetooth*.default.so` 提供的 `bt_interface_t` 控制接口[^1] - 实现状态回调与数据接收 3. **协议支持**: - 通过 `Config.getSupportedProfiles()` 获取支持的协议列表(BLE/传统蓝牙)[^2] - 协议配置在:`packages/apps/Bluetooth/res/values/config.xml`[^2] 4. **驱动层**: - 支持 USB/UART 蓝牙模块(如 `/dev/ttyS7` 串口操作)[^3] - 波特率配置示例:`stty -F /dev/ttyS7 ispeed 115200 ospeed 115200 cs8`[^3] #### 二、核心操作流程 1. **蓝牙服务启动**: ```bash adb shell am startservice -n com.android.bluetooth/.btservice.AdapterService ``` - 启动后自动加载 `config.xml` 中定义的协议服务[^2] 2. **蓝牙控制命令**: ```bash # 启用蓝牙 adb shell service call bluetooth_manager 8 # 扫描设备 adb shell am broadcast -a android.bluetooth.adapter.action.REQUEST_DISCOVERABLE ``` 3. **串口调试(UART蓝牙模块)**: ```bash # 配置串口参数 stty -F /dev/ttyS7 ispeed 115200 ospeed 115200 cs8 -icanon # 发送测试数据 echo "AT+INQM=1,9,48" > /dev/ttyS7 # 设置扫描模式 cat /dev/ttyS7 # 读取响应数据[^3] ``` 4. **协议服务管理**: ```bash # 查看运行中的Profile服务 adb shell dumpsys bluetooth_manager | grep "Profile services" ``` #### 三、配置文件定制 修改协议支持列表 (`config.xml`): ```xml <!-- 示例:启用A2DP音频协议 --> <string-array name="config_bluetooth_supported_profiles"> <item>1</item> <!-- A2DP --> <item>3</item> <!-- HFP --> </string-array> ``` 修改后需重新编译系统镜像生效[^2]。 #### 、调试技巧 1. **日志获取**: ```bash adb logcat | grep -i "bt_" ``` 2. **HCI数据抓包**: ```bash hcidump -Xtrace ``` 3. **协议层测试**: ```bash bluetoothtool --devicename=00:11:22:33:44:55 aplay /test.wav ``` #### 五、典型问题定位 1. **服务未启动**: - 检查 `/system/bin/bluetoothd` 进程是否运行 - 验证 SELinux 策略:`adb shell dmesg | grep avc` 2. **协议不兼容**: - 确认 `config.xml` 中目标协议已启用[^2] - 检查 HAL 层实现:`ls -l /vendor/lib64/hw/bluetooth.*.so`
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

~未来可期~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值