Android系统应用开发

没有检索到摘要

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android系统应用开发

android:sharedUserId=“android.uid.system”

AndroidMainfest.xml中添加 android:sharedUserId="android.uid.system" 。通过sharedUserId属性,相同User id的apk配置运行在同一进程中,把程序的User id配置成android.uid.system,也就是让程序运行在系统进程中,这样程序就有权限来读写系统配置。

每个apk或文件,系统都会分配属于自己的统一的用户ID(UID),创建沙箱保证其他应用的影响或影响其他应用。如:一般应用只能访问自己包名下的文件(/data/data/pkgname),不能反问其他包名下的,其他应用也访问不了自己包名下的文件。
sharedUserId,拥有同一user id的应用 之间就可以共享数据库和文件,相互访问。这些应用可以运行在同一进程,也可以运行不同进程。

有拥有相同sharedUserId标签的,且拥有相同签名的应用才能分配相同的用户ID,实现数据共享。如果仅仅拥有相同sharedUserId标签,是无法确保安全的,也很容易被非法利用。

Android push apk to /system/app/ or /system/priv-app

将安卓apk包安装到系统目录下

1.首先需要root权限 adb root
2.adb remount

adb remount put /system partition in writable mode. By default /system is only readable. It could only be done on rooted device.
adb remount 将 /system 分区置于可写模式。 默认情况下 /system 仅可读。 它只能在root设备上完成。
adb remount相当于adb shell mount -o rw,remount,rw /system

如果之前有安装过,或者run过,可先清除安装包,切换到对应的路径下
1.例如/system/priv-app下的apk,如adb shell rm -rf xxxx
2./data/data/对应包名的文件
或者直接在Android Studio中的Device FireExplorer中删除

3.将安装包push到/system/priv-app

adb push xxxx/path/debug.apk /system/priv-app

或者在或者直接在Android Studio中的Device FireExplorer中upload对应的apk

4.reboot

/system/app 和 /system/priv-app 的区别

可参考:

什么是system app?

  • 特定的shared uid的app都属于system app,例如:android.uid.systemandroid.uid.phoneandroid.uid.logandroid.uid.nfcandroid.uid.bluetoothandroid.uid.shell等,这些app都被赋予了ApplicationInfo.FLAG_SYSTEM标志,在PackageManagerService
  • 特定目录下的app,例如/vendor/overlay/system/framework/system/priv-app/system/app/vendor/app/oem/app下面的应用,这个在PackageManagerService中也有相关的定义

什么是特权app?

特权app 也叫privileged app,能够使用特许权限的应用
特权应用是位于系统映像某个分区上 priv-app 目录下的系统应用。各 Android 版本中,该分区为:

  • Android 8.1 及更低版本 - /system
  • Android 9 及更高版本 - /system, /product, /vendor

从这个路径可以知道,特权app首先必须是System app。也就是说 System app分为普通的system app和特权的system app。/system/app/system/priv-app区别就是,/system/app下面的是普通的system app,而/system/priv-app下面是特权app,他能够声明获得更多的权限。

从Android 8.0开始,特权应用如果使用系统的特许权限,那么需要把这个特许权限加入到白名单中,这个就叫特许权限许可名单

如何配置特许权限许可名单?

如何配置特许权限许可名单呢,这个在官方指导文档里面也说明了:

  • 对于已包含在 Android 开源项目 (AOSP) 树中的应用,请将其权限列在 /etc/permissions/privapp-permissions-platform.xml 中。
  • 对于 Google 应用,请将其权限列在 /etc/permissions/privapp-permissions-google.xml 中。
  • 对于其他应用,请使用以下格式的文件:/etc/permissions/privapp-permissions-DEVICE_NAME.xml

privapp-permissions.xml 文件只有在与特权应用位于同一分区时才能授予或拒绝授予该应用权限。例如,如果 /vendor 分区上的应用请求特许权限,则只能由同样位于 /vendor 上的 privapp-permissions.xml 文件来同意或拒绝该请求。

而像我们将应用预置到system下面的话,就要将privapp-permissions.xml文件放到system分区下面。

遇到的问题

1.Android Stuido不能直接运行项目,install apk到整机设备上
可能会有如下的提示:

Couldn't terminate the existing process for 

可以先root后,通过

adb shell ps 查看进程信息

adb shell ps | grep 包名 过滤某个进程的信息,可查看进程id

获取进程名,查找不能terminate的进程adb remount后,删除/system/priv-app 或者 data/data下的包,然后重启即可

