清除安卓应用程序用户数据

149

使用 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清除另一个应用程序的数据?


4
你有没有找到清除外部应用程序数据的解决方案? - Anshuman Jaiswal
3
不要认为第三方应用程序有权清除另一个应用程序的用户数据。如果发生这种情况,将会非常混乱。 - StoneLam
8个回答

294

这个命令对我起作用了:

adb shell pm clear packageName

2
能否使用adb清除缓存? - android developer
4
当然可以。我的意思是:是否有可能只使用adb来清除缓存? - android developer
1
@Shayan,您可以查看以下链接,仅清除应用程序缓存:https://dev59.com/rGMl5IYBdhLWcg3wOEvG 我不确定这个命令是否有效。 - Manmohan Soni
1
有类似的东西,只是用于缓存吗? - android developer

8
据我所知,浏览器应用程序数据是无法被其他应用程序清除的,因为它存储在“private_mode”中。因此,执行此命令可能只适用于已经root过的设备。否则,您应该尝试另一种方法。

1
命令行工具不适用于应用程序使用。它们可能只适用于半特权adb shell用户,该用户在权限上类似于系统设置应用程序中按按钮的用户。 - Chris Stratton

6

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

Android 8.1 MiUi 10 Root 我无法使用带有SU参数的ADB SHELL清除任何一个应用程序。 - anarbus

4
在Mac上,您可以使用以下命令清除应用程序数据:
adb shell pm clear com.example.healitia

enter image description here


3
清除所有已安装应用程序的缓存:
  • 使用adb shell进入设备shell..
  • 运行以下命令:cmd package list packages|cut -d":" -f2|while read package ;do pm clear $package;done

...但这也会清除应用程序的数据和缓存,不是吗? - Coldblackice

3
清除应用数据,请尝试以下方法。
    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();
}

我尝试使用这个,它可以清除我们自己应用程序的缓存数据,但我需要从我们的应用程序中清除另一个应用程序用户的数据。 - UdayaLakmal
3
@UdayaLakmal,你不应该能够清除其他应用程序的缓存数据,因为 Android 设计的是保护应用程序免受其他应用程序可能带来的恶意行为的影响。 - Chris Stratton

1
要在Android上重置/清除应用程序数据,您需要检查安装在Android设备上的可用软件包-
  • 通过在终端上运行adb shell进入adb shell
  • 通过运行pm list packages检查可用软件包
  • 如果要重置的软件包名称可用,则通过将packageName替换为要重置的软件包名称并在pm list packages结果中显示相同的名称来运行pm clear packageName

如果软件包名称未显示,并且您尝试进行重置,则会收到失败状态。


-2
// 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();
}

2
如果获得适当的权限,这将删除外部存储上的共享文件,而不考虑应用程序关联。它不会删除任何应用程序的私有文件,这也是问题所在。 - Chris Stratton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接