Android cihazlar iddia üzerinde kullanabilir miyim?
Android uygulamalarım anahtar kelime öykünücüsü bazı durumlarda uygulamam yok etmek için iddia, ya da test sırasında cihazımı kullanmak istiyorum. Bu mümkün mü?
Emülatör sadece benim iddia yok sayıyor gibi görünüyor.
CEVAP
Bu bakın: https://android.googlesource.com/platform/dalvik/ /master/docs/embedded-vm-control.html
Temelde, Dalvik VM olsa bile varsayılan olarak iddia çekleri göz ardı edilecek .dex bayt kod kontrol gerçekleştirmek için bir kod içerir. Kontrol iddialar iki şekilde açıktır:
(1) sistem ayarı özelliği "hata ayıklama."): . iddia
adb shell setprop debug.assert 1
ben doğrulanmış uygulamanızı yeniden sürece bu yaptıktan sonra beklendiği gibi çalışır, ya da
(2) gönderme komut satırı bağımsız değişkeni "--enable-iddia" için dalvik VM olan olmayabilir bir şey uygulama geliştiricilerin büyük ihtimalle yapar (biri bana doğru ben yanılıyorum eğer burada).
Temelde, ya da genel olarak, sınıf düzeyinde bir paket düzeyinde veya ilgili düzeyde iddialar sağlayan ayarlanabilir bir bayrak var. Bayrağı varsayılan olarak devre dışı olan iddia çekleri atlanır sonuç olarak.
Örnek benim Etkinlik aşağıdaki kodu yazdım:
public class AssertActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
int x = 2 3;
assert x == 4;
}
}
Bu kod için oluşturulan dalvik byte code (Android 2.3.3)
// Static constructor for the class
000318: |[000318] com.example.asserttest.AssertActivity.:()V
000328: 1c00 0300 |0000: const-class v0, Lcom/example/asserttest/AssertActivity; // class@0003
00032c: 6e10 0c00 0000 |0002: invoke-virtual {v0}, Ljava/lang/Class;.desiredAssertionStatus:()Z // method@000c
000332: 0a00 |0005: move-result v0
000334: 3900 0600 |0006: if-nez v0, 000c // 0006
000338: 1210 |0008: const/4 v0, #int 1 // #1
00033a: 6a00 0000 |0009: sput-boolean v0, Lcom/example/asserttest/AssertActivity;.$assertionsDisabled:Z // field@0000
00033e: 0e00 |000b: return-void
000340: 1200 |000c: const/4 v0, #int 0 // #0
000342: 28fc |000d: goto 0009 // -0004
:
:
// onCreate()
00035c: |[00035c] com.example.asserttest.AssertActivity.onCreate:(Landroid/os/Bundle;)V
00036c: 6f20 0100 3200 |0000: invoke-super {v2, v3}, Landroid/app/Activity;.onCreate:(Landroid/os/Bundle;)V // method@0001
000372: 1501 037f |0003: const/high16 v1, #int 2130903040 // #7f03
000376: 6e20 0500 1200 |0005: invoke-virtual {v2, v1}, Lcom/example/asserttest/AssertActivity;.setContentView:(I)V // method@0005
00037c: 1250 |0008: const/4 v0, #int 5 // #5
00037e: 6301 0000 |0009: sget-boolean v1, Lcom/example/asserttest/AssertActivity;.$assertionsDisabled:Z // field@0000
000382: 3901 0b00 |000b: if-nez v1, 0016 // 000b
000386: 1251 |000d: const/4 v1, #int 5 // #5
000388: 3210 0800 |000e: if-eq v0, v1, 0016 // 0008
00038c: 2201 0c00 |0010: new-instance v1, Ljava/lang/AssertionError; // class@000c
000390: 7010 0b00 0100 |0012: invoke-direct {v1}, Ljava/lang/AssertionError;.:()V // method@000b
000396: 2701 |0015: throw v1
000398: 0e00 |0016: return-void
Dikkat statik yapıcı metot nasıl Sınıf nesnesi desiredAssertionStatus ve sınıf genelinde değişken $assertionsDisabled; ayrıca bildirim ayarlar onCreate o çağırır(), java atmak için tüm kodu.lang.AssertionError derlenmiş ama yürütme statik oluşturucu Sınıf nesnesi için ayarlanır $assertionsDisabled değerini bağlıdır.
JUnit sınıfı ağırlıklı olarak kullanılır ne birey olarak, muhtemelen bu güvenli bir bahis olduğu anlaşılıyor. İddia anahtar kelime esneklik kalkınma zamanda onaylamaları açın ve onları nakliye bit için kapatın ve düzgün bir şekilde başarısız yerine yeteneğidir.
Bu yardımcı olur umarım.
Hangi programlama dilleri Android Dalv...
Nasıl bir Android projesinde dış Kavan...
Nasıl Android Geliştirme için MS Visua...
Nasıl Android üzerinde javascript hata...
İzlenmeyen dosyaları üzerinde git diff...