如何以编程方式清除应用程序数据

时间:2011-01-31 22:42:29

标签: android

我正在为Android应用程序开发自动化测试(使用Robotium)。为了确保测试的一致性和可靠性,我想以干净状态(被测试的应用程序)开始每个测试。为此,我需要清除应用数据。这可以在设置/应用程序/管理应用程序/ [我的应用程序] /清除数据

中手动完成

以编程方式完成此操作的推荐方法是什么?

12 个答案:

答案 0 :(得分:169)

您可以使用包管理器工具清除已安装应用的数据(类似于在设备的应用设置中按“清除数据”按钮)。 所以使用adb你可以做到:

adb shell pm clear my.wonderful.app.package

答案 1 :(得分:33)

根据@ 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();
    }
}

警告:应用程序将强行关闭。

答案 2 :(得分:20)

您可以使用此

清除SharedPreferences应用数据
Editor editor = 
context.getSharedPreferences(PREF_FILE_NAME, Context.MODE_PRIVATE).edit();
editor.clear();
editor.commit();

并且为了清除app db,这个答案是正确的 - > Clearing Application database

答案 3 :(得分:12)

从API版本19开始,可以调用ActivityManager.clearApplicationUserData()。

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

答案 4 :(得分: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();
}

答案 5 :(得分:6)

如果您只有几个要清除的共享偏好设置,请this solution is much nicer

@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());
}

答案 6 :(得分:3)

使用Context,我们可以清除特定于应用程序的文件,例如首选项,数据库文件。 我使用以下代码使用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");
    }

答案 7 :(得分: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();
    } 
}

这将清除数据并从内存中删除您的应用。它相当于设置 - &gt;下的清除数据选项。应用程序管理器 - &gt;你的应用 - &gt;清晰的数据。

这将完全删除数据并强制关闭应用

答案 8 :(得分: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;
}

答案 9 :(得分:1)

如果Android版本高于kitkat你也可以使用它

if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
        ((ActivityManager) context.getSystemService(ACTIVITY_SERVICE))
                .clearApplicationUserData();
        return;
    }

答案 10 :(得分:0)

  

以编程方式完成此操作的推荐方法是什么?

唯一可行的选择是在测试之前运行ADB命令adb shell pm clear package。最大的问题是将测试执行和shell命令结合起来很麻烦。

但是,我们(在Mediafe)提供了一些可以在常规无根设备上使用的解决方案。您需要做的就是添加注释。其余的都是通过运行简单的bash script来完成的。

在任何测试和tada之前添加@ClearData注释,将在测试执行之前执行ADB clear命令。

这是这种测试的一个例子:

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

这个想法如下

  1. 使用adb shell am instrument -e log true
  2. 阅读所有测试
  3. 通过解析(1)
  4. 的输出来构建执行计划
  5. 逐行运行执行计划
  6. 使用相同的想法所有选项,您可以轻松支持:

    • 清除数据
    • 清除通知栏
    • 参数化
    • 按标签过滤和运行

    仅使用注释。像这样:

    @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)
    • 收集dumpsys文件,例如:battery,netstats等。

    通常,添加更多选项很容易,因为测试是从bash脚本逐个执行而不是从gradle任务执行。

    完整的博文https://medium.com/medisafe-tech-blog/running-android-ui-tests-53e85e5c8da8

    包含示例的源代码https://github.com/medisafe/run-android-tests

    希望这回答6年的问题;)

答案 11 :(得分:-1)

通过塞巴斯蒂亚诺(Sebastiano)添加的这种方法还可以,但是当您从IntelliJ IDE运行测试以添加以下内容时,这是必需的:

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

}

而不只是“ pm package ...”

更重要的是:将其添加到driver.setCapability(App_package,package_name)之前。