Android系統模塊編譯調試與Ninja使用指南

模塊編譯調試方法

(此處舉例framework、installd、SystemUI等模塊的編譯調試,其他類似)

1. Framework模塊編譯

Android系統代碼的framework目錄內,一共有3個模塊單獨編譯:framework、services、framework-res.apk。

注意:偶爾會有改了代碼但沒檢測到,編譯結束后產物并未更新的情況,所以可以考慮先剪切掉原先的產物或者檢查產物更新時間確保已經重新編譯。

步驟

  1. 完成根目錄下 source build/envsetup.sh 命令、lunch qssi-userdebug-mars 命令(準備好編譯環境、選擇好編譯分支,才可以開始編譯)。
  2. 整編命令如 bash build.sh -j32 dist --qssi_only 2>&1 | tee buildlog.log
1.1 修改frameworks/base/core/res下的內容
  • 在執行 source build/envsetup.sh 命令的版本源代碼根目錄執行 make framework-res -j32
  • 產物位于 out/target/product/qssi/system/framework 下面(如 framework-res.apk 之類),push到手機的 /system/framework/ 下面重啟即可。
1.2 修改framework/base/services下的內容
  • 在執行 source build/envsetup.sh 命令的版本源代碼根目錄執行 make services -j32
  • 產物位于 out/target/product/qssi/system/framework 下面,拿出來push到手機的 /system/framework/ 下面重啟即可。
1.3 修改framework/base/core下的內容
  • 在執行 source build/envsetup.sh 命令的版本源代碼根目錄執行 make framework-minus-apex -j32
  • 產物位于 out/target/product/qssi/system/framework 下面,拿出來push到手機的 /system/framework/ 下面重啟即可。
  • 問題處理:如果卡在開機過程里(常在小于Android13版本中發生),而且不是自己原因導致而是一些AndroidRuntime錯誤導致的signal 6的內存錯誤,可嘗試在push framework.jaradb shell rm -rf system/framework/oat system/framework/arm system/framework/arm64 再重啟。
1.4 其他目錄下的代碼修改
  • 在framework/base下的其他很多目錄下的代碼修改也可以被編譯到,但需要自行確認:
    • 故意改錯去編譯。
    • 搜Android.bp文件內容看看framework-minus-apex library的srcs是否包含了被修改的文件。
1.5 作SDK
  • 如果是要make出jar包給apk調用而不是push到系統里調試,那要拿此目錄的jar包:out/target/common/obj/JAVA_LIBRARIES/framework-minus-apex_intermediates/classes.jar
  • 版本改動注意:在Android11之前修改了framework相關代碼,只需 make framework 就可以編譯出 framework.jar。在Android11,這個編譯命令不起作用了,根據framework/base/目錄下Android.bp中的提示,編譯命令需要改為 make framework-minus-apex

2. 修改frameworks/native/cmds/abcd的任意模塊代碼

  • 通過 make abcd -j32 編譯,比如 make installd -j16 make atrace -j16 等。
  • 產物位于 out/target/product/qssi/system/bin 下面,拿出來push到手機的 /system/bin/ 下面重啟即可。

3. 修改packages/modules/abcd的代碼

  • 通過找被修改文件屬于的同/上級目錄的Android.bp文件中哪個模塊內編譯,在此模塊library中找到apex_available標簽,即標識該library可以被name為xxxx的apex包進去,通過 make xxxx -j32 編譯。
  • 產物位于 out/target/product/qssi/system/apex/ 下面,拿出來push到手機的 /system/apex/ 下面重啟即可。
  • 示例:修改了 /packages/modules/Wifi/framework/java/android/net/wifi/WifiManager.java,那么在 /packages/modules/Wifi/framework/Android.bp 中找到 apex_available: ["com.android.wifi", "test_com.android.wifi"],就知道 make com.android.wifi -j16 可以編譯到被修改文件。

4. 改動SystemUI、Settings等模塊的代碼

  • 可以通過 make SystemUImake Settings 來進行編譯,產物在 /system/app/system/priv-app 下面,將結果apk直接install,然后重啟此應用相關服務,如直接重啟手機,或者如SystemUI在install后 adb shell am restart 也可以。
  • 注意:不要push已經存在的apk到手機,重啟系統不會掃描,新的apk不會重新安裝,測試效果將還是原先的效果,除非此系統apk可以先刪掉重啟再push再重啟。

