1. 程式人生 > >【Android7.1.2原始碼解析系列】android init目錄下的Android.mk編譯檔案分析

【Android7.1.2原始碼解析系列】android init目錄下的Android.mk編譯檔案分析

上一篇文章對於原始碼中的安卓編譯系統文件進行了翻譯,本文就以android當中的init模組作為例子,對其中的Android.mk檔案進行分析,讀者可以在閱讀本文的同時檢視我的譯文:http://blog.csdn.net/class_brick/article/details/70859809。

總的來說,init模組中的Android.mk檔案主要進行了 個流程的操作:

1、設定本模組名稱

2、清理LOCAL_變數

3、設定LOCAL_變數,包括編譯的內容、方式、選項等

4、執行編譯

5、設定其他模組對於init的聯絡並編輯

以上前四步是Android.mk檔案的通常流程,在閱讀其他檔案時,也可以按照這樣的思路。

檔案位於/system/core/init/檔案不大,只有75行:

# Copyright 2005 The Android Open Source Project

#第一行,為LOCAL_PATH進行賦值,實際上的值就是當前Android.mk所在的目錄,即為#/system/core/init/

LOCAL_PATH:= $(call my-dir)

#第二行,清除除了LOCAL_PATH之外的所有LOCAL_字首的變數

include $(CLEAR_VARS)

#第三行,對於LOCAL_SRC_FILES進行賦值,指定需要編譯的.cpp/.c/.y/.l/.java檔案

LOCAL_SRC_FILES:= \

builtins.c \

init.c \

devices.c \

property_service.c \

util.c \

parser.c \

keychords.c \

signal_handler.c \

init_parser.c \

ueventd.c \

ueventd_parser.c \

watchdogd.c

#第四行,對於LOCAL_CFLAGS進行賦值,指定c/c++編譯器的額外標籤,相當於在編譯時執

#gcc *.c -Wno-unused-parameter,作用是忽略未使用引數的警告

LOCAL_CFLAGS    += -Wno-unused-parameter

#第五行,如果INIT_BOOTCHART的值為true,就編譯bootchart.c與加入編譯命令#-DBOOTCHART=1bootchart的作用是對android的開機效能進行分析,預設是關閉的

ifeq ($(strip $(INIT_BOOTCHART)),true)

LOCAL_SRC_FILES += bootchart.c

LOCAL_CFLAGS    += -DBOOTCHART=1

endif

#第六行,如果編譯目標是userdebug或者eng,就加入編譯選項允許設定selinux的開關

ifneq (,$(filter userdebug eng,$(TARGET_BUILD_VARIANT)))

LOCAL_CFLAGS += -DALLOW_LOCAL_PROP_OVERRIDE=1 -DALLOW_DISABLE_SELINUX=1

endif

# Enable ueventd logging

# 第七行,直譯,允許ueventd記錄日誌

#LOCAL_CFLAGS += -DLOG_UEVENTS=1

# 第八行,設定本模組的名稱為init

LOCAL_MODULE:= init

# 第九行,設定init模組可以被靜態連結

LOCAL_FORCE_STATIC_EXECUTABLE := true

# 第十行,將編譯後的此模組放到TARGET_ROOT_OUT目錄下,TARGET_ROOT_OUT的值在編譯時的

# envsetup.sh指令碼中被設定,值為out/target/product/xxx/root

LOCAL_MODULE_PATH := $(TARGET_ROOT_OUT)

# 第十一行,編譯後的沒有經過符號剝離的目標路徑

LOCAL_UNSTRIPPED_PATH := $(TARGET_ROOT_OUT_UNSTRIPPED)

# 第十二行,init模組需要的靜態庫列表

LOCAL_STATIC_LIBRARIES := \

libfs_mgr \

liblogwrap \

libcutils \

liblog \

libc \

libselinux \

libmincrypt \

libext4_utils_static \

libsparse_static \

libz

# 第十三行,額外的依賴項,表示必須該目錄下必須存在Android.mk檔案(悖論?)

LOCAL_ADDITIONAL_DEPENDENCIES += $(LOCAL_PATH)/Android.mk

# 第十四行,將init模組編譯成可執行檔案

include $(BUILD_EXECUTABLE)

# Make a symlink from /sbin/ueventd and /sbin/watchdogd to /init

# 第十五行,直譯,設定/sbin/ueventd/sbin/watchdogd/init的符號連結

SYMLINKS := \

