本机子进程无法在应用程序文件夹或SD卡上创建文件

时间:2011-07-24 01:31:39

标签: android permissions native android-ndk

由于这是一个很长的阅读,我将从一个非常截断的版本开​​始:

不管是否有适当的位置/权限/文件所有权,是否不允许本机进程创建/编辑由其生成的java进程创建的文件?

完整的问题:

我的应用程序包含一组使用NDK工具链和典型的Java Android界面编译的本机二进制文件。本机程序打包在/ assets文件夹中,并由java应用程序复制到/data/data/com.domain.app/nativeApplication文件夹中。

有两个原生应用程序有问题。一个修改由java层创建的jpeg,另一个修改jpeg并返回一个int作为输出。问题是:当java层调用时,jpeg修饰符不起作用。

我已经对它进行了大量的故障排除,所以我会尝试从一些明显的潜在答案中劝阻你。

正确编译: 通过adb shell,我可以从手机的磁盘上调用这两个程序。第二个图像分析程序在通过adb调用时或在软件中设计时顺畅运行如果我从adb手动执行中间步骤。

Permissions:

Jpg权限 - 应用程序有权写入外部存储。我试图从SD卡和/data/data/com.domain.app/nativeApp/img/name.jpg读取文件;没有快乐。如上所述,当图像位于任一位置时,第二个程序按设计运行,如果我通过adb手动运行第一个程序。

文件/文件夹权限:〜/ nativeApplication / *中的所有文件夹都是由android应用程序本身创建的,它是所有者,并且它已将所有子目录和文件chmodded为777。

支持代码:

调用jpg转换器进程:

NativeSetup.changePermission("/data/data/com.domain.program/nativeApp/img/img1.jpg");

try {    
            Process jpegConvert = Runtime.getRuntime().exec("/data/data/com.domain.program/nativeApp/bin/jpegtransformer -opts /data/data/com.domain.program/nativeApp/img/img1.jpg > /data/data/com.domain.program/nativeApp/img/img2.jpg");
            jpegConvert.waitFor();          
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }

用于在〜/ nativeApp / *

中创建文件的调用
private static void copyFile(String assetPath, String localPath, Context context) {

    try {
        InputStream in = context.getAssets().open(assetPath);
        FileOutputStream out = new FileOutputStream(localPath);
        int read;
        byte[] buffer = new byte[4096];
        while ((read = in.read(buffer)) > 0) {
            out.write(buffer, 0, read);
        }

chmod call :(根据ls -l到adb工作)

static void changePermission(String localPath) {

    try {
        Process chmod = Runtime.getRuntime().exec("/system/bin/chmod 777 " +localPath);
        chmod.waitFor();
    } catch (IOException e) {
        throw new RuntimeException(e);
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
}
        out.close();
        in.close();


    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

程序无法编辑的文件权限,然后输出已更改的副本:

~/nativeApp/img $ ls -l
-rwxrwxrwx app_89   app_89      93061 2011-07-23 18:38 img1.jpg

无法编辑上述jpg的应用程序的权限:

~/nativeApp/bin $ ls -l jpegtransformer
-rwxrwxrwx app_89   app_89      95268 2011-07-23 18:01 jpegtransformer

〜/ nativeApp /中的文件夹权限     〜/ nativeApp $ ls -l     drwxrwxrwx app_89 app_89 2011-07-23 17:57 bin     drwxrwxrwx app_89 app_89 2011-07-23 18:27 img

理论:

此时我唯一可行的理论是有一些不受chmod控制的android策略,这使得jpegtransformer在被java层调用时不会编辑图像。由于图像分析仪不会改变图像,我想它会围绕这个吗?是否不允许本机进程创建文件?任何想法都会很棒。很抱歉长时间阅读。

-SS

2 个答案:

答案 0 :(得分:2)

当您从应用程序生成进程时,它会在您运行的同一个uid下运行,因此所有相同的Android和文件系统权限都适用。我认为你需要寻找其他的东西,比如使用不好的路径。

如果您想验证,只需使用“adb shell ps”查看正在运行的进程,您应该会看到您的进程与主应用程序具有相同的uid。

那说...... Android确实不支持这样的产卵过程,并且强烈建议不要这样做。请考虑通过将本机代码作为共享库加载并使用JNI来调用它来实现此目的。这也将更加高效,并且与您的本机代码的通信可能更简单,因为JNI是一种更丰富,更直接的方式来调用它。

答案 1 :(得分:1)

我认为您的问题与权限无关 - 您尝试使用>重定向输出,而这是一个shell运算符,并且不能用于java。获取进程输出流并使用Java标准文件I / O API将其写入文件。

虽然我不确定这是不是问题,但是你应该没有问题来修改app文件夹中的文件,而我所描述的问题是我遇到的问题不止一次。