此文基于已经获取 root 权限的开发环境
问题
众所周知,Android 在 sdk29(Android 10)时更改了文件读写的结构,以防止 app 对用户公共文件夹进行随意读写。在 9 之前包括 9,如果想读写其它 App 私有资源可使用 libsu 库,libsu 是 magisk 作者 topjohnwu 推出的一个 Android 库,它可以为使用 root 权限的应用程序提供完整的解决方案,具体代码实现如下:
//读取其它app的私有文件
InputStreamReader fin = new InputStreamReader(SuFileInputStream.open("/data/data/其它app包名/***"));
//将文件写入到其它app的私有目录中
OutputStreamWriter fout = new OutputStreamWriter(OutputStreamWriter.open("/data/data/其它app包名/***"));
上面的文件读写函数在 Android 9 及以下系统版本中可正常运行,但是如果在 Android 10 及以上系统版本中,会提示 java.io.FileNotFoundException: No such file or directory,即找不到文件,如果你使用 adb 工具或者 MT 管理器,会发现想要操作的文件就静静的躺在那里,此时心中一万头***奔腾而过,到底哪里有问题?
解决方案
其实如果仔细看,会发现系统根目录下有个 data_mirror 目录,跟 data 很像啊,字面意思不就是 data 的镜像吗,是的,Android 通过 mount tmpfs 的方式将常见的应用目录(如 /data/data
、/data/user_de
)使得对应用而言仅可访问和发现自己的存储目录,进而避免 stat /data/data/<package_name>
的方式探测用户安装的其他应用的存在。所以,我们可以通过操作 /data_mirror/data_ce/null/0/其它app包名/***
的方式实现,具体代码如下:
//读取其它app的私有文件
InputStreamReader fin = new InputStreamReader(SuFileInputStream.open("/data_mirror/data_ce/null/0/其它app包名/***"));
//将文件写入到其它app的私有目录中
OutputStreamWriter fout = new OutputStreamWriter(OutputStreamWriter.open("/data_mirror/data_ce/null/0/其它app包名/***"));
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于