$(TARGET_ROOT_OUT)/sbin/modprobe \

$(TARGET_ROOT_OUT)/sbin/ueventd \

$(TARGET_ROOT_OUT)/sbin/watchdogd

# 這裡涉及到makefile檔案的語法,簡單的描述一下, 通常的形式是:

# 變數1 : 變數2

# 命令

# 含義:

# 代表變數1的生成需要變數2,如果變數2中的內容有任何一個比變數1要新的話

# 就執行命令中的內容

# 所以接下來的含義就是SYMLINKS中的內容將會依賴於init模組

# 並在init模組更新之後執行接下來的四行命令

$(SYMLINKS): INIT_BINARY := $(LOCAL_MODULE)

$(SYMLINKS): $(LOCAL_INSTALLED_MODULE) $(LOCAL_PATH)/Android.mk

@echo "Symlink: [email protected] -> ../$(INIT_BINARY)"

@mkdir -p $(dir [email protected])

@rm -rf [email protected]

$(hide) ln -sf ../$(INIT_BINARY) [email protected]

ALL_DEFAULT_INSTALLED_MODULES += $(SYMLINKS)

# We need this so that the installed files could be picked up based on the

# local module name

# 第十六行,直譯,我們需要通過這個來基於init模組名稱的找到已安裝檔案

ALL_MODULES.$(LOCAL_MODULE).INSTALLED := \

    $(ALL_MODULES.$(LOCAL_MODULE).INSTALLED) $(SYMLINKS)

相關推薦

Android7.1.2原始碼解析系列實戰分析init.rc檔案

實戰分析init.rc檔案 前言:經過上一篇的/system/core/init/readme.txt檔案的翻譯,對於init.rc的語法也有了一定的瞭解,這一篇就對/system/core/rootdir/init.rc檔案進行一個分析,希望能夠藉此對android的開

Android7.1.2原始碼解析系列android init目錄Android.mk編譯檔案分析

上一篇文章對於原始碼中的安卓編譯系統文件進行了翻譯,本文就以android當中的init模組作為例子,對其中的Android.mk檔案進行分析,讀者可以在閱讀本文的同時檢視我的譯文:http://blog.csdn.net/class_brick/article/detai

Spring Security Web 5.1.2 原始碼解析 -- HttpSessionSecurityContextRepository

Spring Security Web提供的類HttpSessionSecurityContextRepository是一個SecurityContextRepository介面的實現,用於在HttpSession中儲存安全上下文(security context),這樣屬於同一個Htt

Spring Security Config 5.1.2 原始碼解析 -- 工具類 AutowireBeanFactoryObjectPostProcessor

概述 Spring Security的配置機制會使用到很多物件,比如WebSecurity,ProviderManager,各個安全Filter等。這些物件的建立並不是通過bean定義的形式被容器發現和註冊進入容器的。而是由Spring Security配置機制使用Java new操

Spring Security Web 5.1.2 原始碼解析 -- 安全相關Filter清單

名稱 簡介 WebAsyncManagerIntegrationFilter TODO SecurityContextPersistenceFilter

Spring Security Web 5.1.2 原始碼解析 -- DefaultWebSecurityExpressionHandler 預設Web安全表示式處理器

概述 DefaultWebSecurityExpressionHandler是Spring Security Web用於Web安全表示式處理器(handler)。它會基於一組預設配置,和當時的環境,對指定的Web安全表示式求值。 DefaultWebSecurityExpress

Spring Security Web 5.1.2 原始碼解析 -- SessionManagementFilter

概述 該過濾器會檢測從當前請求處理開始到目前為止的過程中是否發生了使用者登入認證行為(比如這是一個使用者名稱/密碼錶單提交的請求處理過程),如果檢測到這一情況,執行相應的session認證策略(一個SessionAuthenticationStrategy),然後繼續繼續請求的處理。

Spring Security Web 5.1.2 原始碼解析 -- AnonymousAuthenticationFilter

概述 此過濾器過濾請求,檢測SecurityContextHolder中是否存在Authentication物件,如果不存在,說明使用者尚未登入,此時為其提供一個匿名Authentication物件:AnonymousAuthentication。 注意:在整個請求處理的

Spring Security Web 5.1.2 原始碼解析 -- RequestCacheAwareFilter

概述 Spring Security Web對請求提供了快取機制,如果某個請求被快取,它的提取和使用是交給RequestCacheAwareFilter完成的。 系統在啟動時,Spring Security Web會首先嚐試從容器中獲取一個RequestCache bean,獲取