<think>好的,我现在需要帮助用户了解如何使用查理复用技术通过3个GPIO控制6个LED灯。首先,我需要回顾查理复用的基本原理。根据用户提供的引用[1],查理复用允许n个引脚驱动n*(n-1)个LED,因此3个引脚可以控制3*2=6个LED,这与用户的问题一致。 接下来,我需要解释查理复用的工作原理。传统的行列式可能需要更多引脚,比如驱动6个LED需要5个引脚,而查理复用只需要3个,引用[1]和[2]都提到了这一点。关键在于利用GPIO的高阻态,这点在引用[3]中有详细说明。当某个引脚设置为高阻态时,它相当于断开,不会影响其他LED的通路。 然后,我需要具体说明3个GPIO控制6个LED的连接方式。每个LED需要连接两个不同的GPIO,并且方向相反。例如,LED1连接GPIO1正极和GPIO2负极,LED2则反过来连接GPIO2正极和GPIO1负极。这样每个GPIO对之间可以连接两个LED,形成6个组合。 接下来是控制逻辑。点亮某个LED时,需要设置一个GPIO为高电平,另一个为低电平,第三个为高阻态。例如,点亮LED1时,GPIO1设为高,GPIO2设为低,GPIO3设为高阻态。这样电流只能从GPIO1流经LED1到GPIO2。其他LED需要不同的组合,确保每次只有一个回路导通。 还需要考虑高阻态的实现,不同微控制器可能有不同的方法,用户需要参考具体的数据手册,如引用[3]提到的。此外,动态扫描和占空比调节也是必要的,以避免闪烁和亮度不均的问题。 最后,用户可能需要相关的应用场景和优缺点分析。查理复用适用于引脚资源紧张的情况,但软件复杂度较高,可能存在亮度问题。这些信息可以帮助用户全面了解该技术。 在组织回答时,要确保使用正确的中文表达,数学公式用$...$,独立公式用$$...$$,并引用提供的资料。同时,生成相关问题,如优化方法或应用场景,以进一步帮助用户。</think>[系统级指令响应] ### 使用3个GPIO控制6个LED的查理复用方法 #### 1. 基本原理 查理复用(Charlieplexing)通过GPIO引脚的高阻态(High-Z)和双向控制实现LED组合的动态切换。对于$n$个GPIO引脚,最多可控制$n(n-1)$个LED。3个GPIO的理论最大控制量是$3×2=6$个LED[^1][^2]。 #### 2. 硬件连接方式 每个LED连接两个不同GPIO引脚,形成双向通路: $$ \begin{cases} \text{LED1: GPIO1+ → GPIO2-} \\ \text{LED2: GPIO2+ → GPIO1-} \\ \text{LED3: GPIO1+ → GPIO3-} \\ \text{LED4: GPIO3+ → GPIO1-} \\ \text{LED5: GPIO2+ → GPIO3-} \\ \text{LED6: GPIO3+ → GPIO2-} \end{cases} $$ ![Charlieplexing示意图](https://via.placeholder.com/300x200.png?text=3GPIO-6LED+连接图) #### 3. 控制逻辑实现 通过状态组合点亮特定LED: | 目标LED | GPIO1 | GPIO2 | GPIO3 | |---------|-------|-------|-------| | LED1 | 高(H) | 低(L) | 高阻(Z)| | LED2 | 低(L) | 高(H) | 高阻(Z)| | LED3 | 高(H) | 高阻(Z) | 低(L) | | LED4 | 低(L) | 高阻(Z) | 高(H) | | LED5 | 高阻(Z)| 高(H) | 低(L) | | LED6 | 高阻(Z)| 低(L) | 高(H) | #### 4. 关键技术实现 1. **高阻态控制**:需配置GPIO为输入模式或特殊功能模式[^3] 2. **动态扫描**:以>60Hz频率循环点亮各LED 3. **占空比调节**:通过PWM控制亮度均衡 ```c // 示例伪代码 void light_LED1() { set_GPIO1(OUTPUT_HIGH); set_GPIO2(OUTPUT_LOW); set_GPIO3(INPUT_HIZ); } ``` #### 5. 应用场景 - 可穿戴设备的微型显示屏 - 物联网设备的低功耗状态指示 - 嵌入式系统的多状态反馈 #### 6. 优缺点分析 ✓ 节省引脚资源(相比传统矩阵节省50%引脚) ✗ 软件复杂度较高 ✗ 存在LED亮度不均衡问题
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值