Андроид. Ошибка записи: EPIPE (сломанный канал) при использовании процесса

Здравствуйте, я попытался установить приложение внутри своего приложения через Process. Для этой функции я создал этот метод.

private void loadAndInstallApk(String string) {
    if(!isRooted()){
        return;
    }
    Uri uri = loadApk(string);
    if(uri == null){
        return;
    }
    Process p = null;
    DataOutputStream outs = null;
    try
    {

        p = Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"});
        outs=new DataOutputStream(p.getOutputStream());

        String cmd="pm install -r " + uri.getPath();
        Log.d(TAG, "DATA = cmd = " + cmd);
        outs.writeBytes(cmd + "\n");

        // Close the terminal
        outs.writeBytes("exit\n");
        outs.flush();
            p.waitFor();
            if (p.exitValue() != 255) {
                Log.d(TAG, "DATA succerss " + p.exitValue());
                // Sucess 
            }
            else {
                Log.d(TAG, "DATA Fail " + p.exitValue());
                // Fail
            }
        }
    catch (IOException e){
        Log.e("Error", e.toString(), e);
    } catch (InterruptedException e) {
        Log.e("Error", e.toString(), e);
    } finally {
        if(outs != null) {
            try {
                outs.close();
            } catch (IOException e) {
                Log.d(TAG, e.toString(), e);
            }
        }
        try {
            File f = new File(uri.getPath());
            f.delete();
        }catch (NullPointerException e) {

            Log.e(TAG, "DATA = finally delete " + e.toString(), e);
        }
    }
}

Но он терпит неудачу, когда он звонит

        outs.writeBytes(cmd + "\n");

Сообщение об ошибке:

E/Error﹕ java.io.IOException: write failed: EPIPE (Broken pipe)
java.io.IOException: write failed: EPIPE (Broken pipe)
        at libcore.io.IoBridge.write(IoBridge.java:455)
        at java.io.FileOutputStream.write(FileOutputStream.java:187)
        at java.io.OutputStream.write(OutputStream.java:82)
        at java.io.DataOutputStream.writeBytes(DataOutputStream.java:156)
...
Caused by: libcore.io.ErrnoException: write failed: EPIPE (Broken pipe)
        at libcore.io.Posix.writeBytes(Native Method)
        at libcore.io.Posix.write(Posix.java:202)
        at libcore.io.BlockGuardOs.write(BlockGuardOs.java:197)
        at libcore.io.IoBridge.write(IoBridge.java:450)
        at java.io.FileOutputStream.write(FileOutputStream.java:187)
        at java.io.OutputStream.write(OutputStream.java:82)
        at java.io.DataOutputStream.writeBytes(DataOutputStream.java:156)

Вместо

Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"});

Я пытался:

Runtime.getRuntime().exec("su");

Это не помогло.

Также этот код работает для моего корневого планшета, но не работает для моего ТВ-бокса.

Я проверяю устройство на root с помощью методов:

private static boolean isRooted() {
    return findBinary("su");
}

public static boolean findBinary(String binaryName) {
    boolean found = false;
    if (!found) {
        String[] places = {"/sbin/", "/system/bin/", "/system/xbin/", "/data/local/xbin/",
                "/data/local/bin/", "/system/sd/xbin/", "/system/bin/failsafe/", "/data/local/"};
        for (String where : places) {
            Log.d(TAG, "DATA where = " + where);
            if ( new File( where + binaryName ).exists() ) {
                found = true;
                break;
            }
        }
    }
    return found;
}

Он возвращает истину.


person Dima    schedule 10.09.2015    source источник


Ответы (1)


Я нашел решение. Проблема заключалась в том, что на моем устройстве вместо команды «su» используется другая команда.

person Dima    schedule 17.09.2015
comment
Действительно? Это ваш ответ на ваши вопросы? Можете быть более конкретными? - person Gabor Peto; 27.03.2016
comment
@ user951793 Да, это попытка. Я связался с производителем(т.к. делал приложение именно для устройства, чтобы можно было с ними связаться) и как оказалось вместо su была другая команда(извините, я не могу написать эту команду здесь, т.к. не могу разглашать эти данные) - person Dima; 28.03.2016