프로그래밍 방식으로 응용 프로그램 데이터를 지우는 방법


152

Android 응용 프로그램 (Robotium 사용)에 대한 자동 테스트를 개발 중입니다. 테스트의 일관성과 신뢰성을 보장하기 위해 각 테스트를 깨끗한 상태 (테스트중인 응용 프로그램)로 시작하고 싶습니다. 그렇게하려면 앱 데이터를 지워야합니다. 설정 / 응용 프로그램 / 응용 프로그램 관리 / [내 응용 프로그램] / 데이터 지우기에서 수동으로 수행 할 수 있습니다.

프로그래밍 방식으로이 작업을 수행하는 데 권장되는 방법은 무엇입니까?


adb 도구를 사용하여 응용 프로그램 실행 사이의 데이터를 지울 수 있습니까? adb -w
smith324

불행히도이 옵션은 사용할 수 없습니다 (adb 도움말이 오래되었습니다).
user597603

너무 좋을 것입니다. 데이터베이스 문제를 디버깅 할 때 데이터 지우기 옵션을 너무 많이 탐색해야하므로 실제로 흐름이 깨집니다.
Jason Prado

Android Studio를 통해 수행하는 방법은 여기에서 설명합니다 : stackoverflow.com/q/31713579/905686 .
user905686

구체적으로 다음과 같이하십시오 : stackoverflow.com/a/57461180/94557
Matt Wolfe

답변:


171

패키지 관리자 도구를 사용하여 설치된 앱의 데이터를 지울 수 있습니다 (장치의 앱 설정에서 '데이터 지우기'버튼을 누르는 것과 유사). 따라서 adb를 사용하면 다음을 수행 할 수 있습니다.

adb shell pm clear my.wonderful.app.package

1
Android 2.1-update1에서 불행히도이 결과를 얻습니다 Error: unknown command 'clear'.
Paul Lammertsma

@ 팔 라니 : 2.1-r1 (andoid-7) 이상의 모든 버전에서 작동합니다. 오류 메시지가 있습니까?
edovino 2016 년

1
위의 명령은 안드로이드 쉘에 연결하고 안드로이드에서 "pm clear my.wonderful.app.package"를 실행합니다. 내 장치에서 "pm"명령에는 "clear"옵션이 없습니다. SDK와 관련이 없습니다. 장치 펌웨어에 따라 다릅니다.
Palani

m 내 안드로이드 앱에서 프로그래밍 방식으로 안드로이드 장치의 브라우저 (defaut) 및 크롬 브라우저 앱의 명확한 데이터를 찾고 있습니다. 도와주세요 ..
Brijesh Patel

모든 장치에서 작동하지는 않지만 작동하는 장치에는 훌륭합니다.
Cory Trese

34

@edovino의 대답에 따라 프로그래밍 방식으로 모든 응용 프로그램 환경 설정 을 지우는 방법 은 다음과 같습니다.

private void clearPreferences() {
    try {
        // clearing app data
        Runtime runtime = Runtime.getRuntime();
        runtime.exec("pm clear YOUR_APP_PACKAGE_GOES HERE");

    } catch (Exception e) {
        e.printStackTrace();
    }
}

경고 : 응용 프로그램이 강제로 종료됩니다.


5
이 후에 테스트 코드를 실행하면 실패합니다.
rajath

이를 실행하려면 매니페스트에 선언해야하고 권한이 있습니까?
reubenjohn

1
아니요, 특별한 권한이 필요하지 않습니다.
Sebastiano

Thx, u는 내 목숨을 구했다!
Sidd

1
앱을 강제로 닫지 않으려면?
NJ

22

이것으로 SharedPreferences 앱 데이터를 지울 수 있습니다.

Editor editor = 
context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();

그리고 app db를 지우려면이 대답은 정확합니다-> Clearing Application database


14

API 버전 19부터 ActivityManager.clearApplicationUserData ()를 호출 할 수 있습니다.

((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).clearApplicationUserData();

13
참고로 이것을 호출하면 앱이 종료됩니다.
Zach Rattner

8

이 코드를 확인하여 다음을 수행하십시오.

@Override
protected void onDestroy() {
// closing Entire Application
    android.os.Process.killProcess(android.os.Process.myPid());
    Editor editor = getSharedPreferences("clear_cache", Context.MODE_PRIVATE).edit();
    editor.clear();
    editor.commit();
    trimCache(this);
    super.onDestroy();
}


public static void trimCache(Context context) {
    try {
        File dir = context.getCacheDir();
        if (dir != null && dir.isDirectory()) {
            deleteDir(dir);

        }
    } catch (Exception e) {
        // TODO: handle exception
    }
}


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

    // <uses-permission
    // android:name="android.permission.CLEAR_APP_CACHE"></uses-permission>
    // The directory is now empty so delete it

    return dir.delete();
}

6

몇 가지 공유 환경 설정을 지울 경우이 솔루션이 훨씬 좋습니다.

@Override
protected void setUp() throws Exception {
    super.setUp();
    Instrumentation instrumentation = getInstrumentation();
    SharedPreferences preferences = instrumentation.getTargetContext().getSharedPreferences(...), Context.MODE_PRIVATE);
    preferences.edit().clear().commit();
    solo = new Solo(instrumentation, getActivity());
}

"계기 모드" 가 활성화되어 있지 않아도됩니까 ? 어쨌든 그 모드는 무엇입니까?
ADTC

