android 系統源碼調試 局部變量值_如何方便快速的整編Android 9.0系統源碼?

點擊上方“劉望舒”,選擇“星標”

多點在看,就是真愛!

作者 :? 劉望舒? |??來源 :劉望舒的博客地址:http://liuwangshu.cn/framework/aosp/3-compiling-aosp.html

前言

在上一篇文章是時候下載Android 9.0系統源碼了
中,我們順利的將AOSP下載了下來,很多時候我們不僅僅需要去查看源碼,還有以下的幾個需求:

  • 動態調試Android系統源碼

  • 定制Android系統

  • 將最新版本的Android系統刷入到自己的Android設備中

為了實現這些需求,就需要我們去編譯系統源碼。

1.編譯系統概述

了解以下一些概念,會對Android編譯系統有大概的了解。Makefile
Android平臺的編譯系統,其實就是用Makefile寫出來的一個獨立項目。它定義了編譯的規則,實現了“自動化編譯”,不僅把分散在數百個Git庫中的代碼整合起來、統一編譯, 而且還把產物分門別類地輸出到一個目錄,打包成手機ROM,還可以生成應用開發時所使用的SDK、NDK等。
因此,采用Makefile編寫的編譯系統,也可以稱為Makefile編譯系統。Android.mk
Makefile編譯系統的一部分,定義了一個模塊的必要參數,使模塊隨著平臺編譯。通俗來講就是告訴編譯系統,以什么樣的規則編譯你的源代碼,并生成對應的目標文件。

Ninja
Ninja是一個致力于速度的小型編譯系統,如果把其他的編譯系統看作高級語言,那么Ninja 目標就是匯編。

Soong
Soong是谷歌用來替代此前的Makefile編譯系統的替代品,負責解析Android.bp文件,并將之轉換為Ninja文件

Blueprint
Blueprint用來解析Android.bp文件翻譯成Ninja語法文件。

kati
kati是谷歌專門為了Android而開發的一個小項目,基于Golang和C++。 目的是把Android中的Makefile,轉換成Ninja文件。

Android.bp
Android.bp,是用來替換Android.mk的配置文件。

Android.mk、Ninja、Soong、Blueprint、kati、Android.bp的概念之間的聯系為:

dde6a73435352bb7b5206de331b13230.png

Blueprint負責解析Android.bp文件內容,Blueprint類似一個處理相關語法的庫文件,Soong則是定義具體如何處理相應的語法以及命令實現。通俗來講就是Soong借助于Blueprint定義的Android.bp語法,完成Android.bp的解析,最終轉換成Ninja文件。
Makefile文件會通過kati轉換為Ninja文件。
隨著Android工程越來越大,采用Makefile的編譯系統花費的時間也越來越長,因此谷歌在Android 7.0開始引入了Ninja來編譯系統,相對于Makefile來說Ninja在大的項目管理中速度和并行方面有突出的優勢。
Makefile默認文件名為Makefile或makefile,也常用.make或.mk作為文件后綴。 Ninja的默認文件名是build.ninja,其它文件以.ninja為后綴。Makefile與Ninja的區別在于, Makefile是設計來給開發編寫的,而Ninja設計出來是給其它程序生成的。如果Makefile是Java語言,那么Ninja就是匯編語言。

2.編譯源碼的方式

Androd系統源碼編譯有很多種方式,主要有以下幾種:

  • 在Linux中直接進行系統源碼編譯(Android官方支持)

  • 在Mac OS中直接進行系統源碼編譯(Android官方支持)

  • 使用Docker編譯,支持Mac OS和Windows

其中需要注意的是,Docker的最低支持版本為Windows7,建議用Windows10環境下使用Docker,因為在Windows7種還需要借助Docker Toolbox和VirtualBox中的容器進行通信,效率相對低些。
考慮到大多數人的設備和上手難易程度,本為講解在Linux中直接進行系統源碼編譯,如果你的系統不是Ubuntu,可以查看趁周末,用VirtualBox安裝 Ubuntu吧!這篇文章。

3.準備編譯環境

1.安裝 jdk8

sudo?apt-get?update
sudo?apt-get?install?openjdk-8-jdk

2.使用 ubuntu 14+,需要安裝以下依賴包:

sudo?apt-get?install?git-core?gnupg?flex?bison?gperf?build-essential?zip?curl?zlib1g-dev?gcc-multilib?g++-multilib?libc6-dev-i386?lib32ncurses5-dev?x11proto-core-dev?libx11-dev?lib32z-dev?ccache?libgl1-mesa-dev?libxml2-utils?xsltproc?unzip

3.設置處理器數量
在設置-->系統-->處理器選項,設置處理器數量,建議選擇能設置的最大值,這里設置的是6。

4.源碼整編

