如何以编程方式清除应用程序数据
我正在开发一个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 }
这个想法如下
- 通过使用
adb shell am instrument -e log true
读取所有testingadb shell am instrument -e log true
- 通过parsing来自(1)的输出来构build执行计划
- 逐行运行执行计划
使用相同的想法这些都是你可以轻松支持的所有选项 :
- 清除数据
- 清除通知栏
- 参数
- 过滤并通过标签运行
只使用注释。 喜欢这个:
@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年的问题;)
- onStart()和onResume()之间的区别
- 如何在外部方法中获取值asynchronousonDataChange()
- Android N要求IDE使用Java 1.8或更高版本运行?
- 升级到Android Studio 2.0后,在Gradle构build过程中发生大量错误
- Android Studio错误:错误:CreateProcess错误= 216,此版本的%1与您正在运行的Windows版本不兼容
- 将活动中的对象传递给片段
- Genymotion上的Google Play服务在棒棒糖上(Android 5.0)
- 删除ColorFilter /撤消setColorFilter
- 如何访问Android的通话logging?