.android
.測試
.優化
.ui
.spa
在 Android 採用 ART 虛擬機後,爲了提升運行時效率,在編譯期間會將 jar 包中的 dex 文件編譯爲 odex、vdex 等文件。而這些文件並不存放在 framework.jar 中,因此會致使單獨 push framework.jar 後,修改的內容不生效。debug
因爲咱們並不知道咱們所修改的文件被編譯到哪一個目標文件中了,因此爲了使修改可以生效,要麼從新燒錄 system.img,要麼就得把整個 /system/framework 目錄都 push 到開發板中。顯然這兩種方式都太麻煩了,不適合調試代碼。調試
其實咱們也能夠經過禁用 dex 優化的方式來禁止編譯期間生成 vdex 這類文件。固然這樣作會影響系統首次運行的速度,但調試起來就方便多了,只須要把編譯出來的 jar 包直接 push 到開發板上就能夠了。code
編輯 build/make/core/main.mk 文件,加入 WITH_DEXPREOPT := false 就能夠了。blog
爲了使其僅對 userdebug 版本生效,我將其添加在了以下部位:開發
## user/userdebug ## user_variant := $(filter user userdebug,$(TARGET_BUILD_VARIANT)) enable_target_debugging := true tags_to_install := ifneq (,$(user_variant)) # Target is secure in user builds. ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=1 ADDITIONAL_DEFAULT_PROPERTIES += security.perf_harden=1 ifeq ($(user_variant),user) ADDITIONAL_DEFAULT_PROPERTIES += ro.adb.secure=1 endif ifeq ($(user_variant),userdebug) # Pick up some extra useful tools tags_to_install += debug # Added by dybai 20190808 Disable dex optimization. -----添加在這裏了----- WITH_DEXPREOPT := false else # Disable debugging in plain user builds. enable_target_debugging := endif # Disallow mock locations by default for user builds ADDITIONAL_DEFAULT_PROPERTIES += ro.allow.mock.location=0 else # !user_variant # Turn on checkjni for non-user builds. ADDITIONAL_BUILD_PROPERTIES += ro.kernel.android.checkjni=1 # Set device insecure for non-user builds. ADDITIONAL_DEFAULT_PROPERTIES += ro.secure=0 # Allow mock locations by default for non user builds ADDITIONAL_DEFAULT_PROPERTIES += ro.allow.mock.location=1 endif # !user_variant
若是想按照版級來控制,也能夠添加到 device 目錄下對應板級的 BoardConfig.mk 文件中。
以上在 Android-P 上測試經過。