Android11编译第七弹:串口文件读写

问题:需要对SIM卡进行管理,支持APP切换SIM卡。此功能需要访问串口文件,并且对串口文件进行读写。APP操作串口文件/dev/ttyUSB1时,串口文件打开失败。

bash 复制代码
2023-11-23 10:59:44.092 14264-14264 MULTI_CARD_SerialHandle com.wellnkiot.multinic               E  ===========open error
                                                                                                    java.lang.SecurityException
                                                                                                    	at android.serialport.SerialPort.<init>(SerialPort.java:108)
                                                                                                    	at android.serialport.SerialPort$Builder.build(SerialPort.java:299)
                                                                                                    	at com.wellnkiot.multinic.mode.SerialHandle.open(SerialHandle.java:79)
                                                                                                    	at com.wellnkiot.multinic.mode.SerialHandle.open(SerialHandle.java:50)
                                                                                                    	at com.wellnkiot.multinic.mode.SerialManage.open(SerialManage.java:70)
                                                                                                    	at com.wellnkiot.multinic.mode.command.impl.ChangeCardPinServiceImpl.<init>(ChangeCardPinServiceImpl.java:53)
                                                                                                    	at com.wellnkiot.multinic.mode.command.SimCommandMode.getChangeCardService(SimCommandMode.java:91)
                                                                                                    	at com.wellnkiot.multinic.mode.command.SimCommandMode.changeAutoStatus(SimCommandMode.java:60)

打开串口的时候,报错"java.lang.SecurityException",这个是安全访问错误。

一、什么是串口?

二、串口文件的访问

三、串口文件授权访问

怎么实现APP对串口文件的访问呢?

基本的实现思路:

1)APP授权system用户。APP采用系统签名,作为系统应用, 对应的用户system,方便用户访问读写串口文件

2)串口文件授权system用户访问

3.1 应用调整为系统应用

3.1.1 什么是应用应用?

系统应用需要集成到ROM中。

3.1.2 APP签名采用系统签名

APP打包的时候,签名文件采用系统签名文件。

对应的APP application模块,build.gradle中,定义签名文件

bash 复制代码
    signingConfigs {
        release {
            keyAlias 'xxx'
            keyPassword 'xxx'
            storeFile file('../systemJupiter.jks')
            storePassword 'xxx'
        }
        debug {
            keyAlias 'xxx'
            keyPassword 'xxx'
            storeFile file('../systemJupiter.jks')
            storePassword 'xxx'
        }
    }


    buildTypes {
        debug {
            // 版本名称增加后缀
            versionNameSuffix = ".debug"
            minifyEnabled false
            debuggable true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.debug
        }
        release {
            minifyEnabled true
            debuggable false//true 开启可以知道进程包名,debug默认为true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.release
        }
    }

编译时采用系统签名。

这样,生成的APP,对应的用户是system,用户组也是system

3.1.3 APP清单文件指定UID为system

XML 复制代码
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.sandstar.jupiter.client"
    android:sharedUserId="android.uid.system">
复制代码
android:sharedUserId="android.uid.system"

将此APP的用户ID定义为系统system

3.1.4 内置应用允许升级更新

清单文件AndroidManifest.xml中,application节点,不要设置为常驻程序

android:persistent="true",否则无法安装过呢更新包。

因为系统应用+常驻程序,是不允许安装更新包的。

3.2 串口文件授权system访问

APP已经授权system用户以后,就可以访问system级别的文件。

3.2.1 确认系统串口文件普通权限

bash 复制代码
1|lahaina:/ $ ls -al /dev/tty*
crw-rw-rw- 1 root      root     5,   0 1970-01-03 08:44 /dev/tty
crw------- 1 root      root   235,   0 1970-01-03 08:44 /dev/ttyEUD0
crw-rw---- 1 bluetooth net_bt 234,   0 2023-11-23 11:17 /dev/ttyHS0
crw-rw---- 1 system    system 234,   1 1970-01-03 08:44 /dev/ttyHS1
crw-rw---- 1 system    system 234,   2 2023-11-23 11:21 /dev/ttyHS2
crw------- 1 root      root     4,  64 1970-01-03 08:44 /dev/ttyS0
crw------- 1 root      root     4,  65 1970-01-03 08:44 /dev/ttyS1
crw------- 1 root      root     4,  66 1970-01-03 08:44 /dev/ttyS2
crw------- 1 root      root     4,  67 1970-01-03 08:44 /dev/ttyS3
crw-rw---- 1 radio     radio  188,   0 2023-11-22 14:55 /dev/ttyUSB0
crw-rw---- 1 radio     radio  188,   1 2023-11-22 14:55 /dev/ttyUSB1
crw-rw---- 1 radio     radio  188,   2 2023-11-23 11:22 /dev/ttyUSB2
crw-rw---- 1 radio     radio  188,   3 2023-11-22 14:55 /dev/ttyUSB3
lahaina:/ $

很清理,我们能看到/dev/ttyHS1和/dev/ttyHS2都是归属 system:system用户组,因此我们的

系统应用可以访问。而 /dev/ttyUSB1,归属的用户是radio:radio,两者并非同一个用户组,

因此无法通过system访问 /dev/ttyUSB1 串口文件。

3.2.2 串口文件归属切换system用户

怎么将 /dev/ttyUSB1 文件用户组调整为 system:system 呢?

相关推荐
千里马学框架5 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台5 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone5 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc5 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo5 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077005 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼5 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone5 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen5 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone5 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui