プログラムでアプリケーションデータを消去する方法


152

私は(Robotiumを使用して)Androidアプリケーションの自動テストを開発しています。テストの一貫性と信頼性を確保するために、各テストを(テスト対象のアプリケーションの)クリーンな状態で開始したいと思います。そのためには、アプリのデータを消去する必要があります。これは、設定/アプリケーション/アプリケーションの管理/ [マイアプリ] /データのクリアで手動で行うことができます

これをプログラムで実行するための推奨される方法は何ですか?


アプリケーションの起動と起動の間にデータをクリアするためにadbツールを使用することは可能ですか?adb -w
smith324

残念ながら、このオプションは利用できません(adbヘルプは古くなっています)。
user597603 2011

これは素晴らしいと思います。データベースの問題をデバッグするときは、[データを消去]オプションに移動する必要があり、フローが本当に壊れます。
Jason Prado

Android Studioを介してそれを行う方法は、ここで説明されています:stackoverflow.com/q/31713579/905686
user905686 2018年

具体的には、次のようにします。stackoverflow.com
Matt Wolfe

回答:


171

パッケージマネージャーツールを使用して、インストールされているアプリのデータを消去できます(デバイスのアプリ設定で[データの消去]ボタンを押すのと同じです)。したがって、adbを使用すると、次のことができます。

adb shell pm clear my.wonderful.app.package

1
Android 2.1-update1では、残念ながらが生成されError: unknown command 'clear'ます。
Paul Lammertsma

@Palani:2.1-r1(andoid-7)以上のすべてのバージョンで動作します。エラーメッセージはありますか?
edovino

1
上記のコマンドは、Androidシェルに接続し、Androidで「pm clear my.wonderful.app.package」を実行します。私のデバイスでは、「pm」コマンドに「クリア」オプションがありません。SDKとは何の関係もありません。デバイスのファームウェアによって異なります。
パラニ

mは明確なブラウザ(defaut)のデータとprogrammaticalyそれは私のアンドロイドapp.PleaseヘルプからのAndroidデバイスでのクロムのブラウザのアプリを探して...
ブライエッシュ・パテル

すべてのデバイスで動作するわけではありませんが、動作するデバイスにとってはすばらしい
Cory Trese 2014年

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 2014

これを実行するには、マニフェストで宣言する権限と権限が必要ですか?
ルーベンジョン、2015

1
いいえ、特別な許可は必要ありません。
Sebastiano

THX、あなたは私の命を救った!
2015年

1
アプリを強制終了したくない場合はどうすればよいですか?
NJ


14

APIバージョン19以降では、ActivityManager.clearApplicationUserData()を呼び出すことができます。

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

13
参考までに、これを呼び出すとアプリが終了します。
Zach Rattner、2015

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、2014

はい、これには「インスツルメントされた」アプリケーションが必要です。つまり、テストは実際のデバイスで処理中のアプリケーションコードと一緒に実行されます。つまり、アプリケーションのすべての状態にアクセスし、テスト時に実行時に変更できます。
トーマスケラー

何が(...)にあるべきですか?
NickUnuchek 2015年

@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 2017

1
アプリを
閉じ

2

このソリューションは本当に私を助けました:

以下の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

Androidバージョンがキットカットより上にある場合は、これも使用できます

public void onClick(View view){

    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テストとtada🎉の前に注釈を追加するだけで、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];
    // ...
}

ボーナス!failed失敗した各テストについて:

  • Logcat +スタックトレースを収集する
  • ビデオの録画(mp4)
  • ダンプDB(SQLite)
  • デフォルトの共有設定をダンプ(xml)
  • バッテリー、netstatsなどのdumpsysファイルを収集します。

一般に、gradleタスクからではなくbashスクリプトからテストが1つずつ実行されるため、オプションを追加するのは簡単です。

📗 完全なブログ投稿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.