Android访问/data/app/下文件方法

通过Android源码分析,发现即使没有/data/app目录的访问权限,但该目录下的apk文件具有读权限。可以使用getPackageManager().getApplicationInfo()方法获取apk的sourceDir,从而无权限问题地访问文件。

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

地球人都知道的:

A) /data/app/目录本身要su的访问权限,所以无法new File("/data/app");

或许你不知道的:

B) 初始安装时,文件被保存在:
data/app + [包名].apk
覆盖安装N次后,文件名为:
data/app + [包名]-N.apk


用adb shell 进入 /data/app/目录



赫然发现,即使/data/app目录本身是不可访问的,但是目录下的文件居然有读权限!。
那么可以肯定的是,必然有一种方法可以访问到这个目录下的文件。

经过一个多小时的Android源码查找,找到了如下方法:

file = new File(getPackageManager().getApplicationInfo("com.uc.addon.qrcodegenerator", 0).sourceDir);

这里getPackageManager是Context下的方法,不需要赘言了,sourceDIr返回了完整apk路径,包括-N之类的讨厌玩意。

而直接访问这个路径下的文件,是不会有权限问题的。





访问 `Android/data` 目录的操作通常涉及到对外部存储(External Storage)的读取或写入权限,以及对特定文件路径的理解。 ### 一、理解外部存储结构 对于 Android 系统来说,“`/storage/emulated/0/Android/data/`”这个路径下存放着每个应用对应的专属数据目录。每一个应用程序都有一个以其包名命名的数据文件夹,在这里可以保存一些缓存、配置或者其他形式的应用特有信息。 例如:如果你安装了名为 com.example.app 的应用程序,则它的默认私有存储位置将会是在 `/storage/emulated/0/Android/data/com.example.app/` 中。 注意从 **Android 10** (API level 29) 开始引入了一个叫做 "分区存储" 或者说是scoped storage的新特性,默认开启了限制第三方app直接操作其他应用专有的文件夹的功能;而到了 **Android 13**, 这种趋势进一步加强,并且官方持续鼓励开发者尽量使用系统提供的 API 来代替手动管理文件的方式。 因此如果提到的是未来的版本如“Android 15”,虽然目前还没有确切的信息关于它将有哪些改动,但是预计会延续甚至强化现有的安全措施及隐私保护政策,比如更严格的存储空间隔离机制等。 ### 二、如何获得相应的权限 为了能够在上述路径内创建新文件或是更改已有内容: #### 对于低于 Android 10 版本: 你需要请求用户的同意授予你两个基本权限——`READ_EXTERNAL_STORAGE` 和 `WRITE_EXTERNAL_STORAGE`. ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> ``` 然后通过运行时检查是否已经获得了必要的授权,如果没有的话需要提示用户授予权限。 ```java if(ContextCompat.checkSelfPermission(thisActivity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){ ActivityCompat.requestPermissions(thisActivity, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, MY_PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE); } ``` #### 针对 Android 10 及以上版本 : - 如果只需要读取公共媒体资源(图片、视频),那么仅需声明 READ_MEDIA_IMAGES / READ_MEDIA_VIDEO 就足够。 - 若要向 `Android/data/<package_name>` 内写入非媒体类型的文档,则应考虑申请 MANAGE_EXTERNAL_STORAGE ,不过这项权力会被平台视为高风险级别并受到更多审查。 重要提醒:自 Android 11 起除非满足非常特殊的情况并且明确说明理由给到Google Play审核团队批准外,普通应用是很难获批获取所有文件访问权(manage_all_files_access_permission) 的。 考虑到未来版本可能会继续收紧权限控制策略,建议尽可能采用更加安全合规的方式来处理本地持久化需求,包括但不限于利用 ContentResolver 操作共享内容提供程序所提供的接口、MediaStore 数据库记录新增多媒体条目等等。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值