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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

build/envsetup.sh脚本分析

發(fā)布時間:2025/4/5 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 build/envsetup.sh脚本分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1. Android編譯系統(tǒng)分析 編譯腳本及系統(tǒng)變量 build/envsetup.sh腳本分析 在編譯源代碼之前通常需要在android源代碼頂層目錄執(zhí)行 . ./build/envsetup.sh 目的是為了使用 腳本 envsetup.sh 里面定義了一些函數(shù): function help() function get_abs_build_var() function get_build_var() function check_product() function check_variant() function setpaths() function printconfig() function set_stuff_for_environment() function set_sequence_number() function settitle() function choosetype() function chooseproduct() function choosevariant() function tapas() function choosecombo() function print_lunch_menu() function lunch() function gettop function m() function findmakefile() function mm() function mmm() function croot() function pid() function gdbclient() function jgrep() function cgrep() function resgrep() function getprebuilt function tracedmdump() function runhat() function getbugreports() function startviewserver() function stopviewserver() function isviewserverstarted() function smoketest() function runtest() function runtest_py() function godir ()choosecombo 命令分析: function choosecombo() { choosesim $1 echo echo choosetype $2echo echo chooseproduct $3echo echo choosevariant $4echo set_stuff_for_environment printconfig } 會依次進行如下選擇: Build for the simulator or the device? 1. Device 2. Simulator Which would you like? [1]Build type choices are: 1. release 2. debug Which would you like? [1]Product choices are: 1. emulator 2. generic 3. sim 4. littleton You can also type the name of a product if you know it. Which would you like? [littleton]Variant choices are: 1. user 2. userdebug 3. eng Which would you like? [eng] user 默認選擇以后會出現(xiàn): TARGET_PRODUCT=littleton TARGET_BUILD_VARIANT=user TARGET_SIMULATOR=false TARGET_BUILD_TYPE=release TARGET_ARCH=arm HOST_ARCH=x86 HOST_OS=linux HOST_BUILD_TYPE=release BUILD_ID= ========== function chooseproduct()函數(shù)分析: choices=(`/bin/ls build/target/board/*/BoardConfig.mk vendor/*/*/BoardConfig.mk 2> /dev/null`) 讀取 build/target/board/* 目錄下的板配置文件:BoardConfig.mk 讀取 vendor/*/*/目錄下的板配置文件:BoardConfig.mk choices 的值為: build/target/board/emulator/BoardConfig.mk build/target/board/generic/BoardConfig.mk build/target/board/sim/BoardConfig.mk vendor/marvell/littleton/BoardConfig.mk 經(jīng)過: for choice in ${choices[@]} do # The product name is the name of the directory containing # the makefile we found, above. prodlist=(${prodlist[@]} `dirname ${choice} | xargs basename`) done 的處理,prodlist的值為: emulator generic sim littleton 所以選擇菜單為: Product choices are: 1. emulator 2. generic 3. sim 4. littleton 如果選擇 4,那么 TARGET_PRODUCT 被賦值為: littleton。board_config_mk := / $(strip $(wildcard / $(SRC_TARGET_DIR)/board/$(TARGET_DEVICE)/BoardConfig.mk / vendor/*/$(TARGET_DEVICE)/BoardConfig.mk / ))怎樣添加一個模塊 LOCAL_PATH:= $(call my-dir) #編譯靜態(tài)庫 include $(CLEAR_VARS) LOCAL_MODULE = libhellos LOCAL_CFLAGS = $(L_CFLAGS) LOCAL_SRC_FILES = hellos.c LOCAL_C_INCLUDES = $(INCLUDES) LOCAL_SHARED_LIBRARIES := libcutils LOCAL_COPY_HEADERS_TO := libhellos LOCAL_COPY_HEADERS := hellos.h include $(BUILD_STATIC_LIBRARY)#編譯動態(tài)庫 include $(CLEAR_VARS) LOCAL_MODULE = libhellod LOCAL_CFLAGS = $(L_CFLAGS) LOCAL_SRC_FILES = hellod.c LOCAL_C_INCLUDES = $(INCLUDES) LOCAL_SHARED_LIBRARIES := libcutils LOCAL_COPY_HEADERS_TO := libhellod LOCAL_COPY_HEADERS := hellod.h include $(BUILD_SHARED_LIBRARY)BUILD_TEST=true ifeq ($(BUILD_TEST),true) #使用靜態(tài)庫 include $(CLEAR_VARS) LOCAL_MODULE := hellos LOCAL_STATIC_LIBRARIES := libhellos LOCAL_SHARED_LIBRARIES := LOCAL_LDLIBS += -ldl LOCAL_CFLAGS := $(L_CFLAGS) LOCAL_SRC_FILES := mains.c LOCAL_C_INCLUDES := $(INCLUDES) include $(BUILD_EXECUTABLE)#使用動態(tài)庫 include $(CLEAR_VARS) LOCAL_MODULE := hellod LOCAL_MODULE_TAGS := debug LOCAL_SHARED_LIBRARIES := libc libcutils libhellod LOCAL_LDLIBS += -ldl LOCAL_CFLAGS := $(L_CFLAGS) LOCAL_SRC_FILES := maind.c LOCAL_C_INCLUDES := $(INCLUDES) include $(BUILD_EXECUTABLE) endif # ifeq ($(WPA_BUILD_SUPPLICANT),true)######################## #local_target_dir := $(TARGET_OUT)/etc/wifi #include $(CLEAR_VARS) #LOCAL_MODULE := wpa_supplicant.conf #LOCAL_MODULE_TAGS := user #LOCAL_MODULE_CLASS := ETC #LOCAL_MODULE_PATH := $(local_target_dir) #LOCAL_SRC_FILES := $(LOCAL_MODULE) #include $(BUILD_PREBUILT) ######################## 系統(tǒng)變量解析 LOCAL_MODULE - 編譯的目標對象 LOCAL_SRC_FILES - 編譯的源文件 LOCAL_C_INCLUDES - 需要包含的頭文件目錄 LOCAL_SHARED_LIBRARIES - 鏈接時需要的外部庫 LOCAL_PRELINK_MODULE - 是否需要prelink處理 BUILD_SHARED_LIBRARY - 指明要編譯成動態(tài)庫LOCAL_PATH - 編譯時的目錄 $(call 目錄,目錄….) 目錄引入操作符 如該目錄下有個文件夾名稱 src,則可以這樣寫 $(call src),那么就會得到 src 目錄的完整路徑include $(CLEAR_VARS) -清除之前的一些系統(tǒng)變量 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk 在 build/core/config.mk 定義 CLEAR_VARS:= $(BUILD_SYSTEM)/clear_vars.mk 通過include 包含自定義的.mk文件(即是自定義編譯規(guī)則)或是引用系統(tǒng)其他的.mk文件(系統(tǒng)定義的編譯規(guī)則)。LOCAL_SRC_FILES - 編譯的源文件 可以是.c, .cpp, .java, .S(匯編文件)或是.aidl等格式 不同的文件用空格隔開。如果編譯目錄子目錄,采用相對路徑,如子目錄/文件名。也可以通過$(call 目錄),指明編譯某目錄 下所有.c/.cpp/.java/.S/ .aidl文件.追加文件 LOCAL_SRC_FILES += 文件LOCAL_C_INCLUDES - 需要包含的頭文件目錄 可以是系統(tǒng)定義路徑,也可以是相對路徑. 如該編譯目錄下有個include目錄,寫法是include/*.hLOCAL_SHARED_LIBRARIES - 鏈接時需要的外部共享庫 LOCAL_STATIC_LIBRA RIES - 鏈接時需要的外部外部靜態(tài) LOCAL_JAVA_LIBRARIES 加入jar包LOCAL_MODULE - 編譯的目標對象 module 是指系統(tǒng)的 native code,通常針對c,c++代碼 ./system/core/sh/Android.mk:32:LOCAL_MODULE:= sh ./system/core/libcutils/Android.mk:71:LOCAL_MODULE := libcutils ./system/core/cpio/Android.mk:9:LOCAL_MODULE := mkbootfs ./system/core/mkbootimg/Android.mk:8:LOCAL_MODULE := mkbootimg ./system/core/toolbox/Android.mk:61:LOCAL_MODULE:= toolbox ./system/core/logcat/Android.mk:10:LOCAL_MODULE:= logcat ./system/core/adb/Android.mk:65:LOCAL_MODULE := adb ./system/core/adb/Android.mk:125:LOCAL_MODULE := adbd ./system/core/init/Android.mk:20:LOCAL_MODULE:= init ./system/core/vold/Android.mk:24:LOCAL_MODULE:= vold ./system/core/mountd/Android.mk:13:LOCAL_MODULE:= mountdLOCAL_PACKAGE_NAME Java 應(yīng)用程序的名字用該變量定義 ./packages/apps/Music/Android.mk:9:LOCAL_PACKAGE_NAME := Music ./packages/apps/Browser/Android.mk:14:LOCAL_PACKAGE_NAME := Browser ./packages/apps/Settings/Android.mk:8:LOCAL_PACKAGE_NAME := Settings ./packages/apps/Stk/Android.mk:10:LOCAL_PACKAGE_NAME := Stk ./packages/apps/Contacts/Android.mk:10:LOCAL_PACKAGE_NAME := Contacts ./packages/apps/Mms/Android.mk:8:LOCAL_PACKAGE_NAME := Mms ./packages/apps/Camera/Android.mk:8:LOCAL_PACKAGE_NAME := Camera ./packages/apps/Phone/Android.mk:11:LOCAL_PACKAGE_NAME := Phone ./packages/apps/VoiceDialer/Android.mk:8:LOCAL_PACKAGE_NAME := VoiceDialerBUILD_SHARED_LIBRARY - 指明要編譯成動態(tài)庫。 編譯的目標,用include 操作符 UILD_STATIC_LIBRARY來指明要編譯成靜態(tài)庫。 如果是java文件的話,會用到系統(tǒng)的編譯腳本host_java_library.mk,用BUILD_PACKAGE來指明。三個編譯 ------------------- include $(BUILD_STATIC_LIBRARY) BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk ------------------- include $(BUILD_SHARED_LIBRARY) ./build/core/config.mk:50:BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk ------------------- include $(BUILD_HOST_SHARED_LIBRARY) BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk ------------------- include $(BUILD_EXECUTABLE) build/core/config.mk:51:BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk ------------------- include $(BUILD_HOST_EXECUTABLE) ./build/core/config.mk:53:BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk ------------------- BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk ------------------- BUILD_JAVA_LIBRARY ./build/core/config.mk:58:BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk ------------------ BUILD_STATIC_JAVA_LIBRARY 編譯靜態(tài)JAVA庫 ./build/core/config.mk:59:BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk ------------------ BUILD_HOST_JAVA_LIBRARY 編譯本機用的JAVA庫 ./build/core/config.mk:60:BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk ------------------BUILD_HOST_STATIC_LIBRARY:= $(BUILD_SYSTEM)/host_static_library.mk BUILD_HOST_SHARED_LIBRARY:= $(BUILD_SYSTEM)/host_shared_library.mk BUILD_STATIC_LIBRARY:= $(BUILD_SYSTEM)/static_library.mk BUILD_RAW_STATIC_LIBRARY := $(BUILD_SYSTEM)/raw_static_library.mk BUILD_SHARED_LIBRARY:= $(BUILD_SYSTEM)/shared_library.mk BUILD_EXECUTABLE:= $(BUILD_SYSTEM)/executable.mk BUILD_RAW_EXECUTABLE:= $(BUILD_SYSTEM)/raw_executable.mk BUILD_HOST_EXECUTABLE:= $(BUILD_SYSTEM)/host_executable.mk BUILD_PACKAGE:= $(BUILD_SYSTEM)/package.mk BUILD_HOST_PREBUILT:= $(BUILD_SYSTEM)/host_prebuilt.mk BUILD_PREBUILT:= $(BUILD_SYSTEM)/prebuilt.mk BUILD_MULTI_PREBUILT:= $(BUILD_SYSTEM)/multi_prebuilt.mk BUILD_JAVA_LIBRARY:= $(BUILD_SYSTEM)/java_library.mk BUILD_STATIC_JAVA_LIBRARY:= $(BUILD_SYSTEM)/static_java_library.mk BUILD_HOST_JAVA_LIBRARY:= $(BUILD_SYSTEM)/host_java_library.mk BUILD_DROIDDOC:= $(BUILD_SYSTEM)/droiddoc.mk BUILD_COPY_HEADERS := $(BUILD_SYSTEM)/copy_headers.mk BUILD_KEY_CHAR_MAP := $(BUILD_SYSTEM)/key_char_map.mk============ LOCAL_PRELINK_MODULE Prelink利用事先鏈接代替運行時鏈接的方法來加速共享庫的加載,它不僅可以加快起動速度,還可以減少部分內(nèi)存開銷, 是各種Linux架構(gòu)上用于減少程序加載時間、縮短系統(tǒng)啟動時間和加快應(yīng)用程序啟動的很受歡迎的一個工具。程序運行時的 動態(tài)鏈接尤其是重定位(relocation)的開銷對于大型系統(tǒng)來說是很大的。 動態(tài)鏈接和加載的過程開銷很大,并且在大多數(shù)的系統(tǒng)上, 函數(shù)庫并不會常常被更動, 每次程序被執(zhí)行時所進行的鏈接 動作都是完全相同的,對于嵌入式系統(tǒng)來說尤其如此。因此,這一過程可以改在運行時之前就可以預(yù)先處理好,即花一些時間 利用Prelink工具對動態(tài)共享庫和可執(zhí)行文件進行處理,修改這些二進制文件并加入相應(yīng)的重定位等信息,節(jié)約了本來在程序 啟動時的比較耗時的查詢函數(shù)地址等工作,這樣可以減少程序啟動的時間,同時也減少了內(nèi)存的耗用。 Prelink的這種做法當然也有代價:每次更新動態(tài)共享庫時,相關(guān)的可執(zhí)行文件都需要重新執(zhí)行一遍Prelink才能保 證有效,因為新的共享庫中的符號信息、地址等很可能與原來的已經(jīng)不同了,這就是為什么 android framework代碼一改動, 這時候就會導(dǎo)致相關(guān)的應(yīng)用程序重新被編譯。 這種代價對于嵌入式系統(tǒng)的開發(fā)者來說可能稍微帶來一些復(fù)雜度,不過好在對用戶來說幾乎是可以忽略的。 -------------------- 變量設(shè)置為false那么將不做prelink操作 LOCAL_PRELINK_MODULE := false 默認是需要prlink的,同時需要在 build/core/prelink-linux-arm.map 中加入 libhellod.so 0x96000000 這個map文件好像是制定動態(tài)庫的地址的,在前面注釋上面有一些地址范圍的信息,注意庫與庫之間的間隔數(shù), 如果指定不好的話編譯的時候會提示說地址空間沖突的問題。另外,注意排序,這里要把數(shù)大的放到前面去, 按照大小降序排序。 解析 LOCAL_PRELINK_MODULE 變量 build/core/dynamic_binary.mk:94:ifeq ($(LOCAL_PRELINK_MODULE),true) ifeq ($(LOCAL_PRELINK_MODULE),true) $(prelink_output): $(prelink_input) $(TARGET_PRELINKER_MAP) $(APRIORI) $(transform-to-prelinked) transform-to-prelinked定義: ./build/core/definitions.mk:1002:define transform-to-prelinked define transform-to-prelinked @mkdir -p $(dir $@) @echo "target Prelink: $(PRIVATE_MODULE) ($@)" $(hide) $(APRIORI) / --prelinkmap $(TARGET_PRELINKER_MAP) / --locals-only / --quiet / {1}lt; / --output $@ endef ./build/core/config.mk:183:APRIORI := $(HOST_OUT_EXECUTABLES)/apriori$(HOST_EXECUTABLE_SUFFIX) prelink工具不是常用的prelink而是apriori,其源代碼位于” <your_android>/build/tools/apriori” 參考文檔: 動態(tài)庫優(yōu)化——Prelink(預(yù)連接)技術(shù) http://www.eefocus.com/article/09-04/71629s.html=============== LOCAL_ARM_MODE := arm 目前Android大部分都是基于Arm處理器的,Arm指令用兩種模式Thumb(每條指令兩個字節(jié))和arm指令(每條指令四個字節(jié))LOCAL_CFLAGS += -O3 -fstrict-aliasing -fprefetch-loop-arrays 通過設(shè)定編譯器操作,優(yōu)化級別,-O0表示沒有優(yōu)化,-O1為缺省值,-O3優(yōu)化級別最高 LOCAL_CFLAGS += -W -Wall LOCAL_CFLAGS += -fPIC -DPIC LOCAL_CFLAGS += -O2 -g -DADB_HOST=1 -Wall -Wno-unused-parameter LOCAL_CFLAGS += -D_XOPEN_SOURCE -D_GNU_SOURCE -DSH_HISTORY LOCAL_CFLAGS += -DUSEOVERLAY2 根據(jù)條件選擇相應(yīng)的編譯參數(shù) ifeq ($(TARGET_ARCH),arm) LOCAL_CFLAGS += -DANDROID_GADGET=1 LOCAL_CFLAGS := $(PV_CFLAGS) endif ifeq ($(TARGET_BUILD_TYPE),release) LOCAL_CFLAGS += -O2 endifLOCAL_LDLIBS := -lpthread LOCAL_LDLIBS += -ldlifdef USE_MARVELL_MVED LOCAL_WHOLE_STATIC_LIBRARIES += lib_il_mpeg4aspdecmved_wmmx2lnx lib_il_h264decmved_wmmx2lnx LOCAL_SHARED_LIBRARIES += libMrvlMVED else LOCAL_WHOLE_STATIC_LIBRARIES += lib_il_h264dec_wmmx2lnx lib_il_mpeg4aspdec_wmmx2lnx endif ====================

