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


.

.

.

.

.

在 Android 采用 ART 虛擬機后,為了提高運行時效率,在編譯期間會將 jar 包中的 dex 文件編譯為 odex、vdex 等文件。而這些文件並不存放在 framework.jar 中,所以會導致單獨 push framework.jar 后,修改的內容不生效。

由於我們並不知道我們所修改的文件被編譯到哪個目標文件中了,所以為了使修改能夠生效,要么重新燒錄 system.img,要么就得把整個 /system/framework 目錄都 push 到開發板中。顯然這兩種方式都太麻煩了,不適合調試代碼。

其實我們也可以通過禁用 dex 優化的方式來禁止編譯期間生成 vdex 這類文件。當然這樣做會影響系統首次運行的速度,但調試起來就方便多了,只需要把編譯出來的 jar 包直接 push 到開發板上就可以了。

編輯 build/make/core/main.mk 文件,加入 WITH_DEXPREOPT := false 就可以了。

為了使其僅對 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 上測試通過。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM