Android 11 system_server 读写 SDCARD

简介: Android 11 system_server 读写 SDCARD

平台


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_rw 或 media_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)


相关文章
|
9月前
|
前端开发 Java API
Android系统中读写和显示图片
Android系统中读写和显示图片
63 0
|
10月前
|
Android开发
Android 9.0中sdcard 的权限和挂载问题
Android 9.0中sdcard 的权限和挂载问题
122 0
|
10月前
|
XML Android开发 数据安全/隐私保护
android 11后文件读写访问权限申请
android 11后文件读写访问权限申请
333 0
|
10月前
|
存储 Android开发
Android Studio开发之存储卡的文件操作讲解及实战(附源码 在存储卡上读写文本文件和图片文件)
Android Studio开发之存储卡的文件操作讲解及实战(附源码 在存储卡上读写文本文件和图片文件)
417 0
|
Android开发
Android -- 在存储卡上读写图片文件
Android -- 在存储卡上读写图片文件
120 0
|
存储 开发工具 Android开发
Android 11 上的文件读写权限(MANAGE_EXTERNAL_STORAGE)
Android 11 上的文件读写权限(MANAGE_EXTERNAL_STORAGE)
2257 0
Android 11 上的文件读写权限(MANAGE_EXTERNAL_STORAGE)
|
Unix Linux Android开发
|
缓存 数据库 Android开发
新建文件夹,复制文件,glide保存文件android 获取sdcard,获取data.data 目录file.mkdirs() file.mkdir()Dev
新建文件夹,复制文件,glide保存文件android 获取sdcard,获取data.data 目录file.mkdirs() file.mkdir()Dev
|
Linux Android开发
【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 )
【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 )
320 0
【Android 逆向】ptrace 函数 ( ptrace 函数族 | 进程附着 | 进程脱离 | 进程数据读写权限 | 进程对应的主线程寄存器读写 | 单步调试 |ptrace 函数族状态转换 )
|
监控 Android开发 开发者
【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )
【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )
531 0
【Android 高性能音频】AAudio 音频流 缓冲区 简介 ( AAudio 音频流内部缓冲区 | 缓冲区帧容量 | 缓冲区帧大小 | 音频数据读写缓冲区 )

热门文章

最新文章

  • 1
    Android历史版本与APK文件结构
  • 2
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
  • 3
    【03】仿站技术之python技术,看完学会再也不用去购买收费工具了-修改整体页面做好安卓下载发给客户-并且开始提交网站公安备案-作为APP下载落地页文娱产品一定要备案-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 4
    【01】仿站技术之python技术,看完学会再也不用去购买收费工具了-用python扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-客户的麻将软件需要下载落地页并且要做搜索引擎推广-本文用python语言快速开发爬取落地页下载-优雅草卓伊凡
  • 5
    【03】微信支付商户申请下户到配置完整流程-微信开放平台创建APP应用-填写上传基础资料-生成安卓证书-获取Apk签名-申请+配置完整流程-优雅草卓伊凡
  • 6
    【02】仿站技术之python技术,看完学会再也不用去购买收费工具了-本次找了小影-感觉页面很好看-本次是爬取vue需要用到Puppeteer库用node.js扒一个app下载落地页-包括安卓android下载(简单)-ios苹果plist下载(稍微麻烦一丢丢)-优雅草卓伊凡
  • 7
    Cellebrite UFED 4PC 7.71 (Windows) - Android 和 iOS 移动设备取证软件
  • 8
    escrcpy:【技术党必看】Android开发,Escrcpy 让你无线投屏新体验!图形界面掌控 Android,30-120fps 超流畅!🔥
  • 9
    Android实战经验之Kotlin中快速实现MVI架构
  • 10
    即时通讯安全篇(一):正确地理解和使用Android端加密算法