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

我正在开发一个android应用程序的自动化testing(使用Robotium)。 为了确保testing的一致性和可靠性,我想开始每个testing(清洁状态)。 为了这样做,我需要清除应用程序数据。 这可以在设置/应用程序/pipe理应用程序/ [我的应用程序] /清除数据中手动完成

推荐的方式是以编程方式完成这项工作?

您可以使用软件包pipe理器工具清除已安装应用程序的数据(类似于在设备上的应用程序设置中按“清除数据”button)。 所以使用adb你可以这样做:

adb shell pm clear my.wonderful.app.package 

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

警告 :应用程序将强制closures。

你可以用这个清理SharedPreferences的应用程序数据

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

并清除应用程序数据库,这个答案是正确的 – > 清除应用程序数据库

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

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

请检查以下代码:

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

如果你只有一些共享偏好来清除,那么这个解决scheme就好多了 。

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

使用上下文 ,我们可以清除喜好,数据库文件等应用程序特定的文件 我使用下面的代码来使用Espresso进行UItesting。

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

如果android版本是kitkat以上,你也可以使用这个

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

最简单的方法是

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

这将清除数据并从内存中删除您的应用程序。 这相当于在设置 – >应用程序pipe理器 – >您的应用程序 – >清除数据下清除数据选项。

这将完全删除数据以及强制closures应用程序

推荐的方式是以编程方式完成这项工作?

唯一可能的select是在testing之前运行ADB命令adb shell pm clear package 。 最大的问题是,结合testing执行和shell命令是头痛的问题。

但是,我们(在Mediafe)提供了一些解决scheme,可以为您在常规的无根设备上工作。 所有你需要做的是添加一个注释。 其余的都是通过运行简单的bash脚本完成的 。

只要在任何testing和testing之前添加@ClearData注解,ADB清除命令将在testing执行之前执行。

这是这种testing的一个例子:

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

这个想法如下

  1. 通过使用adb shell am instrument -e log true读取所有testingadb shell am instrument -e log true
  2. 通过parsing来自(1)的输出来构build执行计划
  3. 逐行运行执行计划

使用相同的想法这些都是你可以轻松支持的所有选项

  • 清除数据
  • 清除通知栏
  • 参数
  • 过滤并通过标签运行

只使用注释。 喜欢这个:

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

奖金! 🎁对于每个失败的testing:

  • 收集Logcat + stacktrace
  • 录制video(mp4)
  • 转储数据库(sqlite)
  • 转储默认共享首选项(xml)
  • 收集dumpsys文件,如:电池,netstats和其他。

一般而言,添加更多选项很容易,因为testing是从bash脚本逐个执行的,而不是从gradle任务中执行的。

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

📘 带有示例的源代码 : https : //github.com/medisafe/run-android-tests

希望这个答案6年的问题;)