整編就是編譯整個Android 源碼,整編主要有三個步驟,下面分別就行介紹。

1.初始化環境

在AOSP的根目錄,輸入如下的命令:

source?build/envsetup.sh
//?編譯前刪除build文件夾A
make?clobber

使用 build目錄中的envsetup.sh 腳本初始化環境,這個腳本會引入其他的執行腳本。

2. 選擇編譯目標
輸入命令:

lunch

lunch命令是envsetup.sh里定義的一個命令,用來讓用戶選擇編譯目標。
會有以下信息輸出:

You're?building?on?Linux

Lunch?menu...?pick?a?combo:
?????1.?aosp_arm-eng
?????2.?aosp_arm64-eng
?????3.?aosp_mips-eng
?????4.?aosp_mips64-eng
?????5.?aosp_x86-eng
?????6.?aosp_x86_64-eng
?????7.?aosp_car_arm-userdebug
?????8.?aosp_car_arm64-userdebug
?????9.?aosp_car_x86-userdebug
?????10.?aosp_car_x86_64-userdebug
?????11.?mini_emulator_arm64-userdebug
?????12.?m_e_arm-userdebug
?????13.?m_e_mips64-eng
?????14.?m_e_mips-userdebug
?????15.?mini_emulator_x86_64-userdebug
?????16.?mini_emulator_x86-userdebug
?????17.?uml-userdebug
?????18.?aosp_cf_x86_auto-userdebug
?????19.?aosp_cf_x86_phone-userdebug
?????20.?aosp_cf_x86_tablet-userdebug
?????21.?aosp_cf_x86_tablet_3g-userdebug
?????22.?aosp_cf_x86_tv-userdebug
?????23.?aosp_cf_x86_wear-userdebug
?????24.?aosp_cf_x86_64_auto-userdebug
?????25.?aosp_cf_x86_64_phone-userdebug
?????26.?aosp_cf_x86_64_tablet-userdebug
?????27.?aosp_cf_x86_64_tablet_3g-userdebug
?????28.?aosp_cf_x86_64_tv-userdebug
?????29.?aosp_cf_x86_64_wear-userdebug
?????30.?cf_x86_auto-userdebug
?????31.?cf_x86_phone-userdebug
?????32.?cf_x86_tablet-userdebug
?????33.?cf_x86_tablet_3g-userdebug
?????34.?cf_x86_tv-userdebug
?????35.?cf_x86_wear-userdebug
?????36.?cf_x86_64_auto-userdebug
?????37.?cf_x86_64_phone-userdebug
?????38.?cf_x86_64_tablet-userdebug
?????39.?cf_x86_64_tablet_3g-userdebug
?????40.?cf_x86_64_tv-userdebug
?????41.?cf_x86_64_wear-userdebug
?????42.?aosp_marlin-userdebug
?????43.?aosp_marlin_svelte-userdebug
?????44.?aosp_sailfish-userdebug
?????45.?aosp_walleye-userdebug
?????46.?aosp_walleye_test-userdebug
?????47.?aosp_taimen-userdebug
?????48.?hikey-userdebug
?????49.?hikey64_only-userdebug
?????50.?hikey960-userdebug

Which?would?you?like??[aosp_arm-eng]

意思就是要你選擇編譯目標的格式,編譯目標的格式組成為BUILD-BUILDTYPE,比如aosp_arm-eng的BUILD為aosp_arm,BUILDTYPE為eng。

其中BUILD表示編譯出的鏡像可以運行在什么環境,aosp代表Android開源項目,arm表示系統是運行在arm架構的處理器上。
更多參考官方文檔。
BUILDTYPE 指的是編譯類型,有以下三種:

  • user:用來正式發布到市場的版本,權限受限,如沒有 root 權限,不能 dedug,adb默認處于停用狀態。

  • userdebug:在user版本的基礎上開放了 root 權限和 debug 權限,adb默認處于啟用狀態。一般用于調試真機。

  • eng:開發工程師的版本,擁有最大的權限(root等),具有額外調試工具的開發配置。一般用于模擬器。

如果你沒有Nexus設備,只想編譯完后運行在模擬器查看,那么BUILD可以選擇aosp_x86,BUILDTYPE選擇eng,Which would you like? [aosp_arm-eng]后面直接輸入對應序號5就可以。

也可以直接指定編譯的目標:

lunch?aosp_x86-eng

或者(不同的系統版本,序號的對應會有差別,建議不要直接用序號)

lunch?5

3. 開始編譯
通過-jN參數來設置編譯的并行任務數,以提高編譯速度,在此前我的CPU核心數為6,這里N值最好選在6到12之間,這里我們設置6個并行任務進行編譯:

make?-j6

整編成功后會打印類似如下內容:

98b282905306b4b1768c3b13d67cbb94.png

