簡體   English   中英

如何修復 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM