清除Android应用程序用户数据

Uda*_*mal 99 android adb user-data

使用adb shell清除应用程序数据

adb shell pm clear com.android.browser
Run Code Online (Sandbox Code Playgroud)

但是从应用程序执行该命令时

String deleteCmd = "pm clear com.android.browser";      
        Runtime runtime = Runtime.getRuntime();
        try {
            runtime.exec(deleteCmd);
        } catch (IOException e) {
            e.printStackTrace();                
        }
Run Code Online (Sandbox Code Playgroud)

问题:

虽然我已经给出了以下许可,但它不会清除用户数据也不会给出任何异常.

<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>
Run Code Online (Sandbox Code Playgroud)

题:

如何使用adb shell清除应用程序数据?

Man*_*oni 190

这个命令对我有用:

adb shell pm clear packageName
Run Code Online (Sandbox Code Playgroud)

  • @EduardoCuomo当然.我的意思是:是否可以使用adb仅清除缓存? (3认同)
  • 是否可以使用adb清除缓存? (2认同)

Thk*_*kru 7

Afaik 浏览器应用程序数据对于其他应用程序是不可清除的,因为它存储在private_mode. 因此,执行此命令可能仅适用于有 root 权限的设备。否则你应该尝试另一种方法。


fan*_*uch 5

该命令pm clear com.android.browser需要root权限.
所以,先跑su.

以下是示例代码:

private static final String CHARSET_NAME = "UTF-8";
String cmd = "pm clear com.android.browser";

ProcessBuilder pb = new ProcessBuilder().redirectErrorStream(true).command("su");
Process p = pb.start();

// We must handle the result stream in another Thread first
StreamReader stdoutReader = new StreamReader(p.getInputStream(), CHARSET_NAME);
stdoutReader.start();

out = p.getOutputStream();
out.write((cmd + "\n").getBytes(CHARSET_NAME));
out.write(("exit" + "\n").getBytes(CHARSET_NAME));
out.flush();

p.waitFor();
String result = stdoutReader.getResult();
Run Code Online (Sandbox Code Playgroud)

班级StreamReader:

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.concurrent.CountDownLatch;

class StreamReader extends Thread {
    private InputStream is;
    private StringBuffer mBuffer;
    private String mCharset;
    private CountDownLatch mCountDownLatch;

    StreamReader(InputStream is, String charset) {
        this.is = is;
        mCharset = charset;
        mBuffer = new StringBuffer("");
        mCountDownLatch = new CountDownLatch(1);
    }

    String getResult() {
        try {
            mCountDownLatch.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return mBuffer.toString();
    }

    @Override
    public void run() {
        InputStreamReader isr = null;
        try {
            isr = new InputStreamReader(is, mCharset);
            int c = -1;
            while ((c = isr.read()) != -1) {
                mBuffer.append((char) c);
            }

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                if (isr != null)
                    isr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            mCountDownLatch.countDown();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)