Câu hỏi Xóa dữ liệu người dùng ứng dụng Android


Sử dụng vỏ adb xóa dữ liệu ứng dụng

adb shell pm clear com.android.browser

Nhưng khi thực thi lệnh đó từ ứng dụng

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

Vấn đề:

Nó không rõ ràng dữ liệu người dùng không cung cấp cho bất kỳ ngoại lệ mặc dù tôi đã cho phép sau đây.

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

Câu hỏi:

Cách xóa dữ liệu ứng dụng bằng vỏ adb?


76
2018-06-07 14:55


gốc


Bạn có tìm thấy giải pháp nào để xóa dữ liệu cho ứng dụng bên ngoài không? - Anshuman Jaiswal
Đừng nghĩ rằng ứng dụng của bên thứ ba phải có quyền xóa dữ liệu người dùng của một ứng dụng khác. Nó sẽ là một mớ hỗn độn nếu điều đó xảy ra. - StoneLam


Các câu trả lời:


Lệnh này làm việc cho tôi:

adb shell pm clear packageName

140
2017-10-16 09:00



Sự cố đang thực thi từ ứng dụng Android ... - UdayaLakmal
có thể sử dụng adb để xóa bộ nhớ cache không? - android developer
@androiddeveloper Điều này xóa bộ nhớ cache quá - Eduardo Cuomo
@EduardoCuomo Tất nhiên rồi. Ý tôi là: Có thể sử dụng adb để chỉ xóa bộ đệm ẩn không? - android developer


Lệnh pm clear com.android.browser yêu cầu quyền root.
Vì vậy, chạy su Đầu tiên.

Đây là mã mẫu:

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

Lớp 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();
        }
    }
}

5
2018-03-24 07:20





Để xóa dữ liệu ứng dụng Hãy thử cách này.

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

2
2018-06-07 15:07



tôi cố gắng này, bằng cách sử dụng này có thể xóa dữ liệu bộ nhớ cache ứng dụng của riêng tôi, tôi cần phải xóa dữ liệu người dùng ứng dụng khác khỏi ứng dụng của chúng tôi - UdayaLakmal
@UdayaLakmal bạn không được phép có thể xóa dữ liệu bộ nhớ cache của một ứng dụng khác, vì android được thiết kế để bảo vệ các ứng dụng khỏi các hành động nguy hiểm tiềm tàng của các ứng dụng khác. - Chris Stratton


Afaik dữ liệu ứng dụng trình duyệt KHÔNG chịu được cho các ứng dụng khác, vì nó được lưu trữ trong private_mode. Vì vậy, thực hiện lệnh này có thể probalby chỉ làm việc trên các thiết bị bắt nguồn từ. Nếu không, bạn nên thử cách tiếp cận khác.


1
2018-06-07 15:03



Các công cụ dòng lệnh không được intdended cho việc sử dụng bởi các ứng dụng. Có khả năng họ sẽ chỉ làm việc cho người dùng adb shell bán đặc quyền, được coi là có thể so sánh một chút về quyền hạn đối với người dùng đang đẩy các nút trong GUI nếu ứng dụng cài đặt hệ thống. - Chris Stratton


Xin chào UdayaLakmal,

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

Vui lòng kiểm tra điều này và cho tôi biết ...

Bạn có thể tải xuống mã từ đây


0
2018-05-12 09:58





adb gỡ cài đặt com.package.packagename

thực hiện lệnh này trên trình bao ADB.

adb gỡ cài đặt com.package.packagename -k 

-k sẽ giữ lại dữ liệu người dùng


-1
2018-02-08 16:12





// 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
2018-03-24 07:25



Điều này sẽ (nếu được sử dụng với sự cho phép thích hợp) xóa các tệp được chia sẻ trên Bộ nhớ ngoài mà không liên quan đến liên kết ứng dụng. Nó sẽ không xóa các tệp riêng tư của bất kỳ ứng dụng nào, đó là câu hỏi của bạn. - Chris Stratton


Nếu bạn muốn thực hiện thủ công, bạn cũng có thể xóa dữ liệu người dùng của mình bằng cách nhấp vào “Clear Data”  nút trong Settings–>Applications–>Manage Aplications–>  ỨNG DỤNG CỦA BẠN

or Is there any other way to do that?

Sau đó Tải xuống mã tại đây

enter image description here


-4
2018-06-07 16:03



Tôi muốn làm điều đó một cách thực dụng, ví dụ bạn đề nghị tôi đã thử nhưng đó không phải là những gì tôi đang tìm kiếm - UdayaLakmal
nếu bạn đã thử cái đó thì hãy chia sẻ rằng bạn đã thử cái đó. ok hãy để tôi kiểm tra một cách khác .. !! - Mehul Patel