清除android应用程序用户数据

Posted

技术标签:

【中文标题】清除android应用程序用户数据【英文标题】:Clear android application user data 【发布时间】:2012-06-11 15:42:38 【问题描述】:

使用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清除应用数据?

【问题讨论】:

您是否找到任何解决方案来清除外部应用程序的数据? 不要认为第三方应用程序应该有权清除另一个应用程序的用户数据。如果发生这种情况,那将是一团糟。 【参考方案1】:

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

【讨论】:

命令行工具不适合应用程序使用。可能它们仅适用于半特权 adb shell 用户,如果系统设置应用程序,则其在权限上与用户在 GUI 中按下按钮的权限相当。【参考方案2】:

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

    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 你不应该能够清除另一个应用程序的缓存数据,因为 android 旨在保护应用程序免受其他应用程序的潜在恶意操作。【参考方案3】:

如果您想手动操作,您也可以通过单击Settings–&gt;Applications–&gt;Manage Aplications–&gt; 您的应用程序中的“Clear Data” 按钮清除您的用户数据

or Is there any other way to do that?

然后 Download code here

【讨论】:

我想务实地这样做,你建议我已经尝试过的那个例子,但这不是我想要的 如果您尝试过那个,请分享您尝试过的那个。好吧,让我看看另一种方式..!!【参考方案4】:

命令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,我也无法清除任何 1 个应用程序【参考方案5】:
// 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();

【讨论】:

这将(如果使用适当的权限)删除外部存储上的共享文件,而不考虑应用关联。它不会删除任何应用程序的私有文件,这就是问题所在。【参考方案6】:

这个命令对我有用:

adb shell pm clear packageName

【讨论】:

也可以用adb清缓存吗? @EduardoCuomo 当然。我的意思是:是否也可以使用 adb 仅清除缓存? @Shayan 您可以查看以下链接以仅删除应用程序缓存:***.com/questions/18589471/… 我不确定此命令是否有效。【参考方案7】:

你好乌达亚拉克马尔,

public class MyApplication extends Application 
    private static MyApplication instance;

    @Override
    public void onCreate() 
        super.onCreate();
        instance = this;
    

    public static MyApplication getInstance()
        return instance;
    

    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 && 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();
    

请检查并告诉我...

您可以从here下载代码

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

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

在终端上运行 adb shell 进入 adb shell 通过运行pm list packages 检查可用的包 如果您想要重置的包名称可用,则运行pm clear packageName,将 packageName 替换为您想要重置的包名称,pm list packages 结果上也会显示相同的内容。

如果包名没有显示,你会尝试重置,你会得到失败状态。

【讨论】:

【参考方案10】:

在 mac 上,您可以使用此命令清除应用数据

adb shell pm clear com.example.healitia

【讨论】:

以上是关于清除android应用程序用户数据的主要内容,如果未能解决你的问题,请参考以下文章

如何以编程方式“重新启动”android应用程序[重复]

如何在 Android 中清除 Realm 中的数据库

如何保存数据直到应用程序在android中卸载?

android 清除缓存功能如何实现

如何在aws设备场中为android espresso每次测试运行后清除设备数据

Android - 清除导航回栈