प्रोग्राम डेटा साफ़ करने के लिए कैसे


152

मैं Android एप्लिकेशन (रोबोटियम का उपयोग करके) के लिए स्वचालित परीक्षण विकसित कर रहा हूं। परीक्षणों की स्थिरता और विश्वसनीयता सुनिश्चित करने के लिए, मैं प्रत्येक परीक्षण को स्वच्छ स्थिति (परीक्षण के तहत आवेदन का) के साथ शुरू करना चाहूंगा। ऐसा करने के लिए, मुझे ऐप डेटा साफ़ करने की आवश्यकता है। इसे सेटिंग्स / एप्लिकेशन / मैनेज एप्लिकेशन / [माय ऐप] / क्लियर डेटा में मैन्युअल रूप से किया जा सकता है

इसे प्रोग्रामिक रूप से करने के लिए अनुशंसित तरीका क्या है?


क्या एप्लिकेशन लॉन्च के बीच डेटा को साफ़ करने के लिए adb टूल का उपयोग करना संभव है? adb -w
smith324

दुर्भाग्य से, यह विकल्प उपलब्ध नहीं है (अदब मदद पुरानी है)।
185 बजे user597603

यह बहुत अच्छा होगा। जब डेटाबेस मुद्दों को डीबग करना होता है, तो मुझे स्पष्ट डेटा विकल्प पर नेविगेट करना होगा और यह वास्तव में मेरे प्रवाह को तोड़ देगा।
जेसन प्राडो

एंड्रॉइड स्टूडियो के माध्यम से इसे कैसे करें यहां चर्चा की गई है: stackoverflow.com/q/31713579/905686
user905686

विशेष रूप से, ऐसा करें: stackoverflow.com/a/57461180/94557
मैट वोल्फ

जवाबों:


171

आप इंस्टॉल किए गए ऐप्स के लिए डेटा साफ़ करने के लिए पैकेज-मैनेजर टूल का उपयोग कर सकते हैं (अपने डिवाइस पर ऐप सेटिंग्स में 'स्पष्ट डेटा' बटन को दबाने के लिए)। तो अदब का उपयोग करके आप कर सकते हैं:

adb shell pm clear my.wonderful.app.package

1
Android 2.1-update1 पर, यह दुर्भाग्य से पैदावार देता है Error: unknown command 'clear'
पॉल लामर्ट्स्मा

@पनानी: 2.1-r1 (andoid-7) से ऊपर के किसी भी संस्करण के लिए मेरे लिए काम करती है। कोई त्रुटि संदेश?
एडोविनो

1
ऊपर कमांड एंड्रॉइड शेल से कनेक्ट होता है और एंड्रॉइड में "pm क्लियर my.wonderful.app.package" निष्पादित करता है। मेरे डिवाइस में, "pm" कमांड में "स्पष्ट" विकल्प नहीं है। इसका sdk से कोई संबंध नहीं है। यह डिवाइस फर्मवेयर पर निर्भर करता है।
पलानी

मेरे एंड्रॉइड ऐप से एंड्रॉइड डिवाइस प्रोग्राममैटॉली में ब्राउज़र (डीफ़ॉइट) और क्रोम ब्राउज़र ऐप के स्पष्ट डेटा की तलाश कर रहा हूं। इसके लिए सहायता करें।
बृजेश पटेल

हर डिवाइस पर काम नहीं करता है, लेकिन यह उन उपकरणों के लिए अद्भुत है जो इस पर काम करते हैं
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
यदि आपके पास इसके बाद कोई परीक्षण कोड चल रहा है, तो यह विफल हो जाता है।
राजपथ

क्या इस आवश्यकता को पूरा करने और प्रकट में अनुमतियाँ घोषित की जाती हैं?
जुबांझोन

1
नहीं, इसके लिए किसी विशेष अनुमति की आवश्यकता नहीं है।
सेबेस्टियानो

Thx, यू मेरी जान बचाई!
सिद्ध

1
अगर मैं करीबी ऐप को मजबूर नहीं करना चाहता तो?
एनजे

22

आप इस के साथ साझा किए गए एप्लिकेशन-डेटा को साझा कर सकते हैं

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

और एप्लिकेशन डीबी को साफ़ करने के लिए, यह उत्तर सही है -> अनुप्रयोग डेटाबेस साफ़ करना


