Собственный подпроцесс не может создать файл в папке приложения или на SD-карте - PullRequest
0 голосов
/ 24 июля 2011

Поскольку это оказалось длинным чтением, я начну с очень урезанной версии:

Разрешено ли собственным процессам создавать / редактировать файлы, созданные их порождающим процессом Java, независимо от наличия соответствующего местоположения/ разрешение / владение файлом?

Полный вопрос:

Мое приложение состоит из набора собственных двоичных файлов, скомпилированных с помощью цепочки инструментов NDK, и типичного Java-интерфейса Android.Собственные программы упакованы в папку / assets и скопированы java-приложением в папку /data/data/com.domain.app/nativeApplication.

Существует два рассматриваемых нативных приложения.Один, который изменяет jpeg, созданный слоем java, и второй, который анализирует этот jpeg и возвращает int в качестве вывода.Проблема заключается в следующем: при вызове слоем java модификатор jpeg не работает.

Я уже выполнил немало проблем, поэтому постараюсь отговорить вас от некоторыхочевидные потенциальные ответы, начиная с самых очевидных.

Правильная компиляция: через оболочку adb я могу вызывать обе эти программы, как есть, с диска телефона.Вторая программа-анализатор изображений работает без перебоев при вызове через adb или в соответствии с инструкциями в программном обеспечении, ЕСЛИ я делаю промежуточный шаг вручную из adb.

Разрешения:

Разрешение Jpg - Приложение имеетразрешение на запись во внешнее хранилище.Я попытался прочитать файл с SD-карты и /data/data/com.domain.app/nativeApp/img/name.jpg;нет радостиКак уже говорилось, вторая программа работает так, как задумано, когда изображение находится в любом месте, , если Я вручную запускаю первую программу через adb.

Разрешения для файлов / папок: все папки в ~ /nativeApplication / * было создано самим приложением для Android, оно является владельцем и изменило все подкаталоги и файлы на 777.

Код поддержки:

Вызов конвертера jpgprocess:

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: (работает в соответствии с 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

Теории:

На данный момент моя единственная жизнеспособная теориячто существует некоторая политика Android, не регулируемая chmod, которая не позволяет jpegtransformer редактировать изображение при вызове слоем java.Поскольку анализатор изображений не меняет изображение, я полагаю, что оно обходит это?Разве собственные процессы не могут создавать файлы?Любые идеи будут великолепны.Извините за долгое чтение.

-SS

Ответы [ 2 ]

2 голосов
/ 24 июля 2011

Когда вы запускаете процесс из своего приложения, он запускается под тем же uid, что и вы, поэтому применяются все те же разрешения Android и файловой системы.Я думаю, вам нужно искать что-то еще, например, использовать неверные пути.

Если вы хотите проверить, просто используйте «adb shell ps», чтобы увидеть запущенные процессы, и вы должны увидеть, что ваш процесстот же uid, что и у вашего основного приложения.

Тем не менее ... Android действительно не поддерживает такие процессы порождения, и это настоятельно не рекомендуется.Пожалуйста, подумайте об этом, просто загрузив нативный код в качестве разделяемой библиотеки и используя JNI для его вызова.Это также будет намного эффективнее, и связь с вашим нативным кодом будет потенциально проще, поскольку JNI - гораздо более богатый и прямой способ вызова.

1 голос
/ 24 июля 2011

Я думаю, что ваша проблема не связана с разрешениями - вы пытаетесь перенаправить вывод, используя >, в то время как это оператор оболочки и не работает с Java.захватите поток вывода процесса и запишите его в файл, используя стандартный API ввода-вывода файлов Java.

Хотя я не уверен, что это проблема, у вас не должно быть проблем с изменением файлов в папке приложения.и проблема, которую я описал, - это проблема, с которой я встречался более одного раза.

...