解決 android push framework.jar 不生效的問題

.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 上測試經過。

相關文章
相關標籤/搜索