Zobacz dokument Embedded VM Control (surowy kod HTML z drzewa źródłowego lub ładnie sformatowana kopia).
Zasadniczo maszyna wirtualna Dalvik jest ustawiona tak, aby domyślnie ignorować sprawdzanie potwierdzenia, nawet jeśli kod bajtowy .dex zawiera kod do wykonania sprawdzenia. Sprawdzanie potwierdzeń jest włączane na jeden z dwóch sposobów:
(1) ustawiając właściwość systemową „debug.assert” przez:
adb shell setprop debug.assert 1
co sprawdziłem, działa zgodnie z przeznaczeniem, o ile po wykonaniu tej czynności ponownie zainstalujesz aplikację lub
(2) wysyłając argument wiersza poleceń „--enable-assert” do maszyny wirtualnej dalvik, co może nie być czymś, co twórcy aplikacji prawdopodobnie nie będą w stanie zrobić (ktoś poprawi mnie, jeśli się mylę).
Zasadniczo istnieje flaga, którą można ustawić globalnie, na poziomie pakietu lub na poziomie klasy, co umożliwia asercje na tym odpowiednim poziomie. Flaga jest domyślnie wyłączona, w wyniku czego kontrole potwierdzeń są pomijane.
Napisałem następujący kod w mojej przykładowej aktywności:
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;
}
}
Dla tego kodu generowany kod bajtowy dalvik (dla systemu 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,
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,
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,
000376: 6e20 0500 1200 |0005: invoke-virtual {v2, v1}, Lcom/example/asserttest/AssertActivity;.setContentView:(I)V // method@0005
00037c: 1250 |0008: const/4 v0,
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,
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
Zwróć uwagę, jak konstruktor statyczny wywołuje metodę pożądanąAssertionStatus w obiekcie Class i ustawia zmienną dla całej klasy $ assertionsDisabled; Zauważ również, że w onCreate () cały kod do zgłaszania java.lang.AssertionError jest wkompilowany, ale jego wykonanie jest zależne od wartości $ assertionsDisabled, która jest ustawiona dla obiektu Class w konstruktorze statycznym.
Wygląda na to, że klasa Assert JUnit jest tym, co jest używane przeważnie, więc prawdopodobnie jest to bezpieczne. Elastyczność słowa kluczowego assert polega na możliwości włączania asercji w czasie programowania i wyłączania ich w celu wysyłania bitów, a zamiast tego bezproblemowo zawodzą.
Mam nadzieję że to pomoże.