Spring Security Web 5.1.2 原始碼解析 -- HttpSessionRequestCache

概述 Spring Security Web認證機制(通常指表單登入)中登入成功後頁面需要跳轉到原來客戶請求的URL。該過程中首先需要將原來的客戶請求快取下來,然後登入成功後將快取的請求從快取中提取出來。 針對該需求,Spring Security Web 提供了在http se

Spring Security Core 5.1.2 原始碼解析 -- PasswordEncoderFactories

概述 PasswordEncoderFactories是Spring Security建立DelegatingPasswordEncoder物件的工廠類。該工廠所建立的DelegatingPasswordEncoder預設使用bcrypt用於加密,並且能夠用於匹配以下幾種密碼型別 :

Spring Security Web 5.1.2 原始碼解析 -- RememberMeAuthenticationFilter

概述 預設情況下,如果安全配置開啟了Remember Me機制,使用者在登入介面上會看到Remember Me選擇框,如果使用者選擇了該選擇框,會導致生成一個名為remember-me,屬性httpOnly為true的cookie,其值是一個RememberMe token。

Spring Security Web 5.1.2 原始碼解析 -- DefaultLogoutPageGeneratingFilter

概述 DefaultLogoutPageGeneratingFilter用於生成一個預設的使用者退出登入頁面,預設情況下,當用戶請求為GET /logout時,該過濾器會起作用,生成並展示相應的使用者退出登入表單頁面。使用者點選其中的表單提交按鈕會提交使用者退出登入請求到POST /

Spring Security Web 5.1.2 原始碼解析 -- DefaultLoginPageGeneratingFilter

概述 當開發人員在安全配置中沒有配置登入頁面時,Spring Security Web會自動構造一個登入頁面給使用者。完成這一任務是通過一個過濾器來完成的,該過濾器就是DefaultLoginPageGeneratingFilter。 該過濾器支援兩種登入情景: 使用

Spring Security Web 5.1.2 原始碼解析 -- UsernamePasswordAuthenticationFilter

概述 該過濾器會攔截使用者請求,看它是否是一個來自使用者名稱/密碼錶單登入頁面提交的使用者登入認證請求,預設使用的匹配模式是:POST /login。預設情況下,如果是使用者登入認證請求,該請求就不會在整個filter chain中繼續傳遞了,而是會被當前過濾器處理並進入響應使用者階

Spring Security Web 5.1.2 原始碼解析 -- ExceptionTranslationFilter

概述 該過濾器的作用是處理過濾器鏈中發生的 AccessDeniedException 和 AuthenticationException 異常,將它們轉換成相應的HTTP響應。 當檢測到 AuthenticationException 異常時,該過濾器會啟動 authentic

Spring Security Web 5.1.2 原始碼解析 -- BasicAuthenticationFilter

概述 處理HTTP請求中的BASIC authorization頭部,把認證結果寫入SecurityContextHolder。 當一個HTTP請求中包含一個名字為Authorization的頭部,並且其值格式是Basic xxx時,該Filter會認為這是一個BASIC aut

java集合框架原始碼剖析系列java原始碼剖析之HashMap

前言:之所以打算寫java集合框架原始碼剖析系列部落格是因為自己反思了一下阿里內推一面的失敗(估計沒過,因為寫此部落格已距阿里巴巴一面一個星期),當時面試完之後感覺自己回答的挺好的,而且據面試官最後說的這幾天可能會和你聯絡來看當時以為自己一面應該是通過的,但是事與願違,痛定

jquery 1.7.2原始碼解析(二)構造jquery物件

構造jquery物件 jQuery物件是一個類陣列物件。 一)建構函式jQuery() 建構函式的7種用法:   1.jQuery(selector [, context ]) 傳入字串引數:檢查該字串是選擇器表示式還是HTML程式碼。如果是選擇器表示式,則遍歷文件查詢匹配的DOM元

USACO 1.2 Name That Number 解題報告

\(注意 該篇題解為本人較早時期寫的題解 所以會很傻 直接能用map 以string為下標偏偏要繞彎兒 有時間改一改QAQ\) [USACO1.2]Name That Number 題目描述 在威斯康辛州牛守志大農場經營者之中,都習慣於請會計部門用連續數字給母牛打上烙印。但是,母牛本身並沒感到這個系統的