Android源碼分析(一)-----如何快速掌握Android編譯文件

来源:https://www.cnblogs.com/ljx646566715/archive/2019/05/20/10893807.html
-Advertisement-
Play Games

一 : Android.mk文件概述 主要向編譯系統指定相應的編譯規則。會被解析一次或多次。因此儘量減少源碼中聲明變數,因為這些變數可能會被多次定義從而影響到後面的解析。這個文件的語法會把源代碼組織成模塊,每個模塊屬於下列類型之一: 二 : 系統變數 三 : mk文件模板 編譯C/C++應用程式的模 ...


一 : Android.mk文件概述

主要向編譯系統指定相應的編譯規則。會被解析一次或多次。因此儘量減少源碼中聲明變數,因為這些變數可能會被多次定義從而影響到後面的解析。這個文件的語法會把源代碼組織成模塊,每個模塊屬於下列類型之一:

- APK程式:一般的Android程式,編譯打包生成apk文件。
- JAVA庫:java類庫,編譯打包生成jar包文件。
- C\C++應用程式:可執行的C/C++應用程式。
- C\C++靜態庫:編譯生產C/C++靜態庫,並打包成.a文件。
- C\C++共用庫:編譯生成共用庫,並打包成.so文件,有且只有共用庫才能被安裝/複製到APK包中。

二 : 系統變數

- LOCAL_PATH:這個變數用於給出當前文件的路徑,必須在Android.mk的開頭定義,可以這樣使用LOCAL_PATH := $(call my-dir),這樣這個變數不會被$(CLEAR_VARS)清除,因為每個Android.mk只需要定義一次(即使一個文件中定義了多個模塊的情況下)。
- LOCAL_SRC_FILES:當前模塊包含的所有源代碼文件。
- LOCAL_MODULE:當前模塊的名稱,這個名稱應當是唯一的,並且不能包含空格。模塊間的依賴關係就是通過這個名稱來引用的。
- LOCAL_MODULE_CLASS:標識所編譯模塊最後放置的位置。ETC表示放置在/system/etc.目錄下,APPS表示放置在/system/app目錄下,SHARED_LIBRARIES表示放置在/system/lib目錄下。如果具體指定,則編譯的模塊不會放到編譯系統中,最後會在out對應product的obj目錄下的對應目錄中。
- LOCAL_SRC_FILES:這是要編譯的源代碼文件列表。只要列出要傳遞給編譯器的文件即可,編譯系統會自動計算依賴關係。源代碼文件路徑都是相相對於LOCAL_PATH的,因此可以使用相對路徑進行描述。
- LOCAL_JAVA_LIBRARIES:當前模塊依賴的Java共用庫,也叫Java動態庫。例如framework.jar包。
- LOCAL_STATIC_JAVA_LIBRARIES:當前模塊依賴的Java靜態庫,在Android里,導入的jar包和引用的第三方工程都屬於Java靜態庫。
- LOCAL_STATIC_LIBRARIES:當前模塊在運行時依賴的靜態庫的名稱。
- LOCAL_SHARED_LIBRARIES:當前模塊在運行時依賴的動態庫的名稱。
- LOCAL_C_INCLUDES:c或c++語言需要的頭文件的路徑。
- LOCAL_CFLAGS:提供給C/C++編譯器的額外編譯參數。
- LOCAL_PACKAGE_NAME:當前APK應用的名稱。
- LOCAL_CERTIFICATE:簽署當前應用的證書名稱。
- LOCAL_MODULE_TAGS:當前模塊所包含的標簽,一個模塊可以包含多個標簽。標簽的值可能是eng、user、debug、development、optional。其中,optional是預設標簽。
- LOCAL_DEX_PREOPT:apk的odex優化開關,預設是false。

三 : mk文件模板

  • 編譯C/C++應用程式的模板:
     #Test Exe
     LOCAL_PATH := $(call my-dir)
     include $(CLEAR_VARS)
     LOCAL_SRC_FILES:= main.c
     LOCAL_MODULE:= test_exe
     #LOCAL_C_INCLUDES :=
     #LOCAL_STATIC_LIBRARIES :=
     #LOCAL_SHARED_LIBRARIES :=
     include $(BUILD_EXECUTABLE)

