Xem tài liệu Điều khiển máy ảo được nhúng (HTML thô từ cây nguồn hoặc bản sao được định dạng đẹp mắt ).
Về cơ bản, Dalvik VM được thiết lập để bỏ qua kiểm tra xác nhận theo mặc định, mặc dù mã byte .dex bao gồm mã để thực hiện kiểm tra. Kiểm tra xác nhận được bật theo một trong hai cách:
(1) bằng cách đặt thuộc tính hệ thống "debug.assert" qua:
adb shell setprop debug.assert 1
mà tôi đã xác minh hoạt động như dự định miễn là bạn cài đặt lại ứng dụng của mình sau khi thực hiện việc này hoặc
(2) bằng cách gửi đối số dòng lệnh "--enable-khẳng định" đến máy ảo dalvik, đây có thể không phải là điều mà các nhà phát triển ứng dụng có thể làm được (ai đó sẽ sửa cho tôi nếu tôi sai ở đây).
Về cơ bản, có một cờ có thể được đặt trên toàn cục, ở cấp gói hoặc ở cấp lớp cho phép xác nhận ở cấp tương ứng đó. Cờ bị tắt theo mặc định, do đó các kiểm tra xác nhận bị bỏ qua.
Tôi đã viết mã sau trong Hoạt động mẫu của mình:
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;
}
}
Đối với mã này, mã byte dalvik được tạo là (dành cho 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
Lưu ý cách phương thức khởi tạo tĩnh gọi phương thức wishAssertionStatus trên đối tượng Lớp và đặt biến toàn lớp $ khẳng địnhDisabled; cũng lưu ý rằng trong onCreate (), tất cả mã để ném java.lang.AssertionError đều được biên dịch, nhưng việc thực thi nó phụ thuộc vào giá trị của $ confirmtionsDisabled được đặt cho đối tượng Class trong hàm tạo tĩnh.
Có vẻ như lớp Assert của JUnit là thứ được sử dụng chủ yếu, vì vậy, có thể là một lựa chọn an toàn để sử dụng nó. Tính linh hoạt của từ khóa khẳng định là khả năng bật xác nhận tại thời điểm phát triển và tắt chúng để vận chuyển các bit và thay vào đó là thất bại một cách duyên dáng.
Hi vọng điêu nay co ich.