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.