BUILD_EXECUTABLE表示以一個可執行程式的方式進行編譯。補充說明:include $(BUILD_PACKAGE)則是編譯出一個apk,include $(BUILD_STATIC_JAVA_LIBRARY)則是編譯出jar包。

  • 編譯靜態庫的模板:
    `#Test Static Lib
     LOCAL_PATH := $(call my-dir)
     include $(CLEAR_VARS)
     LOCAL_SRC_FILES:= /
               helloworld.c
     LOCAL_MODULE:= libtest_static
     #LOCAL_C_INCLUDES :=
     #LOCAL_STATIC_LIBRARIES :=
     #LOCAL_SHARED_LIBRARIES :=
     include $(BUILD_STATIC_LIBRARY)

一般的和上面相似,BUILD_STATIC_LIBRARY表示編譯一個靜態庫.a文件。靜態庫不會複製到的APK包中,但是能夠用於編譯共用庫。

  • 編譯動態庫的模板:
     #Test Shared Lib
     LOCAL_PATH := $(call my-dir)
     include $(CLEAR_VARS)
     LOCAL_SRC_FILES:= /
               helloworld.c
     LOCAL_MODULE:= libtest_shared
     TARGET_PRELINK_MODULES := false
     #LOCAL_C_INCLUDES :=
     #LOCAL_STATIC_LIBRARIES :=
     #LOCAL_SHARED_LIBRARIES :=
      include $(BUILD_SHARED_LIBRARY)

一般的和上面相似,BUILD_SHARED_LIBRARY表示編譯一個動態庫。
以上三者的生成結果分別在如下,generic依具體target會變:
out/target/product/generic/obj/EXECUTABLE
out/target/product/generic/obj/STATIC_LIBRARY
out/target/product/generic/obj/SHARED_LIBRARY

每個模塊的目標文件夾分別為:
可執行程式:XXX_intermediates
靜態庫: XXX_static_intermediates
動態庫: XXX_shared_intermediates

另外,在Android.mk文件中,還可以指定最後的目標安裝路徑,用LOCAL_MODULE_PATH和LOCAL_UNSTRIPPED_PATH來指定。不同的文件系統路徑用以下的巨集進行選擇:

- TARGET_ROOT_OUT:表示根文件系統out/target/product/xxxxx/root。
- TARGET_OUT:表示system文件系統out/target/product/xxxx/system。
- TARGET_OUT_DATA:表示data文件系統out/target/product/xxxx/data。
- TARGET_OUT_SHARED_LIBRARIES:表示out/target/product/xxxx/system/lib
- TARGET_OUT_APPS:表示out/target/product/xxxx/system/app
- ANDROID_PRODUCT_OUT:out/target/product/xxxx/
- TARGET_OUT_JAVA_LIBRARIES:out/target/product/xxxx/system/framework

四 : 常用函數

- $(call my-dir):獲取當前文件夾的路徑。
- $(call all-java-files-under, <src>):獲取指定目錄下的所有java文件。
- $(call all-c-files-under, <src>):獲取指定目錄下的所有c文件。
- $(call all-Iaidl-files-under, <src>):獲取指定目錄下的所有AIDL文件。
- $(call all-makefiles-under, <folder>):獲取指定目錄下的所有Make文件。
- $(call intermediates-dir-for, <class>, <app_name>, <host or target>, <common?>):獲取Build輸入的目標文件夾路徑。

五 : Settings模塊Android.mk文件分析

# 當前文件的路徑
LOCAL_PATH:= $(call my-dir)
# 清除變數
include $(CLEAR_VARS)

# 列舉所有需要編譯的源文件
LOCAL_SRC_FILES := \
        $(call all-logtags-files-under, src)

# 模塊名稱--唯一
LOCAL_MODULE := settings-logtags

#依賴的java靜態庫
include $(BUILD_STATIC_JAVA_LIBRARY)

# Build the Settings APK
include $(CLEAR_VARS)

#依賴的java庫
LOCAL_JAVA_LIBRARIES := bouncycastle core-oj telephony-common ims-common
#依賴的jar包,包括系統的和第三方的(放在libs目錄)jar包
LOCAL_STATIC_JAVA_LIBRARIES := \
    android-support-v4 \
    android-support-v13 \
    android-support-v7-recyclerview \
    android-support-v7-preference \
    android-support-v7-appcompat \
    android-support-v14-preference \
    jsr305 \
    settings-logtags
    
#user: 指該模塊只在user版本下才編譯
#eng: 指該模塊只在eng版本下才編譯
#tests: 指該模塊只在tests版本下才編譯
#optional:指該模塊在所有版本下都編譯
LOCAL_MODULE_TAGS := optional

#列舉所有需要編譯的源文件
LOCAL_SRC_FILES := \
        $(call all-java-files-under, src)

#列舉所有需要的資源文件夾
LOCAL_RESOURCE_DIR := $(LOCAL_PATH)/res \
    frameworks/support/v7/preference/res \
    frameworks/support/v14/preference/res \
    frameworks/support/v7/appcompat/res \
    frameworks/support/v7/recyclerview/res

#打包成apk的名稱--包名
LOCAL_PACKAGE_NAME := Settings

#用於指定簽名時使用的KEY
LOCAL_CERTIFICATE := platform

#編譯後在ROM中的安裝位置
#true,安裝位置為system/priv-app
#false,安裝位置為system/app
LOCAL_PRIVILEGED_MODULE := true

#混淆文件名
LOCAL_PROGUARD_FLAG_FILES := proguard.flags

LOCAL_AAPT_FLAGS := --auto-add-overlay \
    --extra-packages android.support.v7.preference:android.support.v14.preference:android.support.v17.preference:android.support.v7.appcompat:android.support.v7.recyclerview

ifneq ($(INCREMENTAL_BUILDS),)
    LOCAL_PROGUARD_ENABLED := disabled
    LOCAL_JACK_ENABLED := incremental
    LOCAL_DX_FLAGS := --multi-dex
    LOCAL_JACK_FLAGS := --multi-dex native
endif

#包含的其他mk文件
include frameworks/opt/setupwizard/library/common-full-support.mk
include frameworks/base/packages/SettingsLib/common.mk

#打包成apk
include $(BUILD_PACKAGE)

# Use the following include to make our test apk.
ifeq (,$(ONE_SHOT_MAKEFILE))
#獲取當前目錄下的所有Make文件
include $(call all-makefiles-under,$(LOCAL_PATH))
endif

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • SQL Server 2017的Linked Server配置觸發的bug“Exception Code = c0000005 EXCEPTION_ACCESS_VIOLATION” 現象描述: 資料庫版本:SQL Server 2017 (RTM-CU14) (KB4484710) - 14.0.... ...
  • 從sys.objects對象表中,可以獲取當前資料庫所有觸發器: SELECT * FROM sys.objects WHERE [type] = 'tr' ...
  • 關係運算 關係代數 關係代數的基本操作 並 使用條件:兩個關係滿足並相容性 操作結果:將兩個關係合併,並刪除重覆的元組 差 使用條件:兩個關係滿足並相容性 操作結果:R-S產生一個元組在R中但不在S中的關係 笛卡爾積 操作結果:RxS表示將R與S中所有元組拼接的可能。 選擇 操作結果:選擇出滿足條件 ...
  • caement Archaic spelling of cement. caement Alternative forms[edit] caement (archaic) cæment (archaic) Hyphenation: cement Noun cement (countable and ...
  • 最近準備對之前學習SQL Loader的筆記進行整理,希望通過官方文檔中的示例學習(Case Studies)來進行,但是官方文檔中示例學習相關的腳本文件在資料庫軟體安裝完成之後預設並沒有提供,而是整合在另外一個安裝介質中,需通過安裝Oracle Examples介質來獲取相應的示例學習腳本。 數據 ...
  • 本例實現動態表名,列名,輸入參數,輸出參數等進行操作。 先準備一些數據: IF OBJECT_ID('tempdb.dbo.#Part') IS NOT NULL DROP TABLE #Part CREATE TABLE #Part ( [ID] INT, [Item] NVARCHAR(40), ...
  • 一、手機界面UI渲染顯示流程 二、16ms原則 三、造成卡頓的原因 四、過度繪製介紹、檢測工具、如何避免造成過度繪製造成的卡頓 ...
  • 一 :Bluetooth 的設置應用 packages\apps\Settings\src\com\android\settings\bluetooth\ 藍牙設置應用及設置參數,藍牙狀態,藍牙設備等。 BluetoothDevicePreference.java 顧名思義,藍牙設備首選項,也就是藍 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...