由于采用的是虛擬機整編,編譯速度會慢一些,這里花費了2小時46分鐘.
最終會在 out/target/product/generic_x86/目錄生成了三個重要的鏡像文件: system.img、userdata.img、ramdisk.img。大概介紹著三個鏡像文件:
system.img:系統鏡像,里面包含了Android系統主要的目錄和文件,通過init.c進行解析并mount掛載到/system目錄下。
userdata.img:用戶鏡像,是Android系統中存放用戶數據的,通過init.c進行解析并mount掛載到/data目錄下。
ramdisk.img:根文件系統鏡像,包含一些啟動Android系統的重要文件,比如init.rc。

運行模擬器
在編譯完成之后,就可以通過以下命令運行Android虛擬機了,命令如下:

source?build/envsetup.sh
lunch?5
emulator

如果是在編譯完后運行虛擬機,由于之前已經執行過source和lunch命令了,可以直接運行:

emulator

如果不出意外就會啟動模擬器,如果出現報錯,網上也有很多的解決方案。

5.源碼單編

比如我們要編譯系統的Settings應用模塊,
在AOSP根目錄執行:

source?build/envsetup.sh
lunch?5

進入Settings的目錄:

cd?packages/apps/Settings

mm編譯當前目錄下的模塊,不編譯依賴模塊。

mm

編譯成功后會有提示生成文件的存放路徑。

07d2d0394441a7dca3551035cf7333ad.png

除了Settings.odex文件,還會在out/target/product/generic_x86/system/priv-app/Settings目錄下生成Settings.apk。

如果你修改了源碼,想查看生成的APK文件,有兩種方式:

  1. 通過adb push或者adb install 來安裝APK。

  2. 使用make snod命令,重新生成 system.img,運行模擬器查看。

熱門文章

Java中的鎖到底有幾種,你知道嗎?

Flutter 美團的實踐及原理

一次違反常規的大廠OPPO面試經歷(文末大量面試文章)

----------? END? ----------

分享大前端、Java、跨平臺等技術,

關注職業發展和行業動態。

a8c577bb78dce0956799e40f94484d90.png

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

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

相關文章

boost 文件操作

如果要簡單處理文件和文件夾的時候&#xff08;刪除、重命名等&#xff09;&#xff0c;使用Windows的系統函數會十分麻煩&#xff0c;可以嘗試一下使用Boost庫來進行處理 頭文件 #include <boost/filesystem.hpp>如果要獲得每次處理的結果錯誤碼&#xff0c;需要加上頭…

讓“是男人就下到100層”在Android平臺上跑起來

原工程:https://github.com/jeekun/DownFloors 移植后的代碼&#xff1a;HelloCpp.zip 移植后的APK&#xff1a;HelloCpp.apk 說明&#xff1a;&#xff08;cocos2d-x版本是“ 2.2&#xff09; 1.該工程是直接在HelloCpp上修改完成,所以包名也不修改了 2.原工程里面可能是采用g…

Codeforces Round #277 (Div. 2) 題解

Codeforces Round #277 (Div. 2)A. Calculating Functiontime limit per test1 secondmemory limit per test256 megabytesinputstandard inputoutputstandard outputFor a positive integer n lets define a function f: f(n)???-?1??2?-?3??..??(?-?1)nn Your …

QT 邊框圓角處理

平時的邊框是平角的&#xff1a; 如果需要圓角的話&#xff0c;就要加stylesheet加上這個&#xff1a; border-radius:3px;比如&#xff1a; QPushButton{ border-radius:3px; }就變成圓角了&#xff1a; px前面的數字越大就越圓&#xff0c;比如5px比3px圓 假如只需要某一…

3級調度 fpga_Vivado HLS學習筆記——1.了解FPGA架構

本篇文章為本人學習Xilinx的Vivado HLS教程記錄的學習筆記&#xff0c;僅供學習參考。Vivado HLS官方視頻教程&#xff1a;優酷視頻?v.youku.com目錄&#xff1a; Vivado HLS課程簡介FPGA與CPU、GPU、DSP的區別FPGA的優勢Xilinx FPGA架構:邏輯單元、算術邏輯單元、存儲單元使用…

[LeetCode]Maximum Depth of Binary Tree

Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the longest path from the root node down to the farthest leaf node. 思考&#xff1a;DFS。 /*** Definition for binary tree* struct TreeNode {* int val;* Tree…

BZOJ2435 [Noi2011]道路修建

這是NOI11年題&#xff0c;你在逗我&#xff1f; 直接dfs就可以了&#xff0c;Linux下貌似不會爆棧。。。 1 /**************************************************************2 Problem: 24353 User: rausen4 Language: C5 Result: Accepted6 Time:5184 …

