Xóa dữ liệu người dùng ứng dụng android


108

Sử dụng adb shell để xóa dữ liệu ứng dụng

adb shell pm clear com.android.browser

Nhưng khi thực hiện 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 xóa dữ liệu người dùng và cũng không đưa ra bất kỳ ngoại lệ nào mặc dù tôi đã cấp quyền sau đây.

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

Câu hỏi:

Làm cách nào để xóa dữ liệu ứng dụng bằng adb shell ?


3
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

2
Đừng nghĩ rằng ứng dụng của bên thứ 3 phải có quyền xóa dữ liệu người dùng của ứng dụng khác. Sẽ là một mớ hỗn độn nếu điều đó xảy ra.
StoneLam

Câu trả lời:


5

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


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

210

Lệnh này phù hợp với tôi:

adb shell pm clear packageName

2
có thể sử dụng adb để xóa bộ nhớ cache không?
nhà phát triển android

4
@EduardoCuomo Tất nhiên. Ý tôi là: Có thể sử dụng adb chỉ để xóa bộ nhớ cache không?
nhà phát triển Android

1
@Shayan Bạn có thể kiểm tra liên kết sau để chỉ xóa bộ nhớ cache của ứng dụng: stackoverflow.com/questions/18589471/… Tôi không chắc về lệnh này có hoạt động hay không.
Manmohan Soni

5

Lệnh pm clear com.android.browseryêu cầu quyền root.
Vì vậy, hãy chạy sutrước.

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

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

3

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

tôi cố gắng này, sử dụng này có thể xóa dữ liệu ứng dụng bộ nhớ cache riêng của chúng tôi, tôi cần phải xóa một dữ liệu người dùng ứng dụng từ ứng dụng của chúng tôi
UdayaLakmal

2
@UdayaLakmal bạn không được phép xóa dữ liệu bộ nhớ cache của ứng dụng khác, bởi vì android được thiết kế để bảo vệ các ứng dụng khỏi các hành động độc hại tiềm ẩn của các ứng dụng khác.
Chris Stratton

1

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


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

1
Thao tác này (nếu được sử dụng với quyền thích hợp) sẽ 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à những gì câu hỏi đặt ra.
Chris Stratton

-6

Nếu bạn muốn làm theo cách thủ công thì 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

nhập mô tả hình ảnh ở đây


Tôi muốn làm điều đó một cách thực dụng, mà ví dụ bạn đề nghị tôi đã tryed nhưng đó không phải là những gì tôi 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 để tôi kiểm tra cách khác .. !!
Strider
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.