編輯:關於Android編程
我們使用的測試Java代碼如下:
packagecom.example.testar;
importjava.lang.reflect.Method;
importandroid.app.Application;
importandroid.util.Log;
publicclass InjectApplication extends Application {
static {
System.loadLibrary("so");
}
@Override
public void onCreate() {
// TODO Auto-generated methodstub
System.out.println("InjectApplication native test");
此處調用JNI函數
testddd();
super.onCreate();
}
public native String testddd();
}
修改art/compiler/dex/frontend.cc,打開輸出
staticuint32_t kCompilerDebugFlags = 0 | //Enable debug/testing modes
// (1 << kDebugDisplayMissingTargets) |
(1 <
(1 <
adblogcat –S dex2oat:*
得到編譯onCreate函數輸出如下:
I/dex2oat(10839): Compiling void com.example.testar.InjectApplication.onCreate()...
I/dex2oat(10839): Compiling void com.example.testar.InjectApplication.onCreate()
I/dex2oat(10839): 0xb587c3f8 insns
I/dex2oat(10839): 13 blocks in total
I/dex2oat(10839): Block 0 (Entry Block) (insn 0000 - 0000 empty)
I/dex2oat(10839): Fallthrough : block 2 (0x0)
I/dex2oat(10839): Block 1 (Exit Block) (insn 0000 - 0000 empty)
I/dex2oat(10839): Block 2 (Code Block) (insn 0000 - 0000)
I/dex2oat(10839): Taken branch: block 3(0x0)
I/dex2oat(10839): Fallthrough : block 4 (0x0)
I/dex2oat(10839): Block 3 (Exception Handling) (insn 0000 - 0000 empty)
I/dex2oat(10839): Block 4 (Code Block) (insn 0000 - 0002)
I/dex2oat(10839): Taken branch: block 5(0x2)
I/dex2oat(10839): Fallthrough : block 6 (0x2)
I/dex2oat(10839): Block 5 (Exception Handling) (insn 0002 - 0002 empty)
I/dex2oat(10839): Block 6 (Code Block) (insn 0002 - 0004)
I/dex2oat(10839): Taken branch: block 7(0x4)
I/dex2oat(10839): Fallthrough : block 8 (0x4)
I/dex2oat(10839): Block 7 (Exception Handling) (insn 0004 - 0004 empty)
I/dex2oat(10839): Block 8 (Code Block) (insn 0004 - 0007)
I/dex2oat(10839): Taken branch: block 9(0x7)
I/dex2oat(10839): Fallthrough : block 10 (0x7)
I/dex2oat(10839): Block 9 (Exception Handling) (insn 0007 - 0007 empty)
I/dex2oat(10839): Block 10 (Code Block) (insn 0007 - 000a)
I/dex2oat(10839): Taken branch: block 11(0xa)
I/dex2oat(10839): Fallthrough : block 12 (0xa)
I/dex2oat(10839): Block 11 (Exception Handling) (insn 000a - 000a empty)
I/dex2oat(10839): Block 12 (Code Block) (insn 000a - 000d)
I/dex2oat(10839): Fallthrough : block 1 (0x0)
I/dex2oat(10839): Core regs after sort
I/dex2oat(10839): s_reg[2]: 2
I/dex2oat(10839): s_reg[0]: 1
I/dex2oat(10839): s_reg[1]: 1
I/dex2oat(10839): s_reg[3]: 1
I/dex2oat(10839): Fp regs after sort
I/dex2oat(10839): s_reg[0]: 0
I/dex2oat(10839): s_reg[1]: 0
I/dex2oat(10839): s_reg[2]: 0
I/dex2oat(10839): s_reg[3]: 0
I/dex2oat(10839): V[00] -> r6
I/dex2oat(10839): V[01] -> r7
I/dex2oat(10839): V[02] -> r5
I/dex2oat(10839): V[Method*] -> r8
I/dex2oat(10839): After Promotion
I/dex2oat(10839): Loc[00] : PhysReg, N U C n L h r6 s31 S0
I/dex2oat(10839): Loc[01] : PhysReg, N U C n L h r7 s31 S1
I/dex2oat(10839): Loc[02] : PhysReg, N D R n L h r5 s31 S2
I/dex2oat(10839): Loc[-1] : PhysReg, N D C n L h r8 s31 S3
I/dex2oat(10839): Loc[04] : PhysReg, N D R n L h r6 s31 S0
I/dex2oat(10839): Loc[05] : PhysReg, N D R n L h r7 s31 S1
I/dex2oat(10839): Dumping LIR insns for voidcom.example.testar.InjectApplication.onCreate()
I/dex2oat(10839): Regs (excluding ins) : 2
I/dex2oat(10839): Ins : 1
I/dex2oat(10839): Outs : 2
I/dex2oat(10839): CoreSpills : 5
I/dex2oat(10839): FPSpills : 0
I/dex2oat(10839): CompilerTemps : 0
I/dex2oat(10839): Frame size : 48
I/dex2oat(10839): code size is 172 bytes, Dalvik size is 28
I/dex2oat(10839): expansion factor: 6.14286
I/dex2oat(10839): V[00] -> r6
I/dex2oat(10839): V[01] -> r7
thispointer
I/dex2oat (10839): V[02] -> r5
I/dex2oat(10839): V[Method*] -> r8
I/dex2oat(10839): L0xb585b9ec:
I/dex2oat(10839): -------- method entry voidcom.example.testar.InjectApplication.onCreate()
I/dex2oat(10839): 00000: ldr r12, [rSELF, #16]
I/dex2oat(10839): 00004: push
I/dex2oat(10839): 00008: sub lr,sp,#28
I/dex2oat(10839): 0000c: cmp lr, r12
I/dex2oat(10839): 0000e: bcc 0x0000009a(L0xb585beb4)
I/dex2oat(10839): 00012: mov sp, lr
I/dex2oat(10839): 00014: mov r8, r0
I/dex2oat(10839): 00016: str r0, [sp, #0]
I/dex2oat(10839): 00018: movs r5, r1
I/dex2oat(10839): L0xb585ba7c:
I/dex2oat(10839): -------- dalvik offset: 0x0 @ sget-object v0_1, index #312
I/dex2oat(10839): 0001a: mov r1, r8
I/dex2oat(10839): 0001c: ldr r0, [r1, #12]
I/dex2oat(10839): 0001e: ldr r0, [r0, #944]
I/dex2oat(10839): 00022: cbnz r0,0x0000002c(L0xb585c354)
I/dex2oat(10839): 00024: ldr lr, [rSELF,#372]
I/dex2oat(10839): 00028: movs r0, #233
I/dex2oat(10839): 0002a: blx lr
I/dex2oat(10839): LsafepointPC_0x2c_0:
I/dex2oat(10839): L0xb585c354:
I/dex2oat(10839): 0002c: ldr r6, [r0, #116]
I/dex2oat(10839): -------- dalvik offset: 0x2 @ const-string v1_1, index #239
I/dex2oat(10839): 0002e: ldr lr, [rSELF,#384]
I/dex2oat(10839): 00032: mov r2, r8
I/dex2oat(10839): 00034: ldr r0, [r2, #24]
I/dex2oat(10839): 00036: ldr r0, [r0, #968]
I/dex2oat(10839): 0003a: movs r1, #239
I/dex2oat(10839): 0003c: cmp r0, #0
I/dex2oat(10839): -------- BARRIER
I/dex2oat(10839): 0003e: it:0100 eq
I/dex2oat(10839): 00040: movs r0, r2
I/dex2oat(10839): 00042: blx lr
I/dex2oat(10839): LsafepointPC_0x44_2:
I/dex2oat(10839): -------- BARRIER
I/dex2oat(10839): 00044: movs r7, r0
I/dex2oat(10839): -------- dalvik offset: 0x4 @ Check1: invoke-virtual v0_1, v1_1
I/dex2oat(10839): 00046: movs r1, r6
I/dex2oat(10839): 00048: movs r2, r7
I/dex2oat(10839): 0004a: cbz r1,0x000000a6(L0xb585c990)
I/dex2oat(10839): 0004c: ldr lr, [r1, #0]
I/dex2oat(10839): 00050: ldr lr, [lr, #52]
I/dex2oat(10839): 00054: ldr r0, [lr, #188]
I/dex2oat(10839): 00058: ldr lr, [r0, #40]
I/dex2oat(10839): 0005c: blx lr
I/dex2oat(10839): LsafepointPC_0x5e_4:
I/dex2oat(10839): L0xb585bc2c:
I/dex2oat(10839): -------- dalvik offset: 0x4 @ Check2: invoke-virtual v0_1, v1_1
I/dex2oat(10839): -------- dalvik offset: 0x7 @ invoke-virtual v2_0
//thispointer
I/dex2oat (10839): 0005e: movs r1, r5
453 cg->LoadWordDisp(cg->TargetReg(kArg1),mirror::Object::ClassOffset().Int32Value(),
454 cg->TargetReg(kInvokeTgt));
I/dex2oat(10839): 00060: ldr lr, [r1, #0]
457 cg->LoadWordDisp(cg->TargetReg(kInvokeTgt),mirror::Class::VTableOffset().Int32Value(),
458 cg->TargetReg(kInvokeTgt));
I/dex2oat(10839): 00064: ldr lr, [lr, #52]
461 cg->LoadWordDisp(cg->TargetReg(kInvokeTgt), (method_idx * 4) +
462 mirror::Array::DataOffset(sizeof(mirror::Object*)).Int32Value(),
463 cg->TargetReg(kArg0));
I/dex2oat(10839): 00068: ldr r0, [lr, #588]
466 if(cu->instruction_set != kX86) {
467 cg->LoadWordDisp(cg->TargetReg(kArg0),
468 mirror::ArtMethod::GetEntryPointFromCompiledCodeOffset().Int32Value(),
469 cg->TargetReg(kInvokeTgt));
I/dex2oat(10839): 0006c: ldr lr, [r0, #40]
I/dex2oat(10839): 00070: blx lr
I/dex2oat(10839): LsafepointPC_0x72_7:
I/dex2oat(10839): -------- dalvik offset: 0xa @ invoke-super v2_0
I/dex2oat(10839): 00072: mov lr, #1717
I/dex2oat(10839): 00076: movt lr, #25352
I/dex2oat(10839): 0007a: mov r0, #30304
I/dex2oat(10839): 0007e: movt r0, #24657
I/dex2oat(10839): 00082: movs r1, r5
I/dex2oat(10839): 00084: blx lr
I/dex2oat(10839): LsafepointPC_0x86_a:
I/dex2oat(10839): -------- dalvik offset: 0xd @ return-void
I/dex2oat(10839): 00086: subs r4, #1
I/dex2oat(10839): 00088: beq 0x00000092(L0xb585d338)
I/dex2oat(10839): L0xb585d2f0:
I/dex2oat(10839): L0xb585ba34:
I/dex2oat(10839): -------- Method_Exit
I/dex2oat(10839): 0008c: add sp, #7*4
I/dex2oat(10839): 0008e: pop
I/dex2oat(10839): L0xb585bbe4:
I/dex2oat(10839): LS0xb585d338:
I/dex2oat(10839): 00092: ldr lr, [rSELF,#604]
I/dex2oat(10839): 00096: blx lr
I/dex2oat(10839): LsafepointPC_0x98_d:
I/dex2oat(10839): 00098: b 0x0000008c(L0xb585d2f0)
I/dex2oat(10839): LT0xb585beb4:
I/dex2oat(10839): 0009a: ldr lr, [sp, #16]
I/dex2oat(10839): 0009e: add sp, #5*4
I/dex2oat(10839): 000a0: ldr r12, [rSELF,#628]
I/dex2oat(10839): 000a4: bx r12
I/dex2oat(10839): LT0xb585c990:
I/dex2oat(10839): 000a6: ldr lr, [rSELF,#624]
I/dex2oat(10839): 000aa: blx lr
I/dex2oat(10839): LsafepointPC_0xac_4:
I/dex2oat(10839): PC2Dex_MappingTableLcom/example/testar/InjectApplication_onCreate_()V_table[14] = {
I/dex2oat(10839): {0x0002c, 0x0000},
I/dex2oat(10839): {0x00044, 0x0002},
I/dex2oat(10839): {0x0005e, 0x0004},
I/dex2oat(10839): {0x00072, 0x0007},
I/dex2oat(10839): {0x00086, 0x000a},
I/dex2oat(10839): {0x00098, 0x000d},
I/dex2oat(10839): {0x000ac, 0x0004},
I/dex2oat(10839): };
I/dex2oat(10839): Compiled void com.example.testar.InjectApplication.onCreate()
編譯生成調用代碼的地方
art/compiler/dex/quick/gen_invoke.cc
435static int NextVCallInsn(CompilationUnit* cu, CallInfo* info,
436 int state, constMethodReference& target_method,
437 uint32_t method_idx,uintptr_t unused, uintptr_t unused2,
438 InvokeType unused3) {
439 Mir2Lir* cg = static_cast
440 /*
441 *This is the fast path in which the target virtual method is
442 *fully resolved at compile time.
443 */
444 switch (state) {
445 case 0: { // Get "this" [set kArg1]
446 RegLocation rl_arg =info->args[0];
447 cg->LoadValueDirectFixed(rl_arg, cg->TargetReg(kArg1));
448 break;
449 }
450 case 1: // Is "this" null?[use kArg1]
451 cg->GenNullCheck(info->args[0].s_reg_low, cg->TargetReg(kArg1),info->opt_flags);
452 // get this->klass_ [use kArg1, set kInvokeTgt]
453 cg->LoadWordDisp(cg->TargetReg(kArg1),mirror::Object::ClassOffset().Int32Value(),
454 cg->TargetReg(kInvokeTgt));
455 break;
456 case 2: // Getthis->klass_->vtable [usr kInvokeTgt, set kInvokeTgt]
457 cg->LoadWordDisp(cg->TargetReg(kInvokeTgt),mirror::Class::VTableOffset().Int32Value(),
458 cg->TargetReg(kInvokeTgt));
459 break;
460 case 3: // Get target method [use kInvokeTgt, set kArg0]
461 cg->LoadWordDisp(cg->TargetReg(kInvokeTgt), (method_idx * 4) +
462 mirror::Array::DataOffset(sizeof(mirror::Object*)).Int32Value(),
463 cg->TargetReg(kArg0));
464 break;
465 case 4: // Get the compiled code address [uses kArg0,sets kInvokeTgt]
466 if (cu->instruction_set != kX86) {
467 cg->LoadWordDisp(cg->TargetReg(kArg0),
468 mirror::ArtMethod::GetEntryPointFromCompiledCodeOffset().Int32Value(),
469 cg->TargetReg(kInvokeTgt));
470 break;
471 }
472 // Intentional fallthrough for X86
473 default:
474 return -1;
475 }
476 return state + 1;
477 }
今天筆記本上開發再次遇到這個問題,經過確認eclipse indigo版本和ibus1.3.11確實有沖突。具體表現是eclipse裡按ctrl+空格,輸入法死活不出來。
看過很多開源代碼效果,發現裡面的代碼很多地方都用到這函數,於是想花些時間研究下這個,我現在寫博客一般不可能一下子就寫完,因為我也要查資料,寫代碼去驗證其效果,而且還要找下
堅果手機相信受到了很多朋友的關注,說不定就已經有不少朋友入手了。我們手機在滑動窗口的時候因為設置不同可能會導致窗口動畫縮放的速度不同,大家就就會覺得自己的手
簡介點擊事件的事件分發,其實就是對MotionEvent事件的分發過程,即當一個MotionEvent產生之後,系統需要這個事件傳遞給一個具體的View,而這個傳遞過程就