Uygulama verilerini programlı olarak temizleme


152

Bir android uygulaması (Robotium kullanarak) için otomatik testler geliştiriyorum. Testlerin tutarlılığını ve güvenilirliğini sağlamak için her teste temiz durumda (test edilen uygulamanın) başlamak istiyorum. Bunu yapmak için uygulama verilerini temizlemem gerekiyor. Bu, Ayarlar / Uygulamalar / Uygulamaları Yönet / [Uygulamam] / Verileri temizle bölümünde manuel olarak yapılabilir

Bunu programlı olarak yapmanın önerilen yolu nedir?


Uygulama lansmanları arasındaki verileri temizlemek için adb aracını kullanmak mümkün müdür? adb -w
smith324

Ne yazık ki, bu seçenek kullanılamıyor (adb yardımı güncel değil).
user597603

Bu harika olurdu. Veritabanı sorunları ayıklanırken, Verileri Temizle seçeneğine çok gitmem gerekiyor ve gerçekten akışımı kesiyor.
Jason Prado

Android Studio üzerinden nasıl yapılacağı burada ele alınmaktadır: stackoverflow.com/q/31713579/905686 .
user905686

Yanıtlar:


171

Yüklü uygulamalara ilişkin verileri temizlemek için paket yöneticisi aracını kullanabilirsiniz (cihazınızdaki uygulama ayarlarındaki 'verileri temizle' düğmesine basmaya benzer). Yani adb kullanarak şunları yapabilirsiniz:

adb shell pm clear my.wonderful.app.package

1
Android 2.1-update1'de bu maalesef ortaya çıkıyor Error: unknown command 'clear'.
Paul Lammertsma

@Palani: 2.1-r1 (andoid-7) üzerindeki herhangi bir sürüm için benim için çalışıyor. herhangi bir hata mesajı var mı?
edovino

1
Yukarıdaki komut android kabuk bağlanır ve android "pm clear my.wonderful.app.package" yürütür. Cihazımda "pm" komutunun "temizle" seçeneği yok. SDK ile ilgili bir şey yok. Cihazın ürün bilgisine bağlıdır.
Palani

m android app programaticaly tarayıcı (varsayılan) ve krom tarayıcı uygulamaları net veri arıyor. bunun için yardım edin ..
Brijesh Patel

Her cihazda çalışmıyor, ancak üzerinde çalıştığı cihazlar için harika
Cory Trese

34

Edovino cevabı @ kadar takiben takas yolu tüm bir uygulamanın tercihlerini programlı olacağını

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

Uyarı : Uygulama kapanmaya zorlar.


5
Bundan sonra çalışan herhangi bir test kodunuz varsa, başarısız olur.
rajath

Bunu yürütmek manifest'te beyan edilmeyi ve izinleri gerektiriyor mu?
reubenjohn

1
Hayır, herhangi bir özel izin gerektirmez.
Sebastiano

Teşekkürler, hayatımı kurtardın!
Sidd

1
Eğer o zaman uygulamayı kapatmak zorlamak istemiyorsam?
NJ

22

bununla SharedPreferences uygulama verilerini temizleyebilirsiniz

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

ve uygulama db'yi temizlemek için bu cevap doğrudur -> Uygulama veritabanını temizleme


14

API sürüm 19'dan ActivityManager.clearApplicationUserData () öğesini çağırmak mümkündür.

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

13
Sadece FYI, bunu çağırmak uygulamanızı sonlandıracaktır.
Zach Rattner

8

Bu kodu şuraya kontrol edin:

@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

Temizlenecek birkaç paylaşılan tercihiniz varsa, bu çözüm çok daha hoştur .

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

Bu, "enstrümantasyon modunun" etkinleştirilmesini gerektirmez mi? Yine de bu mod nedir?
ADTC

Evet, bu "enstrümanlı" bir uygulama gerektirir, yani testiniz uygulama kodunuzla birlikte işlemdeki gerçek bir cihazda çalışır.
Thomas Keller

ne olmalı (...)?
NickUnuchek

@NickUnuchek Tercihler dosyasının adı.
Thomas Keller

3

Context'i kullanarak , tercih, veritabanı dosyası gibi uygulamaya özgü dosyaları temizleyebiliriz. Espresso kullanarak UI testi için aşağıdaki kodu kullandım.

    @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

Bunu yapmanın en basit yolu

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

Bu, verileri temizler ve uygulamanızı bellekten kaldırır. Ayarlar -> Uygulama Yöneticisi -> Uygulamanız -> Verileri temizle altındaki verileri temizle seçeneğine eşdeğerdir.

Bu, verileri tamamen kaldıracak ve uygulamayı kapatmaya zorlayacak


Lütfen aynı cevabı birden fazla soruya eklemeyin . En iyisini yanıtlayın ve gerisini kopya olarak işaretleyin. Bkz . Birkaç soruya yinelenen cevap eklemek kabul edilebilir mi?
FelixSFD

1
Uygulamayı
kapatmadan

2

Bu çözüm bana gerçekten yardımcı oldu:

Aşağıdaki iki yöntemi kullanarak verileri programlı olarak temizleyebiliriz

    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 sürümü kitkat'in üzerindeyse bunu da kullanabilirsiniz

herkese açık geçersiz onClick (Görünümü görüntüle) {

    Context context = getApplicationContext(); // add this line
    if (Build.VERSION_CODES.KITKAT <= Build.VERSION.SDK_INT) {
        ((ActivityManager) context.getSystemService(ACTIVITY_SERVICE))
            .clearApplicationUserData();
        return;
    }

0

Bunu programlı olarak yapmanın önerilen yolu nedir?

Olası tek seçenek adb shell pm clear packagetestten önce ADB komutunu çalıştırmaktır . En büyük sorun, testlerin yürütülmesini ve kabuk komutlarını birleştiren bir tür baş ağrısının olmasıdır.

Bununla birlikte, (Mediafe'de) sizin için düzenli bir köksüz cihazda çalışabilecek bir çözümle geldik. Tek yapmanız gereken bir açıklama eklemek. Geri kalan her şey basit bash betiği çalıştırılarak yapılır .

Sadece @ClearDataherhangi bir test ve tada before önce açıklama ekleyin , ADB silme komutu test yürütülmeden önce yürütülür.

Bu böyle bir teste bir örnektir:

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

Fikir aşağıdaki gibidir

  1. Tüm testleri kullanarak adb shell am instrument -e log true
  2. (1) 'in çıktısını ayrıştırarak yürütme planı oluşturun
  3. Yürütme planını satır satır çalıştırma

Aynı fikri kullanarak bunların hepsi kolayca destekleyebileceğiniz seçeneklerdir :

  • Net veriler
  • Bildirim çubuğunu temizle
  • Parameterize
  • Etiketlere göre filtreleme ve çalıştırma

Yalnızca ek açıklamaları kullanın. Bunun gibi:

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

Bonus! Failed Başarısız olan her test için:

  • Logcat + yığın izlemesi topla
  • Video kaydet (mp4)
  • Döküm DB (sqlite)
  • Varsayılan paylaşılan tercihleri ​​döküm (xml)
  • Pil, netstats ve diğer gibi dumpsys dosyalarını toplayın.

Genel olarak, testler sınıflandırma görevinden ziyade bash betiğinden tek tek yürütüldüğünden daha fazla seçenek eklemek kolaydır.

📗 tam blog yazısı : https://medium.com/medisafe-tech-blog/running-android-ui-tests-53e85e5c8da8

Examples Örneklerle kaynak kodu : https://github.com/medisafe/run-android-tests

Umarım bu 6 yıl soruya cevap verir;)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.