平台

RK3566 + Android 11

概述

在之前的SDK(Android 5, 6, 7, 8, 9)中, 增加了服务和系统接口, 方便第三方应用调用. 其中有一些功能, 需要让SYSTEM去访问内部存储的文件.
常用的路径有:

File f = new File("/sdcard");
f = new File("/mnt/sdcard");
f = new File("/storage/emulated/0");
f = Environment.getExternalStorageDirectory();

实际上, 都指向一个位置, 其形态大多类似:

ls -l /sdcard
lrw-r--r--   1 root   root         21 2022-02-18 07:12 sdcard -> /storage/self/primary

正题
增加的系统服务, 一般是运行在system_server进程中:

rk3566_r:/ $ ps | grep system_server
system          444    255 16878032 429340 0                  0 S system_server

要让它能访问SDCARD, 旧的SDK可以参考:
【framework】framework中为systemserver添加权限

在刚拿到的 Android 11 中, 在解决了组权限 及 SELINUX权限后, 发现仍然无法正常访问.

原因

看了一SDCARD 目录, 发现了一堆u0_a120

rk3566_r:/sdcard $ ll
total 204
drwx------ 2 u0_a120  u0_a120    3452 2022-02-18 07:12 Alarms
drwxrws--x 5 media_rw media_rw   3452 2022-02-18 07:12 Android
drwx------ 2 u0_a120  u0_a120    3452 2022-02-18 07:12 Audiobooks
drwx------ 2 u0_a120  u0_a120    3452 2022-02-18 07:12 DCIM
drwx------ 2 u0_a120  u0_a120    3452 2022-02-18 07:12 Documents
drwx------ 2 u0_a120  u0_a120    3452 2022-02-18 07:12 Download
drwx------ 3 u0_a120  u0_a120    3452 2022-02-18 07:12 Movies
drwx------ 3 u0_a120  u0_a120    3452 2022-02-18 07:12 Music
drwx------ 2 u0_a120  u0_a120    3452 2022-02-18 07:12 Notifications
drwx------ 4 u0_a120  u0_a120    3452 2022-02-18 08:35 Pictures
drwx------ 2 u0_a120  u0_a120    3452 2022-02-18 07:12 Podcasts
drwx------ 2 u0_a120  u0_a120    3452 2022-02-18 07:12 Ringtones

按旧的版本, 用户和组应该是 sdcard_rwmedia_rw
如3288 7.1上是:

rk3288:/sdcard $ ll
total 35M
drwxrwx--x 20 root sdcard_rw 4.0K 2022-02-18 10:52 .
drwx--x--x  4 root sdcard_rw 4.0K 2021-12-27 11:40 ..
drwxrwx--x  2 root sdcard_rw 4.0K 2021-12-27 11:40 Alarms
drwxrwx--x  3 root sdcard_rw 4.0K 2021-12-27 11:40 Android
drwxrwx--x  2 root sdcard_rw 4.0K 2022-01-18 15:30 CircleDetector
drwxrwx--x  4 root sdcard_rw 4.0K 2021-12-30 09:35 DCIM
drwxrwx--x  2 root sdcard_rw 4.0K 2021-12-27 11:40 Download
drwxrwx--x  2 root sdcard_rw 4.0K 2021-12-27 11:40 Movies
drwxrwx--x  2 root sdcard_rw 4.0K 2021-12-27 11:40 Music
drwxrwx--x  2 root sdcard_rw 4.0K 2021-12-27 11:40 Notifications
drwxrwx--x  2 root sdcard_rw 4.0K 2021-12-27 11:40 Pictures
drwxrwx--x  2 root sdcard_rw 4.0K 2021-12-27 11:40 Podcasts
drwxrwx--x  2 root sdcard_rw 4.0K 2021-12-27 11:40 Ringtones

关于 u0_a120:

rk3566_r:/sdcard $ ps | grep a120
u0_a120        1263    255 13913292 140492 0                  0 S com.android.providers.media.module

源码:

packages/providers/MediaProvider/

在此不对MediaProvider作过多分析

另一个现象, 尝试编译一个测试APP, 进行SDCARD写入操作(b.txt), 最终发现, 访问的文件权限同样为:

-rw------- 1 u0_a120  u0_a120       4 2022-02-18 07:27 b.txt
  • App 权限申请见后文.

记录几个路径便于日后分析:

libcore/luni/src/main/native/libcore_io_Linux.cpp
libcore/luni/src/main/java/libcore/io/IoBridge.java
kernel/fs/namei.c
kernel/fs/open.c

kernel/fs/namei.c 最终输出 EACCES的函数

//记录下调用流程, 内核中输出LOG:
//[   59.897756] do_sys_open.c /mnt/sdcard/test.png flag=131649 mode=438
//[   59.897805] namei.c path_openat /mnt/sdcard/test.png
//[   59.897807] namei.c link_path_walk /mnt/sdcard/test.png
//[   59.897819] namei.c do_inode_permission
//[   59.897829] namei.c acl_permission_check 1000, 0
//[   59.897839] namei.c generic_permission ret=0
//[   59.897848] namei.c inode_permission2 retval=0
//[   59.897860] namei.c may_lookup err=0
/** This does the basic permission checking*/
static int acl_permission_check(struct inode *inode, int mask)
{unsigned int mode = inode->i_mode;if (likely(uid_eq(current_fsuid(), inode->i_uid)))mode >>= 6;else {if (IS_POSIXACL(inode) && (mode & S_IRWXG)) {int error = check_acl(inode, mask);if (error != -EAGAIN)return error;}if (in_group_p(inode->i_gid))mode >>= 3;}/** If the DACs are ok we don't need any capability check.*/if ((mask & ~mode & (MAY_READ | MAY_WRITE | MAY_EXEC)) == 0)return 0;return -EACCES;
}

