2013-01-14 3 views
3

Я пытаюсь запустить rsync на своем устройстве. У меня есть двоичный код в /system/xbin/rsync, и я пытаюсь запустить его с Runtime.getRuntime().exec. Я новичок в программировании на Android, поэтому пока не получаю разрешения пользователей Superuser.Android Runtime.getRuntime(). Exec и rsync

Мой код:

try { 
    Process process = Runtime.getRuntime().exec(
      "/system/xbin/rsync -avzru /sdcard/Tinybox/ " + 
      "[email protected]::88124bb378ac994088e704d553de6f19"); 
    System.out.print("RSYNC LAUNCHED\n"); 

    // Reads stdout. 
    // NOTE: You can write to stdin of the command using 
    // process.getOutputStream(). 
    BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream())); 
    int read; 
    char[] buffer = new char[4096]; 
    StringBuffer output = new StringBuffer(); 
    while ((read = reader.read(buffer)) > 0) { 
     output.append(buffer, 0, read); 
    } 
    reader.close(); 

    // Waits for the command to finish. 
    process.waitFor(); 
    System.out.print(output); 
    System.out.print("RSYNC FINISHED\n"); 

    // return output.toString(); 
} catch (IOException e) { 
    throw new RuntimeException(e); 
} catch (InterruptedException e) { 
    throw new RuntimeException(e); 
} 

И он не работает, он просто печатает "RSYNC НАЧАТЬ" "RSYNC ЗАВЕРШЕН".

Но если я бегу:

Process process = Runtime.getRuntime().exec("/system/xbin/rsync --help"); 

он отлично работает, я могу увидеть выход из окна LogCat.

Так что я думаю, я должен использовать разрешение привилегированного и поэтому я изменил мой код следующим образом:

try { 
    System.out.print("RSYNC STARTED\n"); 
    Process process = Runtime.getRuntime().exec("/system/xbin/su"); 
    DataOutputStream os = new DataOutputStream(process.getOutputStream()); 
    DataInputStream is = new DataInputStream(process.getInputStream()); 
    os.writeBytes("/system/xbin/rsync --help"); 
    String output = new String(); 
    String temp = new String(); 
    output = is.readLine(); 

    System.out.print(output); 
    os.flush(); 
    System.out.print("RSYNC FINISHED\n"); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} finally { 
} 

Но когда я запускаю код АРРЫ, замерзают без ошибок.

+0

'зависает без ошибок', вы уверены, что нет LogCat? – Budius

+0

Ничего, он печатает RSYNC НАЧАЛО и ничего больше. – phcaze

+0

Является ли ваше устройство укорененным? –

ответ

0

Хорошо, я использую несколько иную версию коды:

try { 
    System.out.print("RSYNC STARTED\n"); 
    process = Runtime.getRuntime().exec("/system/xbin/su -c sh"); 
    OutputStream os = process.getOutputStream(); 
    Log.d("RSYNC","/system/xbin/rsync" + " -avzru /sdcard/download/ [email protected]::TinyBox &"); 
    writeLine(os, "/system/xbin/rsync" + " -avzru /sdcard/download/ [email protected]::TinyBox &"); 

    os.flush(); 
    System.out.print("RSYNC FINISHED\n"); 
    } 
catch (IOException e) { 
    e.printStackTrace(); 
} 

я понял, что проблема в команде su. Если я запускаю Rsync с помощью su он блокирует без сообщения об ошибке, как я уже говорил ранее, если удалить команду su и запустить только:

try { 
    System.out.print("RSYNC STARTED\n"); 
    process = Runtime.getRuntime().exec("sh"); 
    OutputStream os = process.getOutputStream(); 
    Log.d("RSYNC","/system/xbin/rsync" + " -avzru /sdcard/download/ [email protected]::TinyBox &"); 
    writeLine(os, "/system/xbin/rsync" + " -avzru /sdcard/download/ [email protected]::TinyBox &"); 

    os.flush(); 
    System.out.print("RSYNC FINISHED\n"); 
    } 
catch (IOException e) { 
    e.printStackTrace(); 
} 

он отлично работает, но, конечно, я получил сообщение об ошибке из Rsync, потому что у меня есть никакие разрешения и синхронизация не будут работать. Как я могу решить свою проблему?

+0

Я решил это! Последний код работает нормально, проблемы с разрешениями из-за неправильной конфигурации rsync! благодаря – phcaze

Смежные вопросы