কীভাবে প্রোগ্রামিয়ালি অ্যাপ্লিকেশন ডেটা সাফ করবেন


152

আমি একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন (রোবটিয়াম ব্যবহার করে) এর জন্য স্বয়ংক্রিয় পরীক্ষার বিকাশ করছি। পরীক্ষাগুলির ধারাবাহিকতা এবং নির্ভরযোগ্যতা নিশ্চিত করার জন্য, আমি প্রতিটি পরীক্ষাটি পরিষ্কার অবস্থায় (পরীক্ষার অধীনে প্রয়োগের) দিয়ে শুরু করতে চাই। এটি করার জন্য, আমার অ্যাপ্লিকেশন ডেটা সাফ করা দরকার। এটি সেটিংস / অ্যাপ্লিকেশনগুলি / পরিচালনা অ্যাপ্লিকেশনগুলি / [আমার অ্যাপ্লিকেশন] / ডেটার সাফ করার জন্য ম্যানুয়ালি করা যায়

প্রোগ্রামযুক্তভাবে এটি করার প্রস্তাবিত উপায় কী?


অ্যাপ্লিকেশন লঞ্চগুলির মধ্যে ডেটা সাফ করার জন্য অ্যাডবি সরঞ্জামটি ব্যবহার করা কি সম্ভব? adb -w
স্মিথ 324

দুর্ভাগ্যক্রমে, এই বিকল্পটি উপলভ্য নয় (অ্যাডাবির সহায়তা পুরানো)
ব্যবহারকারী597603

এটি এত দুর্দান্ত হবে। ডাটাবেস ইস্যুগুলি ডিবাগ করার সময়, আমাকে সাফ ডেটা অপশনে নেভিগেট করতে হবে এবং এটি আমার প্রবাহকে সত্যই ভেঙে দেয়।
জেসন প্রাদো

অ্যান্ড্রয়েড স্টুডিওর মাধ্যমে এটি কীভাবে করবেন তা এখানে আলোচনা করা হয়েছে: stackoverflow.com/q/31713579/905686
ব্যবহারকারী 905686

বিশেষতঃ এটি করুন: stackoverflow.com/a/57461180/94557
ম্যাট ওল্ফ

উত্তর:


171

ইনস্টলড অ্যাপ্লিকেশনগুলির জন্য ডেটা সাফ করার জন্য আপনি প্যাকেজ-ম্যানেজার সরঞ্জামটি ব্যবহার করতে পারেন (আপনার ডিভাইসের অ্যাপ্লিকেশন সেটিংসে 'পরিষ্কার ডেটা' বোতাম টিপানোর অনুরূপ)। সুতরাং অ্যাডবি ব্যবহার করে আপনি করতে পারেন:

adb shell pm clear my.wonderful.app.package

1
অ্যানড্রয়েড ২.১-আপডেট ১ এ দুর্ভাগ্যক্রমে ফলন হয়েছে Error: unknown command 'clear'
পল ল্যামার্টসমা

@ পলানী: ২.১-আর ১ (অ্যান্ডয়েড-7) এর উপরের কোনও সংস্করণের জন্য আমার পক্ষে কাজ করে। কোন ত্রুটি বার্তা?
এডোভিনো

1
উপরের কমান্ডটি অ্যান্ড্রয়েড শেলের সাথে সংযোগ স্থাপন করে এবং অ্যান্ড্রয়েডে "pm ক্লায়েন্ট my.wonderful.app.package" চালায়। আমার ডিভাইসে, "pm" কমান্ডের "ক্লিয়ার" বিকল্প নেই। এটি এসডির সাথে সম্পর্কিত কিছু নয়। এটি ডিভাইস ফার্মওয়্যারের উপর নির্ভর করে।
পালানী 18

মি আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশন থেকে অ্যান্ড্রয়েড ডিভাইস প্রোগ্রামমেটিক্যালিতে ব্রাউজার (ডিফল্ট) এবং ক্রোম ব্রাউজার অ্যাপ্লিকেশনগুলির স্পষ্ট ডেটা খুঁজছেন lease দয়া করে এটির জন্য সহায়তা করুন ..
ব্রিজেশ প্যাটেল