所以, 就算如【framework】framework中为systemserver添加权限
文中所提解决方案打上补丁, 这个函数最终还是会返回 EACCESS.

暴力修改 return -EACCES;改为 return 0; 后, 验证文件读写成功!!

参考

  • Linux 系统调用之open(三)
  • 关于安卓open failed: EACCES (Permission denied)

Android 11 system_server 读写 SDCARD相关推荐

  1. Android 读写SDcard (转)

    最近有个想法,就是想实现一个读写文件实例,一开始只想读写简单的文件(如txt格式文件),后面想到了读写XML文件,其实无论是写txt文件还是XML文件,其实写入的值都是一个字符串值,所以关键是如何实现 ...

  2. Android 11 上的文件读写权限(MANAGE_EXTERNAL_STORAGE)

    平台 Android11 + RK3566 + AndroidStudio Android 权限的变化, 几乎每个版本的SDK都会有, 其中最大的一次是在6.0时, 增加的动态权限申请 读写存储的权限 ...

  3. 干货 | Trip.com Android 11 适配之旅

    作者简介 Symeon,携程高级移动开发工程师,关注Android前沿技术. Google Play 商店在 2021 年第 3.4 季度正式加强对应用 targetSdkVersion 的限制,要求 ...

  4. 以 Android 11 为目标平台的应用

    只有指定了targetVersion=30时需要适配一下内容. 1.存储与访问机制变更 Android 中存储可以分为两大类:私有存储和共享存储 私有存储 (Private Storage) : 每个 ...

  5. Android 11 应用适配 兼容性

    Android 11 应用兼容性适配指导 本文非原创-若侵犯到原创利益,请联系删除 原文 https://open.oppomobile.com/wiki/doc#id=1072 一.隐私更新 2.1 ...

  6. Android有文件读写权限,无法读写文件 open failed: EACCES (Permission denied) 获取设备唯一不变id 所有文件读写权限按钮无法打开

    最近有个需求,要获取设备唯一id,Android一直没有什么完善的方案获取设备唯一不变的id,我就结合了几种方案组成了一下: 1. 首先获取IMEI; IMEI获取失败后 2. 获取SN序列号,序列号 ...

  7. android文件操作和SDCard卡操作

    2019独角兽企业重金招聘Python工程师标准>>> public class FileService {     private Context context;      // ...

  8. 使用RootTools实现对Android系统文件的读写

    使用RootTools实现对Android系统文件的读写  作者:          蒋东国  时间:     2016年11月2日 星期三  应用来源:     hqt APP(测试机型:华为荣耀4 ...

  9. Android10有sdcard读写权限,仍无法读写sdcard中文件问题解决

    一.问题场景 在Android 10及以上系统的手机上测试发现,明明已经申请了 android.permission.READ_EXTERNAL_STORAGE 和 android.permissio ...

  10. android : 更新android 11 后 获取设备唯一码的方式

    android 11 发布了 android 11 以前使用的MAC的设备唯一码的方式被废弃了,因为11不让用了,然后就去官方上找推荐了; 之前的获取MAC的地址,有兴趣的可以点进去看看 官方推荐使用 ...

最新文章

  1. 剑指offer:面试题15. 二进制中1的个数
  2. [Java入门笔记] 面向对象编程基础(二):方法详解
  3. 怎么才能更好的掌握Python这门语言?该怎么学呢?
  4. 开源项目使用经验原则
  5. CRM和C4C product category hierarchy的可编辑性控制逻辑
  6. linux无法下载ftp,linux 不能下载怎么办
  7. 海信CAS计算机辅助手术系统,计算机辅助手术系统(CAS)
  8. [高光谱] 在开源项目Hyperspectral-Classification Pytorch中加入自己的网络
  9. Theatre.js 动画JavaScript库
  10. Python基本数据类型之set
  11. libevent源码分析系列
  12. 10)-MySQL数据库基础练习(答案版)
  13. RDPWrap1.6.2让windows家庭版Home实现远程桌面
  14. 复现《Cell》图表:双侧柱状图及坐标轴设置,ComplexHeatmap图例设置
  15. html回调函数,JS 回调函数
  16. 网络电话是如何实现打到普通话机上的?
  17. window10吐槽
  18. 一次简单的 HTTP 调用,为什么时延这么大?
  19. 校招Java后端开发面经专栏——序
  20. 初学 PCIe System (一) - PCIe介绍及其配置空间

热门文章

  1. [python爬虫之路day20]:CrawSpider爬取微信小程序社区技术帖
  2. PPT和WORD转成PDF时图有黑底
  3. 有关5G技术的认知与感想
  4. Vue学习----第三天_webpack(学习webpack看这一篇就够了1.8w字)【6.7】
  5. 基于ARM裸机的知识点总结(9)------基于S5PV210的定时器、看门狗和RTC
  6. 【题解】【AcWing】1564. 哈希
  7. 游戏测试好还是软件测试好,浅学软件测试 软件测试和游戏测试哪个有前途?...
  8. 【coq】函数语言设计 笔记 01 - basics
  9. 未群发消息接腾讯服务器吗,腾讯企业QQ(协同)如何设置并群发消息?
  10. TRC病毒-宿主融合抑制剂研究丨4-氨基-1-叔丁基说明书