5. 通用編譯模塊的方法

  • 如修改位于 framework/native/services 下的文件,可以通過在同級或上級目錄中的Android.bp文件內容中查找修改的文件名字或具體目錄,來找到所屬sources,再逐級向上找到被編譯進哪個“name”的目標產物xxx中,再 make xxx -j32 對其編譯。
  • 如果xxx編譯出的產物是中間產物或手機中沒有的無法替換的產物可以再向上查找更大name的目標產物xxxx(如:cc_library_shared、cc_library、java_library、apex_available等)進行編譯或直接push進system/lib和system/lib64重啟。

6. 編譯system.img

  • 當你確定修改的內容能在編譯system.img時帶入,可以使用 make systemimage -j16 編譯。通過進入fastboot模式后刷system.img進行生效。

編譯調試注意點

  1. 編譯最好把已經生成的先刪掉,不然有可能文件不更新(push前check下文件的生成時間)。
  2. 編譯終端最后提示的生成路徑不一定是唯一生成路徑,同級目錄、對稱lib或lib64目錄里可能都有你需要的生成物。library要把生成的庫文件在system/lib和system/lib64下都做相應的push。
  3. 如果是push替換庫文件,最好留一個原本的備份避免push了開不了機器。
  4. 編譯調試的時候如果是自己陌生的模塊,建議每次都加行特殊log以確認自己的修改已經生效。

二、使用ninja替代make進行快速編譯

為什么要使用ninja?

通常使用make編譯會有兩個階段:

  1. 先分析Android.bp,將所有需要參與編譯的文件的路徑都記錄下,writing build rules并打包到 out/soong/combined-.ninja 中。(普遍耗時15-20min)
  2. 然后ninja工具通過第一步生成的文件,編譯要編譯的模塊。(不同模塊速度不同,比如services模塊只需要大約20s)

優點:直接使用ninja就可以省去第一部分耗時,尤其在反復編譯時調試效率提高。

注意點

  1. 進行ninja之前必須要先make一次(當然要想make必須先根目錄source和lunch一次),以生成路徑文件;如果你的修改增刪了模塊中文件的名字路徑,就必須重新make生成路徑文件。

ninja的獲取

cd到android系統源碼的根目錄下,執行
cp prebuilts/build-tools/linux-x86/bin/ninja out/host/linux-x86/bin/
cp prebuilts/build-tools/linux-x86/bin/ninja /usr/local/bin/
cp prebuilts/build-tools/linux-x86/bin/ninja /usr/bin/
ln -sf out/combined-***.ninja build.ninja

ninja文件內容

#!/bin/bash
ninja(){ninja_bin="$ANDROID_BUILD_TOP/prebuilts/build-tools/linux-x86/bin/ninja"ninja_build_file="$ANDROID_BUILD_TOP/out/combined-$TARGET_PRODUCT.ninja"if [ ! -f $ninja_build_file ]thenecho "can't find ninja buildfile $ninja_build_file"exit -1fiif [ ! -f $ninja_bin ]thenecho "can't find ninja binary $ninja_bin"exit -1fi$ninja_bin -f $ninja_build_file $1}
#usage:ninja<modulename>
ninja $*

ninja的執行

如果執行ninja進行快速編譯時,遇到如下錯誤:

ninja: error while loading shared libraries: libjemalloc5.so: cannot open shared object file: No such file or directory

使用如下解決方法:

sudo cp prebuilts/build-tools/linux-x86/lib64/libjemalloc5.so /usr/lib

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/94201.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/94201.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/94201.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-51,(知識點:stm32,GPIO基礎知識)

目錄 1、題目 2、解答 3、相關知識點 一、GPIO 基本結構與特性 1. GPIO 硬件結構 2. 主要特性 二、GPIO 工作模式 1. 輸入模式 2. 輸出模式 3. 復用功能模式 4. 特殊模式 三、GPIO 配置步驟&#xff08;以 STM32Cube HAL 庫為例&#xff09; 1. 初始化 GPIO 時鐘 …