轉(zhuǎn)載于:https://www.cnblogs.com/yuzaipiaofei/archive/2011/07/25/4124503.html

《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的build/envsetup.sh脚本分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 动漫美女露胸网站 | 亚洲人在线播放 | 特级特黄aaaa免费看 | 日韩不卡视频在线 | 欧美成人精品激情在线视频 | 熟女高潮一区二区三区 | 粉嫩av网址| 中文字幕av一区二区三区人妻少妇 | 欧美日韩亚洲另类 | 91视频精选 | 国产精品久久久久久久久动漫 | 3o一40一50一6o女人毛片 | 国产videos| 美女扒开粉嫩尿口 | 一本色道久久综合亚洲精品酒店 | 天天摸日日摸 | 国产综合亚洲精品一区二 | 韩国精品视频在线观看 | 亚洲激情综合 | 欧洲一级黄 | 亚洲精品在线不卡 | 欧美hdse | 69精品人妻一区二区三区 | 久久久国产成人一区二区三区 | 亚洲色图在线播放 | 精品国产91久久久久久 | 欧美高清成人 | 欧美黄色片网站 | 欧美人成在线 | 欧美黄色一区二区 | 色女人天堂 | 亚洲国产一区在线观看 | 日韩一区二区av | 欧美不卡在线 | 日本第一页 | 朝桐光在线观看 | 91黄色入口 | 成人污污www网站免费丝瓜 | 国内精品在线观看视频 | 亚洲videos| 亚洲AV无码一区二区三区性 | 亚洲天堂三区 | 中文字幕免费高清网站 | 九九热久久免费视频 | 91狠狠爱 | 国产成人精品一区二 | 色妞干网 | 天天色成人 | 97国产资源| 欧美日韩国产精品一区二区 | 这里只有精品6 | 日本精品在线视频 | 先锋资源av在线 | 成人午夜淫片免费观看 | 成人免费毛片色戒 | 亚洲美女av在线 | www.rihan | 日本国产在线观看 | 五月天开心激情 | 真人抽搐一进一出视频 | 久久久久人妻一区精品色 | 色拍拍视频 | 欧美福利影院 | 九九爱精品视频 | 中日韩免费视频 | 久久伊人成人网 | 日本一区二区三区精品视频 | 久久噜噜噜精品国产亚洲综合 | 韩国成人理伦片免费播放 | 都市激情 自拍偷拍 | 用我的手指扰乱你 | 九九热视频在线播放 | 国产玖玖视频 | 黑料视频在线观看 | 亚洲国产精品一区二区三区 | 日本wwwwww| 91丝袜美女 | 深夜福利亚洲 | 91看毛片 | 日韩中文字幕电影 | 亚洲激情a| 婷婷激情四射 | 美女网站在线免费观看 | 亚洲天堂免费视频 | 亚洲国产中文在线 | 国产日韩欧美日韩大片 | 波多野结衣久久久久 | 欧美精品一区二区性色a+v | xxxwww黄色| 午夜偷拍福利视频 | 亚洲宗人网 | 亚洲精品乱码久久久久久蜜桃动漫 | 99免费视频 | 日韩精品欧美激情 | 一区二区三区黄色片 | 国产黑丝av | 精品视频一区二区三区在线观看 | 绿帽在线 | jizz18欧美18 |