Android app开发中,禁止访问/data/local/tmp

     

       


最近在做一个项目,希望能够将一些预编译好的bin,so等从assert目录中,拷贝到/data/local/tmp目录下面,然后在android app开发中调用

Runtime runtime = Runtime.getRuntime();
Process proc = runtime.exec(command);

      模拟adb shell命令的执行情况,出现的问题有如下几个:

      1)没有办法创建目录

      2) 没有办法使用chmod

     提示,都是表示权限不够。

    后面在https://stackoverflow.com/questions/23424602/android-permission-denied-for-data-local-tmp中找到了原因。因为在最新的Android版本(我们的是7.0.1),这样做是不允许的。虽然他曾经可以过。

     我这边参考文中给出的方案,把我的所有预编译的东西都拷贝到了getContext().getFilesDir() 。在实际的项目中,这个地址是:/data/data/com.***.***/files.

     而关于文件的拷贝,可以通过OutputStream来实现。

    private void copyBigDataToSD(String strOutFileName) throws IOException {
        Log.i(TAG, "start copy file " + strOutFileName);
        File sdDir =  mActivity.getFilesDir();//获取跟目录
        File file = new File(sdDir.toString()+"/L2Norm/");
        if (!file.exists()) {
            file.mkdir();
        }

        String tmpFile = sdDir.toString()+"/L2Norm/" + strOutFileName;
        File f = new File(tmpFile);
        if (f.exists()) {
            Log.i(TAG, "file exists " + strOutFileName);
            return;
        }
        InputStream myInput;
        java.io.OutputStream myOutput = new FileOutputStream(sdDir.toString()+"/L2Norm/"+ strOutFileName);
        Log.i(TAG, "cpu property " + cpu_abi);
        String input_path = cpu_abi + "/" + strOutFileName;
        Log.i(TAG, "file exists " + input_path);
        myInput = this.mActivity.getAssets().open(input_path);
        byte[] buffer = new byte[1024];
        int length = myInput.read(buffer);
        while (length > 0) {
            myOutput.write(buffer, 0, length);
            length = myInput.read(buffer);
        }
        myOutput.flush();
        myInput.close();
        myOutput.close();
    }

 