小智服務器Java安裝編譯(xinnan-tech)版

github&#xff1a;https://github.com/xinnan-tech/xiaozhi-esp32-server 一、JDK 1、JDK21下載&#xff1a; https://www.oracle.com/cn/java/technologies/downloads/#jdk21-windows RPM安裝&#xff1a; rpm -ivh jdk-21_linux-x64_bin.rpm 2、IDEA設置JDK File → P…

智能平臺的感知進化:AI × 視頻通感在群體終端協同中的應用探索

?? 引言&#xff1a;從單兵到集群&#xff0c;未來智能平臺的協同演進 從傳統的單兵執行任務到如今的“群體智能平臺編組”&#xff0c;現代感知系統正經歷一場由 AI、機器人與智能計算平臺驅動的深度變革。過去&#xff0c;履帶式無人平臺在平坦地形中承擔支援任務&#xf…

基于定制開發開源AI智能名片S2B2C商城小程序的B站私域流量引流策略研究

摘要&#xff1a;隨著移動互聯網進入存量競爭階段&#xff0c;私域流量運營成為企業數字化轉型的核心戰略。B站作為中國最大的Z世代文化社區&#xff0c;其3.41億月活躍用戶中Z世代占比達58%&#xff0c;且25歲以上用戶增速顯著&#xff0c;用戶日均使用時長超108分鐘&#xff…

Spring+K8s+AI實戰:3全棧開發指南

Spring、K8s、人工智能、Docker及Windows實例 以下是與Spring、K8s、人工智能、Docker及Windows實例相關的實用示例,涵蓋開發、部署和集成場景: Spring Boot微服務開發 示例1:REST API構建 使用Spring Boot創建帶Swagger文檔的RESTful服務,集成JPA和Hibernate進行數據庫…

C++ 生成動態庫.dll 及 C++調用DLL,C++ 生成靜態庫.lib及 C++調用lib

文章目錄1 C 動態庫.dll生成 及 調用1.1 生成C 動態庫dll1.1.1 創建項目MyDLL1.1.2 編寫.h 和 .cpp文件1.1.3 設置 及 生成 DLL1.2 調用 C 動態庫dll1.2.1 創建C 空項目DLLtest1.2.2 動態庫配置 及代碼調用測試2 C 靜態庫.lib 生成 及 調用3 C 生成靜態庫.lib及調用 &#xff0…

信創應用服務器TongWeb安裝教程、前后端分離應用部署全流程

TongWeb 簡介TongWeb 是東方通&#xff08;TongTech&#xff09;開發的國產Java應用服務器&#xff08;中間件&#xff09;&#xff0c;類似于國外的 WebLogic、WebSphere 和開源的 Tomcat、Jetty&#xff0c;主要用于企業級Java應用&#xff08;如J2EE&#xff09;的部署和運行…

Rust 同步方式訪問 REST API 的完整指南

Rust 同步方式訪問 REST API 的完整指南 在 Rust 中不使用異步機制訪問 REST API 是完全可行的&#xff0c;特別適合簡單應用、腳本或不需要高并發的場景。以下是完整的同步實現方案&#xff1a; &#x1f4e6; 依賴選擇 推薦庫&#xff1a; [dependencies] reqwest { version…

32.【.NET8 實戰--孢子記賬--從單體到微服務--轉向微服務】--單體轉微服務--財務服務--賬本與預算

在我們的孢子記賬應用中&#xff0c;賬本是用于記錄每一筆收支流水的核心模塊。通過賬本&#xff0c;我們可以清晰地追蹤資金的流入與流出&#xff0c;進行數據統計和分析&#xff0c;為后續的報表生成和決策支持提供基礎數據。預算模塊則是用于設置和管理預算的功能&#xff0…

模型預估打分對運籌跟蹤的影響

在uplift建模中&#xff0c;模型離線指標(QINI、AUUC)提升并不意味著在線A/B實驗的收益&#xff0c;因為在線運籌還需要λ\lambdaλ約束。如果模型打分不滿足單調增且roi邊際遞減&#xff0c;那么λ\lambdaλ運籌求解會非常不穩定&#xff0c;導致線上發券偏高&#xff0c;毛利…

音視頻學習(四十六):聲音的三要素

