![](/img/trans.png)
[英]Android FileProvider with photo take intent gives a java.io.IOException: write failed: EPIPE (Broken pipe)
[英]How do I fix java.io.IOException: write failed: EPIPE (Broken pipe) when I am rooted?
我在根 Nexus Android 6.0.1 上運行我的代碼,我的 apk 作為系統應用程序(即android:sharedUserId="android.uid.system"
in system/priv-app
。因為它是一個系統應用程序,並且I am rooted, I do not understand why I cannot run my su
commands. Let me iterate, I can run su
and rm -f /data/data/com.google.android.gms/shared_prefs/adid_settings.xml
through an adb shell
成功地。
這就是我想要運行的:
public void reset_GAID_3() throws Exception {
try{
Process su = Runtime.getRuntime().exec("su");
DataOutputStream outputStream = new DataOutputStream(su.getOutputStream());
outputStream.writeBytes("rm -f /data/data/com.google.android.gms/shared_prefs/adid_settings.xml\n");
outputStream.flush();
outputStream.writeBytes("exit\n");
outputStream.flush();
su.waitFor();
outputStream.close();
}catch(IOException e){
throw new Exception(e);
}catch(InterruptedException e){
throw new Exception(e);
}
}
出現錯誤: outputStream.writeBytes("rm -f /data/data/com.google.android.gms/shared_prefs/adid_settings.xml\n");
這是堆棧跟蹤:
Caused by: android.system.ErrnoException: write failed: EPIPE (Broken pipe)
at libcore.io.Posix.writeBytes(Native Method)
at libcore.io.Posix.write(Posix.java:271)
at libcore.io.BlockGuardOs.write(BlockGuardOs.java:313)
at libcore.io.IoBridge.write(IoBridge.java:493)
at java.io.FileOutputStream.write(FileOutputStream.java:186)
at java.io.OutputStream.write(OutputStream.java:82)
at java.io.DataOutputStream.writeBytes(DataOutputStream.java:156)
at com.example.adtry3.MainActivity.reset_GAID_3(MainActivity.java:363)
at com.example.adtry3.MainActivity.reset_GAID_button(MainActivity.java:336)
at java.lang.reflect.Method.invoke(Native Method)
at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:409)
at android.view.View.performClick(View.java:5204)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:992)
at android.view.View$PerformClick.run(View.java:21156)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5422)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
我的理解是我有一個錯誤,因為我沒有在超級用戶實例中執行rm
,但我認為我是。 我試圖將其更改為單個命令:
su -c 'rm -f /data/data/com.google.android.gms/shared_prefs/adid_settings.xml'
這沒有用。 有什么想法我哪里出錯了嗎? 謝謝。
不是世界上最好的答案,但我通過刪除su
實例並通過ProcessBuilder
運行它來修復它。
public void reset_GAID_3() throws Exception {
ProcessBuilder su = new ProcessBuilder("rm", "-f", "/data/data/com.google.android.gms/shared_prefs/adid_settings.xml");
try{
Process pc = su.start();
System.out.println("Ran SU cmd");
} catch (IOException e) {
e.printStackTrace();
System.out.println("Failed SU cmd");
}
}
我確信在su
命令之后執行代碼的方式存在問題,但這是一種解決方法。 由於su
似乎是導致問題的原因,我只是將其刪除。 刪除它意味着我可以使用一個簡單的ProcessBuilder
來完成我需要的工作。
為什么這仍然有效? 由於此 apk 位於system/priv-app
中,並且在 Manifest 中有android:sharedUserId="android.uid.system"
,這意味着它已經以 root 權限運行,因此使用su
將是多余的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.