5
Merhaba Uygulamamın içinden uygulamayı Uygulama yoluyla yüklemeyi denedim. Bu işlev için bu yöntemi oluşturdum.Android. başarısız oldu: İşlemi kullanırken EPIPE (Kırık boru) Proses
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);
}
}
}
Ama
outs.writeBytes(cmd + "\n");
Hata mesajı çağırdığında başarısız:
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)
yerine
Runtime.getRuntime().exec(new String[]{"su", "-c", "system/bin/sh"});
ait Denedim:
Bu yardımcı olmadı. Ayrıca, bu kod benim kök tabletim için çalışır ancak TV kutum için çalışmıyor.
Ben yöntemlerle kökünden cihazı kontrol edin:
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;
}
Bu doğru döndürür.
Gerçekten mi? Bu senin soruların cevabın mı? Daha spesifik olabilir misin? –
@ user951793 Evet, deneyin. Üreticiye bağlandım (tam olarak aygıt için bir uygulama yaptım, böylece onlarla iletişim kurabileydim) ve "su" yerine başka bir komut çıktığında (üzgünüm, bu komutu burada yazamıyorum çünkü) Bu verilerin açıklanması – Dima
üreticiden bahseder misiniz lütfen – iSandeep