聲音是人類感知世界的重要途徑之一。在自然界中&#xff0c;聲波本質上是介質中傳播的機械振動&#xff0c;而人類對聲音的主觀感受主要通過三種屬性來認知和描述&#xff0c;即音調&#xff08;音高&#xff09;、響度&#xff08;強弱&#xff09;、音色&#xff08;音質&…

spring batch處理數據模板(Reader-Processor-Writer模式)

步驟監聽器 Component public class StepListener implements StepExecutionListener {private StepExecution stepExecution;public StepExecution getStepExecution() {return this.stepExecution;}Overridepublic void beforeStep(StepExecution stepExecution) {this.stepE…

【華為OD機試】從小桶里取球

題目描述 某部門開展Family Day開放日活動,其中有個從桶里取球的游戲,游戲規則如下: 有N個容量一樣的小桶等距排開,且每個小桶都默認裝了數不等的小球, 每個小桶裝的小球數量記錄在數組bucketBallNums中, 游戲開始時,要求所有桶的小球總數不能超過SUM, 如果小球總…

std::unordered_map 和 std::map的區別【C++】

std::unordered_map 和 std::map 是 C 標準庫中兩種不同的關聯容器&#xff0c;它們都用于存儲鍵值對&#xff0c;但在實現方式、性能特點和使用場景上存在顯著區別。以下是它們的主要區別&#xff1a; 1. 數據結構 std::map&#xff1a; 基于 紅黑樹&#xff08;一種自平衡二叉…

云原生環境里的顯示變革:Docker虛擬瀏覽器與cpolar穿透技術實戰

文章目錄前言【視頻教程】1. 關于neko2. 本地部署neko3. neko簡單使用4. 安裝內網穿透5. 配置neko公網地址6. 配置固定公網地址前言 現代遠程協作本該是無縫銜接的過程&#xff0c;卻被這些障礙不斷打斷&#xff1a;多設備屏幕同步存在延遲、跨平臺訪問需要復雜配置、公網IP申…

LVGL + ESP-Brookesia 在Windows下的編譯和運行

LVGL ESP-Brookesia 在Windows下的編譯和運行 1. 項目介紹 本項目是基于 LVGL&#xff08;輕量級多功能圖形庫&#xff09;和 ESP-Brookesia 的嵌入式模擬桌面應用開發框架&#xff0c;專為嵌入式設備構建豐富的圖形界面而設計。通過在Windows環境下模擬嵌入式設備的圖形界面…

【ip】IP地址能否直接填寫255?

IP地址數值限制? 最近有朋友后臺問我&#xff0c;IP地址里填255行不行&#xff1f;思索著有一陣子沒有分享基礎的知識&#xff0c;就在今天大致說一下&#xff0c;關于IP地址里填255行不行&#xff1f;答案當然是否定的。 IP地址由4個段組成&#xff0c;每個段的數值范圍其實限…

力扣熱題100----------141.環形鏈表

給你一個鏈表的頭節點 head &#xff0c;判斷鏈表中是否有環。 如果鏈表中有某個節點&#xff0c;可以通過連續跟蹤 next 指針再次到達&#xff0c;則鏈表中存在環。 為了表示給定鏈表中的環&#xff0c;評測系統內部使用整數 pos 來表示鏈表尾連接到鏈表中的位置&#xff08;索…

【Java開發日記】我們來說說 LockSupport 的 park 和 unpark

目錄 一、LockSupport 1.1、LockSupport函數列表 1.2、基本使用 先 park 再 unpark 先 unpark 再 park 1.3、特點 與 Object 的 wait & notify 相比 二、LockSupport park & unpark原理 2.1、情況一&#xff0c;先調用park&#xff0c;再調用unpark park 操作…

AGI|從“實驗室”到“生產線”:企業級AI Agent 如何突圍

在數字化轉型的深水區&#xff0c;企業級 AI Agent 正從技術概念走向產業實踐&#xff0c;成為驅動生產力變革的核心引擎。目錄 一、風口已至&#xff1a;AI Agent 的崛起邏輯與市場剛需 二、企業級AI Agent&#xff1a;核心能力與獨特價值定位 三、AI Agent 的未來目標 一、…