Android 애플리케이션 사용자 데이터 지우기


108

adb 셸 을 사용하여 애플리케이션 데이터 지우기

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 쉘을 사용하여 애플리케이션 데이터를 지우는 방법은 무엇입니까?


3
외부 응용 프로그램에 대한 데이터를 지우는 솔루션을 찾았습니까?
— Anshuman Jaiswal 2013-08-19

2
타사 애플리케이션에 다른 앱의 사용자 데이터를 삭제할 권한이 있어야한다고 생각하지 마세요. 그럴 경우 엉망이 될 것입니다.
— StoneLam

답변:


5

Afaik 브라우저 애플리케이션 데이터는 다른 앱에 대해 지울 수 없습니다 private_mode. 따라서이 명령을 실행하면 루팅 된 장치에서만 작동 할 수 있습니다. 그렇지 않으면 다른 접근 방식을 시도해야합니다.


명령 줄 도구는 응용 프로그램에서 사용하기위한 것이 아닙니다. 아마도 그들은 반 권한이있는 adb 셸 사용자에게만 작동 할 것입니다. 시스템 설정 앱인 경우 GUI에서 버튼을 누르는 사용자와 다소 비슷한 권한으로 취급됩니다.
— Chris Stratton

210

이 명령은 저에게 효과적이었습니다.

adb shell pm clear packageName

2
캐시를 지우는 데에도 adb를 사용할 수 있습니까?
— 안드로이드 개발자

4
@EduardoCuomo 물론입니다. 내 말은 : 캐시 만 지우는 데에도 adb를 사용할 수 있습니까?
— 안드로이드 개발자

1
@Shayan 다음 링크를 확인하여 응용 프로그램 캐시 만 삭제할 수 있습니다. stackoverflow.com/questions/18589471/… 이 명령이 작동하는지 확실하지 않습니다.
— Manmohan Soni

5

이 명령 pm clear com.android.browser에는 루트 권한이 필요합니다.
따라서 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 2015 년

-6

수동으로 수행하려면 응용 프로그램 “Clear Data” 에서 버튼 을 클릭하여 사용자 데이터를 지울 수도 있습니다.Settings–>Applications–>Manage Aplications–>

or Is there any other way to do that?

그런 다음 여기에서 코드 다운로드

여기에 이미지 설명 입력


나는 실용적으로 당신은 이미 tryed 제안하는 예를하고 싶지하지만 내가 찾는 게 아니에요
— UdayaLakmal

당신이 그것을 시도했다면 당신이 그것을 시도했다는 것을 공유하십시오. 알겠습니다. 다른 방법을 확인하겠습니다 .. !!
— Strider
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.