Qt異常結束程序無法重新運行

有時候代碼有問題會導致qt異常結束 修改完后重新運行又會出現 查看任務管理器又沒有這個進程 可以使用資源管理器打開看看 也可以考慮使用process explorer查看 發現程序掛起來&#xff0c;結束掉它就可以重新運行了

hadooppythonsql_半小時搞定Hadoop+Mysql+Hive+Python

1. 說明搭建過Hadoop集群的小伙伴一定知道&#xff0c;如果不用docker&#xff0c;半小時配好HadoopMysqlHive(后簡稱Hive)肯定是胡吹&#xff0c;有了Docker鏡像&#xff0c;沒有說明文檔&#xff0c;配好了也不一定會用。本文將介紹如何在半小時內&#xff0c;讓Hive在你的Li…

PHP 切割字符串 點號 不用雙斜杠

$name "tupian.png"; $nameArr explode(".", $name); 習慣了Java的程序員容易寫成 $nameArr explode("\\.", $name);//在PHP中是不正確的轉載于:https://www.cnblogs.com/wuyou/p/3463425.html

Qt新添加的類無法鏈接

通過這個方法給工程添加了個類&#xff1a; 編譯的時候就出現了這個問題&#xff1a; 執行一下qmake 然后再重新構建項目就可以了

URAL 1830 Help in the RNOS 思路,讀題 難度:1

http://acm.timus.ru/problem.aspx?space1&num1830 這道題需要理解題目操作的意思, 要更改第i位的狀態,第i-1位必須激活為1,0-i-2位必須為0,如果0-i-1位開始時全為0,那么從0位開始進行操作 一.首先考慮對于0-i-1位都是0,需要更改i位的情況,需要 1.更改i-1位,2.按一下打開下…

openssh升級sftp_OpenSSH 8.2 發布 包括 sftp 客戶端和服務器支持

OpenSSH 8.2 發布了。OpenSSH 是 100% 完整的 SSH 協議 2.0 版本的實現&#xff0c;并且包括 sftp 客戶端和服務器支持。此版本變化不少&#xff0c;其中有兩個地方值得特別關注。一個是新特性&#xff0c;此版本增加了對 FIDO/U2F 硬件身份驗證器的支持。FIDO/U2F 是廉價硬件雙…

任務隊列摘自新鋒

在開發C程序時&#xff0c;一般在吞吐量、并發、實時性上有較高的要求。設計C程序時&#xff0c;總結起來可以從如下幾點提高效率&#xff1a; l 并發l 異步l 緩存下面將我平常工作中遇到一些問題例舉一二&#xff0c;其設計思想無非以上三點。 1任務隊列 1.1 以生產者-消…

C++容器遍歷時刪除元素

vector 錯誤做法 這樣做會在遍歷過程中越界導致程序崩潰 std::vector<int> vecInt({ 1, 3, 2, 1, 4, 1 });for (auto i vecInt.begin(); i ! vecInt.end() ; i) {if (*i 1) {vecInt.erase(i);}}正確做法 std::vector<int> vecInt({ 1, 3, 2, 1, 4, 1 });for (a…

按鈕圖片拉伸_圖片墻有多香?高手都在用的PPT封面制作技巧!

大家好&#xff0c;我是李導~這次&#xff0c;冬天是真的來了&#xff0c;不知道大家有沒有感覺&#xff0c;每次冷空氣真正襲來之前我們都會以為今年是個暖冬&#xff0c;結果突然有一天氣溫從20度直降到個位數&#xff0c;我們都會認為今年比以往的冬天都冷。但是&#xff0c…

POJ 1745 Divisibility【DP】

題意&#xff1a;給出n,k,n個數&#xff0c;在這n個數之間任意放置,-號&#xff0c;稱得到的等式的值能夠整除k則為可劃分的&#xff0c;否則為不可劃分的。 自己想的是枚舉&#xff0c;將所有得到的等式的和算出來&#xff0c;再判斷它是否能夠整除k&#xff0c;可是有10000個…

三種root的修補方式

三種root的修補方式 system/core/adb/abd.c adbd漏洞&#xff0c;請看abd.c的第917行/* then switch user and group to "shell" */ if (setgid(AID_SHELL) ! 0) { exit(1); } if (setuid(AID_SHELL) ! 0) { exit(1); …

數據挖掘十大經典算法

國際權威的學術組織the IEEE International Conference on Data Mining (ICDM) 2006年12月評選出了數據挖掘領域的十大經典算法&#xff1a;C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART. 不不過選中的十大算法&#xff0c;事實上參加評選…

windows dmp文件為0kb

列出一些遇到的情況提供參考&#xff1a; 1、棧溢出&#xff0c;多次調用T2A函數會出現程序崩潰但是dmp為0kb的問題。