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

本文揭示了Android应用安装过程中文件保存位置的变化规律,并通过源码查找揭示了一种访问不可见目录下文件的方法。

本文转自http://blog.youkuaiyun.com/zys871228/article/details/12746831

地球人都知道的:

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

或许你不知道 的:

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


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



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

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

[java]  view plain copy
  1. file = new File(getPackageManager().getApplicationInfo("com.uc.addon.qrcodegenerator"0).sourceDir);  

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

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

<think>好的,用户想在Android应用中创建android/data/目录下的文件夹。首先,我需要回忆一下Android文件系统结构。根据引用[5],context.getExternalFilesDir()通常会指向外部存储的Android/data/<package>/files目录。但用户提到的是在data目录下,可能是指内部存储的/data/data/<package>/files,或者外部存储的Android/data/下的目录? 用户引用的内容中,引用[1]提到内部存储路径/data/data/<package>/files,而引用[3]和[4]讨论的是外部存储,使用getExternalFilesDirs方法。因此需要明确用户是想在内部存储还是外部存储创建文件夹。 如果用户是指内部存储,如/data/data/<package>/files的子目录,可以使用context.getFilesDir()获取路径,然后创建目录。但根据引用[1],openFileOutput不能包含路径分隔符,所以可能需要使用File API来创建目录。例如,通过File.mkdir()。 如果用户指的是外部存储的Android/data/<package>/files,则需要使用context.getExternalFilesDir(null)获取基础路径,然后创建子目录。这里要注意权限问题,引用[2]提到需要权限,但Android 10以上可能不需要WRITE_EXTERNAL_STORAGE权限,因为应用专属目录可以访问。 另外,用户的问题可能混淆了内部和外部存储路径。需要确认他们想创建的位置。例如,内部存储的路径是/data/data/包名/files,而外部存储是/storage/emulated/0/Android/data/包名/files。根据引用[3],使用getExternalFilesDirs可以访问外部存储的应用专属目录,并且如果目录不存在,可能需要手动创建,因为某些方法不会自动创建。 总结步骤:首先确定用户需要的是内部还是外部存储的data目录。然后使用对应的API获取路径,创建文件夹。例如,内部存储使用getFilesDir(),外部存储使用getExternalFilesDir()。创建目录时检查是否存在,并处理可能的异常,比如IO异常。同时注意权限问题,尤其是在Android高版本上的权限变化。 可能的问题:用户是否在混淆内部和外部存储路径?是否需要特定权限?是否需要考虑不同Android版本的存储访问限制?例如,作用域存储(Scoped Storage)在Android 10及以上版本限制了对外部存储的随意访问,但应用专属目录无需权限。</think>在Android系统中创建`android/data/`目录下的文件夹需根据目标路径类型选择不同方法。以下分两种情况说明: --- ### 情况一:创建内部存储的`/data/data/<package>/`子目录 **路径示例**:`/data/data/com.example.app/files/custom_folder` **实现步骤**: 1. 使用`Context.getFilesDir()`获取应用内部存储的`files`目录路径 2. 通过`File`类创建子目录: ```java File internalDir = new File(context.getFilesDir(), "custom_folder"); if (!internalDir.exists()) { boolean success = internalDir.mkdirs(); if (!success) { Log.e("TAG", "目录创建失败"); } } ``` **注意**:此目录无需额外权限,应用自动拥有访问权限[^1][^5]。 --- ### 情况二:创建外部存储的`Android/data/<package>/`子目录 **路径示例**:`/sdcard/Android/data/com.example.app/files/custom_folder` **实现步骤**: 1. 获取外部存储的应用专属目录路径: ```java File externalDir = context.getExternalFilesDir("custom_folder"); ``` 2. 检查目录是否存在并创建: ```java if (externalDir != null && !externalDir.exists()) { boolean success = externalDir.mkdirs(); if (!success) { Log.e("TAG", "目录创建失败"); } } ``` **权限要求**: - Android 10及以上:无需声明权限(受作用域存储限制)[^3][^4] - Android 9及以下:需声明`WRITE_EXTERNAL_STORAGE`权限: ```xml <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` --- ### 关键区别总结 | 特性 | 内部存储 (`/data/data/`) | 外部存储 (`Android/data/`) | |---------------------|-------------------------------|----------------------------------| | 访问方式 | `Context.getFilesDir()` | `Context.getExternalFilesDir()` | | 卸载应用是否删除 | 是 | 是(默认) | | 用户可见性 | 不可见(需root) | 可见但受系统限制 | | 权限要求 | 无需权限 | 部分版本需声明权限 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值