ล้างข้อมูลผู้ใช้แอปพลิเคชัน Android


109

การใช้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 ได้อย่างไร


3
คุณพบวิธีการล้างข้อมูลสำหรับแอปพลิเคชันภายนอกหรือไม่?
Anshuman Jaiswal

2
อย่าคิดว่าแอปพลิเคชันของบุคคลที่สามควรได้รับอนุญาตให้ล้างข้อมูลผู้ใช้ของแอปอื่น มันจะวุ่นวายถ้าเกิดขึ้น
StoneLam

คำตอบ:


5

Afaik ข้อมูลแอปพลิเคชันเบราว์เซอร์ไม่สามารถล้างข้อมูลแอปพลิเคชันอื่นได้เนื่องจากเก็บไว้ในรูปแบบprivate_mode. ดังนั้นการดำเนินการคำสั่งนี้จึงสามารถใช้งานได้กับอุปกรณ์ที่รูทเท่านั้น มิฉะนั้นคุณควรลองใช้วิธีอื่น


เครื่องมือบรรทัดคำสั่งไม่ได้มีไว้สำหรับการใช้งานโดยแอปพลิเคชัน เป็นไปได้ว่าพวกเขาจะใช้ได้เฉพาะกับผู้ใช้ adb shell ที่มีสิทธิพิเศษเท่านั้นซึ่งถือว่าค่อนข้างเทียบได้กับผู้ใช้ที่กดปุ่มใน GUI หากแอปการตั้งค่าระบบ
Chris Stratton

210

คำสั่งนี้ใช้ได้ผลสำหรับฉัน:

adb shell pm clear packageName

2
เป็นไปได้ไหมที่จะใช้ adb เพื่อล้างแคชด้วย?
นักพัฒนา android

4
@EduardoCuomo แน่นอน. ฉันหมายถึง: เป็นไปได้ไหมที่จะใช้ adb เพื่อล้างเฉพาะแคชด้วย
นักพัฒนา Android

1
@Shayan คุณสามารถชำระเงินที่ลิงค์ต่อไปนี้เพื่อลบแคชของแอปพลิเคชันเท่านั้น: stackoverflow.com/questions/18589471/… ฉันไม่แน่ใจว่าคำสั่งนี้จะใช้ได้หรือไม่
Manmohan Soni

5

คำสั่ง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();
        }
    }
}

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

2
@UdayaLakmal คุณไม่ควรจะสามารถล้างข้อมูลแคชของแอปพลิเคชันอื่นได้เนื่องจาก Android ได้รับการออกแบบมาเพื่อปกป้องแอปพลิเคชันจากการกระทำที่อาจเป็นอันตรายของแอปพลิเคชันอื่น
Chris Stratton

1

สวัสดี 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();
    }
}

โปรดตรวจสอบและแจ้งให้เราทราบ ...

คุณสามารถดาวน์โหลดโค้ดได้จากที่นี่


-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
สิ่งนี้จะ (หากใช้โดยได้รับอนุญาตที่เหมาะสม) จะลบไฟล์ที่แชร์บนที่เก็บข้อมูลภายนอกโดยไม่เกี่ยวข้องกับการเชื่อมโยงแอพ มันจะไม่ลบไฟล์ส่วนตัวของแอพใด ๆ ซึ่งเป็นคำถามเกี่ยวกับ
Chris Stratton

-6

หากคุณต้องการดำเนินการด้วยตนเองคุณยังสามารถล้างข้อมูลผู้ใช้ของคุณได้โดยคลิก“Clear Data” ปุ่มในSettings–>Applications–>Manage Aplications–> แอปพลิเคชันของคุณ

or Is there any other way to do that?

จากนั้น ดาวน์โหลดรหัสที่นี่

ใส่คำอธิบายภาพที่นี่


ฉันอยากทำแบบนั้นในทางปฏิบัติตัวอย่างนั้นคุณแนะนำว่าฉันลองแล้ว แต่นั่นไม่ใช่สิ่งที่ฉันกำลังมองหา
UdayaLakmal

ถ้าคุณลองแล้วโปรดแชร์ว่าคุณได้ลองใช้แล้ว โอเคให้ตรวจสอบวิธีอื่น .. !!
Strider
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.