그러나 이것은 "계측 화 된"응용 프로그램이 필요합니다. 즉, 테스트는 실제 장치 에서 응용 프로그램 코드와 함께 응용 프로그램 코드와 함께 실행되므로 테스트를 위해 모든 응용 프로그램의 상태에 액세스하고 런타임에 변경할 수 있습니다.
토마스 켈러

(...)에 무엇이 있어야합니까?
NickUnuchek 2016 년

@NickUnuchek 환경 설정 파일의 이름입니다.
토마스 켈러

3

컨텍스트를 사용하여 환경 설정, 데이터베이스 파일과 같은 앱 특정 파일을 지울 수 있습니다. Espresso를 사용한 UI 테스트에 아래 코드를 사용했습니다.

    @Rule
    public ActivityTestRule<HomeActivity> mActivityRule = new ActivityTestRule<>(
            HomeActivity.class);

    public static void clearAppInfo() {
        Activity mActivity = testRule.getActivity();
        SharedPreferences prefs =
                PreferenceManager.getDefaultSharedPreferences(mActivity);
        prefs.edit().clear().commit();
        mActivity.deleteDatabase("app_db_name.db");
    }

3

가장 간단한 방법은

private void deleteAppData() {
         try {
        // clearing app data
        String packageName = getApplicationContext().getPackageName();
        Runtime runtime = Runtime.getRuntime();
        runtime.exec("pm clear "+packageName);

    } catch (Exception e) {
        e.printStackTrace();
    } 
}

데이터가 삭제되고 메모리에서 앱이 제거됩니다. 설정-> 응용 프로그램 관리자-> 앱-> 데이터 지우기의 데이터 지우기 옵션과 같습니다.

이렇게하면 데이터가 완전히 제거되고 앱이 강제 종료됩니다.


여러 질문에 동일한 답변 을 추가하지 마십시오 . 가장 좋은 것에 대답하고 나머지는 중복으로 표시하십시오. 여러 질문에 중복 답변을 추가해도 괜찮습니까?를
FelixSFD

1
앱을
닫지

2

이 솔루션은 정말 도움이되었습니다.

아래 두 가지 방법을 사용하면 프로그래밍 방식으로 데이터를 지울 수 있습니다

    public void clearApplicationData() {
    File cacheDirectory = getCacheDir();
    File applicationDirectory = new File(cacheDirectory.getParent());
    if (applicationDirectory.exists()) {
    String[] fileNames = applicationDirectory.list();
        for (String fileName : fileNames) {
            if (!fileName.equals("lib")) {
                deleteFile(new File(applicationDirectory, fileName));
            }
        }
    }
}
    public static boolean deleteFile(File file) {
    boolean deletedAll = true;
    if (file != null) {
        if (file.isDirectory()) {
            String[] children = file.list();
            for (int i = 0; i < children.length; i++) {
                deletedAll = deleteFile(new File(file, children[i])) && deletedAll;
            }
        } else {
            deletedAll = file.delete();
        }
    }

    return deletedAll;
}

2

안드로이드 버전이 kitkat 이상이면 이것을 사용할 수도 있습니다

공개 무효 onClick (보기) {

    Context context = getApplicationContext(); // add this line
    if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
        ((ActivityManager) context.getSystemService(ACTIVITY_SERVICE))
            .clearApplicationUserData();
        return;
    }

0

프로그래밍 방식으로이 작업을 수행하는 데 권장되는 방법은 무엇입니까?

유일하게 가능한 옵션은 adb shell pm clear package테스트 전에 ADB 명령을 실행 하는 것입니다. 가장 큰 문제는 테스트 실행과 셸 명령을 결합하는 두통입니다.

그러나 (Mediafe에서) 루트가 아닌 일반 장치에서 작동 할 수있는 솔루션이 제공되었습니다. 주석을 추가하기 만하면됩니다. 나머지는 모두 간단한 bash 스크립트 를 실행하여 수행됩니다 .

@ClearData테스트를하기 전에 주석을 추가 하고 테스트를 수행하기 전에 ADB clear 명령이 실행됩니다.

다음은 그러한 테스트의 예입니다.

@Test
@ClearData
public void someTest() {
    // your test
}

아이디어는 다음과 같습니다

  1. 를 사용하여 모든 테스트를 읽으십시오 adb shell am instrument -e log true
  2. (1)의 출력을 구문 분석하여 실행 계획을 작성하십시오.
  3. 실행 계획을 한 줄씩 실행

동일한 아이디어를 사용하면 다음과 같이 쉽게 지원할 수 있는 모든 옵션 이 있습니다.

  • 데이터 지우기
  • 알림 표시 줄 지우기
  • 파라미터 화
  • 태그별로 필터링 및 실행

주석 만 사용하십시오. 이처럼 :

@Test
@ClearData
@Tags(tags = {"sanity", "medium"})
@Parameterized.Repeat(count = 3)
public void myTest() throws Exception {
    String param = params[index];
    // ...
}

보너스! 🎁 실패한 테스트마다 :

  • Logcat + stacktrace 수집
  • 비디오 녹화 (mp4)
  • DB 덤프 (sqlite)
  • 기본 공유 환경 설정 덤프 (xml)
  • 배터리, netstats 및 기타와 같은 dumpsys 파일을 수집하십시오.

일반적으로 테스트는 gradle 작업이 아닌 bash 스크립트에서 하나씩 실행되므로 더 많은 옵션을 쉽게 추가 할 수 있습니다.

📗 전체 블로그 게시물 : https://medium.com/medisafe-tech-blog/running-android-ui-tests-53e85e5c8da8

examples 예제가 포함 된 소스 코드 : https://github.com/medisafe/run-android-tests

이 6 년 질문에 대답하기를 바랍니다.)

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.