<think>我们正在处理一个关于Android开发中加载APK文件时出现的IOException问题。用户遇到了错误信息:"java.io.IOException: Failed to load asset path /data/local/tmp/tide-app-v4.5.8-7926.apk from fd 815"。我们需要分析可能的原因并提供解决方案。 首先,我们回顾一下用户提供的引用信息。虽然引用[1]和[2]是关于其他IOException问题的,但它们提供了一些线索:文件路径问题、权限问题或资源不可用。然而,用户当前的问题是在加载APK文件时出现的,所以我们需要关注Android环境下的可能原因。 常见原因分析: 1. **文件路径不存在或错误**:检查APK文件是否确实存在于`/data/local/tmp/`目录下。 2. **权限问题**:应用程序可能没有权限访问该路径或文件。 3. **文件损坏**:APK文件可能已损坏或不完整。 4. **文件描述符问题**:错误信息中提到“from fd 815”,这可能表示文件描述符传递或使用有问题。 5. **存储空间不足**:设备存储空间不足可能导致加载失败。 解决方案步骤: 1. **确认文件存在**: 使用adb shell连接到设备,检查文件是否存在: ```bash adb shell ls -l /data/local/tmp/tide-app-v4.5.8-7926.apk ``` 如果文件不存在,需要重新将APK推送到设备。 2. **检查文件权限**: 确保文件具有可读权限。通常,`/data/local/tmp`目录的权限比较宽松,但最好确认一下。可以使用以下命令修改权限: ```bash adb shell chmod 644 /data/local/tmp/tide-app-v4.5.8-7926.apk ``` 3. **重新推送APK文件**: 如果文件损坏或推送不完整,重新推送APK文件: ```bash adb push tide-app-v4.5.8-7926.apk /data/local/tmp/ ``` 4. **检查存储空间**: 使用以下命令检查设备存储空间: ```bash adb shell df /data ``` 5. **检查应用程序权限**: 如果是在应用程序中加载该APK,确保应用程序有读取外部存储的权限(在AndroidManifest.xml中添加并动态请求权限): ```xml <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" /> ``` 6. **尝试其他目录**: `/data/local/tmp`目录通常是可访问的,但也可以尝试将APK放在其他目录,如sdcard目录: ```bash adb push tide-app-v4.5.8-7926.apk /sdcard/ ``` 然后在代码中加载时使用`/sdcard/tide-app-v4.5.8-7926.apk`。 7. **检查文件描述符传递**: 如果错误发生在通过文件描述符加载APK时(例如使用`ParcelFileDescriptor`),确保文件描述符没有被关闭,并且传递正确。 8. **重启设备**:有时重启设备可以解决临时性的资源问题。 9. **检查ADB版本**:确保ADB版本是最新的,避免因ADB版本问题导致文件传输错误。 如果上述步骤不能解决问题,可能需要查看更详细的日志以确定具体原因。可以使用`adb logcat`来捕获更多错误信息。 相关问题: 1. 如何解决Android中文件权限问题? 2. 在Android开发中,如何正确加载外部存储中的APK文件? 3. 使用adb命令时常见错误有哪些?</think>### 解决java.io.IOException: Failed to load asset path问题 该错误通常发生在Android应用尝试加载APK文件时出现路径或权限问题。以下是逐步解决方案: #### 1. **检查文件路径有效性** - 确认APK文件确实存在于指定路径: ```bash adb shell ls -l /data/local/tmp/tide-app-v4.5.8-7926.apk ``` - 若文件不存在,重新推送APK: ```bash adb push tide-app-v4.5.8-7926.apk /data/local/tmp/ ``` #### 2. **验证文件权限** - 确保文件有可读权限: ```bash adb shell chmod 644 /data/local/tmp/tide-app-v4.5.8-7926.apk ``` - 检查目录权限: ```bash adb shell ls -ld /data/local/tmp ``` #### 3. **检查存储空间** - 确认设备存储空间充足: ```bash adb shell df /data ``` #### 4. **排查文件损坏** - 计算APK的MD5校验和: ```bash md5sum tide-app-v4.5.8-7926.apk # 本地 adb shell md5sum /data/local/tmp/tide-app-v4.5.8-7926.apk # 设备端 ``` - 若校验和不匹配,重新传输文件 #### 5. **检查SELinux策略** - 临时禁用SELinux(测试用): ```bash adb shell setenforce 0 ``` - 若问题解决,需调整SELinux策略: ```bash adb shell dmesg | grep avc # 查看拒绝日志 ``` #### 6. **尝试替代路径** - 使用SD卡目录测试: ```bash adb push tide-app-v4.5.8-7926.apk /sdcard/ ``` - 在代码中修改加载路径为`/sdcard/tide-app-v4.5.8-7926.apk` #### 7. **代码层检查** ```java try { AssetManager am = getAssets(); InputStream is = am.open("data/local/tmp/tide-app-v4.5.8-7926.apk"); } catch (IOException e) { Log.e("ASSET_LOAD", "Error opening asset: " + e.getMessage()); } ``` #### 8. **设备重启** ```bash adb reboot ``` > **注意**:`/data/local/tmp`目录在非root设备上可能受限,建议优先使用应用私有目录或外部存储[^1]。 --- ### 相关问题 1. Android中如何正确处理外部存储的文件权限? 2. 有哪些工具可以诊断SELinux导致的权限问题? 3. 应用安装时出现`INSTALL_FAILED_INSUFFICIENT_STORAGE`错误如何解决? 4. ADB文件传输失败有哪些常见原因和解决方案? [^1]: 引用自用户提供的IOException错误信息 [^2]: 引用自HDFS加载失败的异常堆栈信息
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值