清除 android 应用程序用户数据

使用 Adb shell我们可以清除应用程序数据。

adb shell pm clear com.android.browser

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

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

问题:

它没有清除用户数据,也没有给出任何例外,尽管我已经给出了以下权限。

<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>

问题:

如何使用 Adb shell清除其他应用程序数据?

159523 次浏览

Afaik 浏览器应用程序数据不清楚的其他应用程序,因为它是存储在 private_mode。所以执行这个命令可能只能在有根设备上工作。否则你应该尝试另一种方法。

要清除应用程序数据,请按此方式尝试。

    public void clearApplicationData() {
File cache = getCacheDir();
File appDir = new File(cache.getParent());
if (appDir.exists()) {
String[] children = appDir.list();
for (String s : children) {
if (!s.equals("lib")) {
deleteDir(new File(appDir, s));Log.i("TAG", "**************** File /data/data/APP_PACKAGE/" + s + " DELETED *******************");
}
}
}
}


public static boolean deleteDir(File dir) {
if (dir != null &amp;&amp; dir.isDirectory()) {
String[] children = dir.list();
for (int i = 0; i < children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}


return dir.delete();
}

命令 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();

课程 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();
}
}
}
// To delete all the folders and files within folders recursively
File sdDir = new File(sdPath);


if(sdDir.exists())
deleteRecursive(sdDir);








// Delete any folder on a device if exists
void deleteRecursive(File fileOrDirectory) {
if (fileOrDirectory.isDirectory())
for (File child : fileOrDirectory.listFiles())
deleteRecursive(child);


fileOrDirectory.delete();
}

这个命令对我很有效:

adb shell pm clear packageName

为所有已安装的应用程序清除缓存:

  • 使用 adb shell进入设备外壳。
  • 运行以下命令: cmd package list packages|cut -d":" -f2|while read package ;do pm clear $package;done

要在 Android 上重置/清除应用程序数据,您需要检查安装在您的 Android 设备上的可用软件包-

  • 通过在终端上运行 adb shell转到 adb shell
  • 通过运行 pm list packages检查可用的包
  • 如果需要重置的包名称可用,则运行 pm clear packageName,将 packageName 替换为需要重置的包名称,在 pm list packages结果上显示的命令也是如此。

如果没有显示软件包名称,并且您将尝试重置,您将获得“失败”状态。

在 Mac 上,您可以使用以下命令清除应用程序数据

adb shell pm clear com.example.healitia

enter image description here