日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

Android BOOTCLASSPATH详解

發布時間:2025/4/16 Android 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android BOOTCLASSPATH详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊打開鏈接

BOOTCLASSPATH被賦值流程分析

system/core/rootdir/init.environ.rc.in

# set up the global environment on initexport PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbinexport LD_LIBRARY_PATH /vendor/lib:/system/libexport ANDROID_BOOTLOGO 1export ANDROID_ROOT /systemexport ANDROID_ASSETS /system/appexport ANDROID_DATA /dataexport ANDROID_STORAGE /storageexport ASEC_MOUNTPOINT /mnt/asecexport LOOP_MOUNTPOINT /mnt/obbexport BOOTCLASSPATH %BOOTCLASSPATH%
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

通過上面的代碼我們知道BOOTCLASSPATH環境變量等于%BOOTCLASSPATH%,那%BOOTCLASSPATH%是誰賦的值呢?往下看。

system/core/rootdir/Android.mk

$(LOCAL_BUILT_MODULE): $(LOCAL_PATH)/init.environ.rc.in FORCE@echo "Generate: $< -> $@"@mkdir -p $(dir $@)$(hide) sed -e 's?%BOOTCLASSPATH%?$(PRODUCT_BOOTCLASSPATH)?g' $< >$@
  • 1
  • 2
  • 3
  • 4

語法解釋

FORCE 表示目標文件每次編譯的時候都會重新生成$< 表示依賴文件, 即$(LOCAL_PATH)/init.environ.rc.in, 等于system/core/rootdir/init.environ.rc.in$@ 表示目標文件, 即$(LOCAL_BUILT_MODULE), 等于out/target/product/imx6/obj/ETC/init.environ.rc_intermediates/init.environ.rc$(hide) = @, @加命令 表示只顯示命令結果, 不顯示命令本身sed -e 's?%BOOTCLASSPATH%?$(PRODUCT_BOOTCLASSPATH)?g' $< > $@ 這條命令表示將$<文件里面的%BOOTCLASSPATH%替換為$(PRODUCT_BOOTCLASSPATH),并將結果輸出到$@中。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

通過對上面這個mk文件的分析,我們知道%BOOTCLASSPATH%將被$(PRODUCT_BOOTCLASSPATH)替換掉,那$(PRODUCT_BOOTCLASSPATH)又是誰賦值的呢?繼續往下分析。先看下hide被賦值的地方。

ndk/build/core/definitions.mk

# ----------------------------------------------------------------------------- # Macro : hide # Returns : nothing # Usage : $(hide)<make commands> # Rationale: To be used as a prefix for Make build commands to hide them # by default during the build. To show them, set V=1 in your # environment or command-line. # # For example: # # foo.o: foo.c # -->|$(hide) <build-commands> # # Where '-->|' stands for a single tab character. # # ----------------------------------------------------------------------------- ifeq ($(V),1) hide = $(empty) else hide = @ endif
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

hide的賦值就不多說了,主要看下PRODUCT_BOOTCLASSPATH是怎么被賦值的。

build/core/dex_preopt.mk

DEXPREOPT_BOOT_JARS := $(PRODUCT_BOOT_JARS) DEXPREOPT_BOOT_JARS_MODULES := $(subst :, ,$(DEXPREOPT_BOOT_JARS)) PRODUCT_BOOTCLASSPATH := $(subst $(space),:,$(foreach m,$(DEXPREOPT_BOOT_JARS_MODULES),/system/framework/$(m).jar))
  • 1
  • 2
  • 3

語法解釋

$(foreach VAR, LIST, TEXT) 表示將LIST中以空格分割的單詞賦值給VAR,然后執行TEXT表達式,TEXT可能存在對VAR的引用。返回以空格分割的TEXT的執行結果。$(subst FROM,TO,TEXT) 表示把字串TEXT中的FROM字符替換為TO。返回替換后的新字符串。
  • 1
  • 2
  • 3

通過上面兩個語法的分析,我們知道DEXPREOPT_BOOT_JARS_MODULES會將DEXPREOPT_BOOT_JARS里的:替換為空格。然后PRODUCT_BOOTCLASSPATH會將DEXPREOPT_BOOT_JARS_MODULES里的值輪詢,并賦值給到/system/framework/x.jar,最后將這些.jar之間的空格替換會:。所以PRODUCT_BOOTCLASSPATH最終的顯示值應該是/system/framework/x.jar:/system/framework/y.jar:/system/framework/z.jar類似這樣的形式。PRODUCT_BOOT_JARS又是在哪賦值的呢?

build/target/product/core_base.mk

PRODUCT_BOOT_JARS := core:conscrypt:okhttp:core-junit:bouncycastle:ext:framework:framework2:telephony-common:voip-common:mms-common:android.policy:services:apache-xml:webviewchromium
  • 1

小節

通過上面的分析,我們知道BOOTCLASSPATH的賦值其實是通過PRODUCT_BOOT_JARS來的。如果我們想添加自定義的jar包,我們只需要在PRODUCT_BOOT_JARS添加相應的jar就行了。

實戰操作

1.將相關自定義的java文件編譯到自定義模塊

Android.mk

LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS)LOCAL_SRC_FILES := \$(call all-java-files-under, java) \LOCAL_MODULE:= custom LOCAL_MODULE_TAGS := optional# List of classes and interfaces which should be loaded by the Zygote. include $(BUILD_JAVA_LIBRARY)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

這樣我們自定義的custom.jar就會被編譯到/system/framework/custom.jar中。

2.將自定義模塊編譯到系統中

接下來我們需要系統在編譯的時候能將custom.jar模塊編譯到系統中。我們需要添加如下代碼:

device/xxx/yyy.mk

PRODUCT_PACKAGES += custom
  • 1

3.在PRODUCT_BOOT_JARS中添加自定義模塊

build/target/product/core_base.mk

PRODUCT_BOOT_JARS := core:conscrypt:okhttp:core-junit:bouncycastle:ext:framework:framework2:telephony-common:voip-common:mms-common:android.policy:services:apache-xml:webviewchromium:custom
  • 1

通過上面的3步,就可以將custom.jar編譯到/system/framewrok/custom.jar中。同時,在BOOTCLASSPATH中也添加了custom.jar。

4.驗證BOOTCLASSPATH是否添加了自定義模塊

在PC端使用adb shell $BOOTCLASSPATH就可以查看BOOTCLASSPATH的值了。

C:\Users\Steven>adb shell $BOOTCLASSPATH /system/bin/sh: /system/framework/core.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/framework2.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/mms-common.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/system/framework/apache-xml.jar:/system/framework/webviewchromium.jar:/system/framework/custom.jar: not found
  • 1
  • 2

上面我們可以到custom.jar成功添加到了BOOTCLASSPATH中,大功告成!



總結

以上是生活随笔為你收集整理的Android BOOTCLASSPATH详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。