প্রত্যেকটি ডিভাইসে কাজ করে না, কিন্তু এটা ডিভাইসের জন্য বিস্ময়কর যে এটা কাজ করে
কোরি 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();
    }
}

সতর্কতা : অ্যাপ্লিকেশনটি বন্ধ করতে বাধ্য করবে will


5
আপনার যদি এর পরে কোনও টেস্ট কোড চলমান থাকে তবে এটি ব্যর্থ হয়।
রাজথ

এটি কার্যকর করার জন্য কি ম্যানিফেস্টে ঘোষিত হওয়া প্রয়োজন এবং অনুমতিগুলি রয়েছে?
পুনর্জনহান

1
না, এটির জন্য কোনও বিশেষ অনুমতি প্রয়োজন নেই।
সেবাস্তিয়ানো

তুমি আমার জীবন বাঁচিয়েছ!
সিদ্দিক

1
আমি যদি তখনই জোর করে অ্যাপ বন্ধ করতে চাই না?
এনজে

22

আপনি এটি দিয়ে SharedPreferences অ্যাপ্লিকেশন ডেটা সাফ করতে পারেন

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
কেবল এফওয়াইআই, এটিকে কল করা আপনার অ্যাপ্লিকেশনটি সমাপ্ত করবে।
জ্যাচ রেটনার

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

আপনি স্পষ্ট ভাগ করা হয়েছে পছন্দগুলি মাত্র কয়েক থাকে, তাহলে এই সমাধান অনেক 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());
}

এটির জন্য "ইনস্ট্রুমেন্টেশন মোড" সক্ষম করা দরকার হয় না? যাইহোক যে মোড কি?
ADTC

হ্যাঁ, এর জন্য একটি "চালিত" অ্যাপ্লিকেশন প্রয়োজন, অর্থাত আপনার পরীক্ষার প্রক্রিয়াধীন একটি বাস্তব ডিভাইসে আপনার অ্যাপ্লিকেশন কোডের পাশাপাশি চলে , যার অর্থ হল আপনি আপনার অ্যাপ্লিকেশনটির সমস্ত রাজ্যে অ্যাক্সেস করতে পারবেন এবং পরীক্ষার উদ্দেশ্যে রান সময়টিতে এটি পরিবর্তন করতে পারবেন।
টমাস কেলার

(...) এ কী হওয়া উচিত?
নিকউনুশেখ

@ নিক ইউনুকেক পছন্দসই ফাইলটির নাম।
টমাস কেলার

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

অ্যান্ড্রয়েড সংস্করণ কিটকাটের উপরে থাকলে আপনি এটিও ব্যবহার করতে পারেন

ক্লিক করুন সার্বজনীন অন ক্লিক করুন (দেখুন দেখুন) {

    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আপনার পরীক্ষাগুলি এবং টাদা of এর আগে কেবল টীকা যুক্ত করুন, পরীক্ষার কার্যকর হওয়ার আগে এডিবি ক্লিয়ার কমান্ড কার্যকর করা হবে।

এটি এই জাতীয় পরীক্ষার উদাহরণ:

@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];
    // ...
}

বোনাস! Failed প্রতিটি ব্যর্থ পরীক্ষার জন্য:

  • লোগক্যাট + স্ট্যাকট্রেস সংগ্রহ করুন
  • রেকর্ড ভিডিও (এমপি 4)
  • ডাম্প ডিবি (স্ক্লাইট)
  • ডিফল্ট ভাগ করা পছন্দসই পছন্দগুলি (এক্সএমএল)
  • ডাম্পসিস ফাইলগুলি সংগ্রহ করুন: ব্যাটারি, নেটস্ট্যাটস এবং অন্যান্য।

সাধারণভাবে, আরও বিকল্প যুক্ত করা সহজ, যেহেতু গ্রেড টাস্কের পরিবর্তে পরীক্ষাগুলি একের পর এক ব্যাশ স্ক্রিপ্ট থেকে কার্যকর করা হয়।

Blog সম্পূর্ণ ব্লগ পোস্ট : 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.