14

एपीआई संस्करण 19 से एक्टीविमैनएगर.क्लेयरऐप्लीकेशन यूसेडरडाटा () को कॉल करना संभव है।

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

13
बस FYI करें, इसे कॉल करने से आपका ऐप समाप्त हो जाएगा।
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 वरीयताओं की फ़ाइल का नाम।
थॉमस केलर

3

संदर्भ का उपयोग करते हुए , हम प्राथमिकता, डेटाबेस फ़ाइल जैसी विशिष्ट फ़ाइलों को साफ़ कर सकते हैं। मैंने एस्प्रेसो का उपयोग करके यूआई परीक्षण के लिए नीचे दिए गए कोड का उपयोग किया है।

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

यह डेटा को साफ़ करेगा और आपके ऐप को मेमोरी से हटा देगा। यह सेटिंग्स -> एप्लिकेशन मैनेजर -> आपका ऐप -> स्पष्ट डेटा के तहत स्पष्ट डेटा विकल्प के बराबर है।

यह डेटा को पूरी तरह से हटा देगा और साथ ही ऐप को बंद कर देगा


कृपया एक से अधिक प्रश्नों के उत्तर न जोड़ें । सर्वश्रेष्ठ का उत्तर दें और बाकी को डुप्लिकेट के रूप में चिह्नित करें। देखें कि क्या कई सवालों के डुप्लीकेट उत्तर को जोड़ना स्वीकार्य है?
फेलिक्सएसएफडी

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

यदि Android संस्करण किटकैट से ऊपर है तो आप इसका भी उपयोग कर सकते हैं

सार्वजनिक शून्य पर क्लिक करें (देखें दृश्य) {

    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परीक्षण से पहले एडीबी कमांड को चलाने का एकमात्र संभावित विकल्प है । सबसे बड़ी समस्या यह है कि यह परीक्षणों के निष्पादन और शेल कमांडों को मिलाकर सिरदर्द की तरह है।

हालांकि, हम (मीडियाफे में) कुछ समाधान लेकर आए हैं जो आपके लिए नियमित अनरूट किए गए डिवाइस पर काम कर सकते हैं। आपको बस एक एनोटेशन जोड़ना है। बाकी सब साधारण बैश स्क्रिप्ट चलाकर किया जाता है ।

बस @ClearDataअपने किसी भी परीक्षण और टाडा add से पहले एनोटेशन जोड़ें , एडीबी स्पष्ट कमांड को परीक्षण निष्पादन से पहले निष्पादित किया जाएगा।

यह इस तरह के परीक्षण का एक उदाहरण है:

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

विचार अग्रांकित है

  1. सभी परीक्षणों का उपयोग करके पढ़ें adb shell am instrument -e log true
  2. (1) से उत्पादन पार्स करके निष्पादन योजना बनाएं
  3. निष्पादन योजना लाइन को लाइन से चलाएं

समान विचार का उपयोग करके ये सभी विकल्प हैं जिनका आप आसानी से समर्थन कर सकते हैं:

  • शुद्ध आंकड़े
  • स्पष्ट सूचना पट्टी
  • parameterize
  • टैग द्वारा फ़िल्टर करें और चलाएं

केवल एनोटेशन का उपयोग करें। ऐशे ही:

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

बक्शीश! Each प्रत्येक असफल परीक्षा के लिए:

  • Logcat + stacktrace लीजिए
  • वीडियो रिकॉर्ड करें (mp4)
  • डंप DB (sqlite)
  • डिफ़ॉल्ट डिफ़ॉल्ट साझा प्राथमिकताएँ (xml)
  • बैटरी, netstats और अन्य: जैसे डिप्स फ़ाइलें एकत्र करें।

सामान्य तौर पर, अधिक विकल्पों को जोड़ना आसान होता है, क्योंकि परीक्षणों को एक-एक करके बैश स्क्रिप्ट से एक के बाद एक कर दिया जाता है।

Afe पूरा ब्लॉग पोस्ट : https://medium.com/medisafe-tech-blog/running-android-ui-tests-53e85e5c8da8

📘 उदाहरण के साथ स्रोत कोड : https://github.com/medisafe/run-android-tests

उम्मीद है कि यह जवाब 6 साल के सवाल;)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.