Android 7.1.1系統源碼下載、編譯、刷機-Nexus 6實戰

来源:https://www.cnblogs.com/common1140/archive/2018/08/20/9508293.html
-Advertisement-
Play Games

想成為一位合格的Android程式員或者一位Android高級工程師是十分有必要知道Android的框架層的工作原理,要知道其工作原理那麼就需要閱讀Android的源代碼。 想要閱讀Android的源代碼最爽的方式的肯定是自己親手下載編譯。為什麼要閱讀Android源代碼? 第一,面試加分項。第二, ...


想成為一位合格的Android程式員或者一位Android高級工程師是十分有必要知道Android的框架層的工作原理,要知道其工作原理那麼就需要閱讀Android的源代碼。 想要閱讀Android的源代碼最爽的方式的肯定是自己親手下載編譯。為什麼要閱讀Android源代碼? 第一,面試加分項。第二,知其原理寫出的代碼差不到那裡。第三,學習深度。正所謂,知其然知其所以然。下麵記錄我基於7.1.1系統源碼下載到刷機的過程。

基本概念

  • AOSP : 就是Android Open Source Project也就是谷歌開放源代碼項目。 通過Google官方下載的源代碼也就是AOSP的代碼,是不包含Google開發的全家桶的應用。 ps: 這個作為一個Android程式員肯定要知道的一個專業詞,不然顯得你很Low,很不專業。
  • Repo : Repo 是一款工具,可讓您在 Android 環境中更輕鬆地使用 Git,換句話來說Repo是用來管理Git管理的每個倉庫。詳情定義請點擊here.

準備

  • 編譯系統:UbuntuKylin 16.04 LTS。
  • 手機:Nexus 6。
  • 驅動:Nexus 6驅動。
  • Android系統:Android 7.1.1。

註:從Android官網上是否有支持該手機的系統源代碼和驅動程式。

搭建編譯環境

1.安裝 JDK

如果 Ubuntu >= 15.04,則可以運行以下命令進行安裝OpenJDK,這裡使用的是OpenJDK. 之前準備使用Ubuntu LTS 14.04版本編譯,但是安裝OpenJDK有點麻煩所以放棄使用Ubuntu LTS 14.04。

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

 

如果你不是編譯Android 7.1.1系統源碼,那麼可以參考圖中的Android版本所對應的JDK版本進行安裝。
Android系統版本對應的JDK

2.主要軟體包

  • Python : Python 2.6 - 2.7.
  • Git : Git 1.7 或更高版本.

下載源代碼

我這裡下載的Google官方的AOSP, 下載官方的需要科學上網並且保證你的網路穩定。具體在清華大學開源軟體鏡像站的AOSP,可以參考這裡的設置here

  • 安裝 Repo

1 . 確保主目錄下有一個 bin/ 目錄,並且該目錄包含在路徑中:

$ mkdir ~/bin
$ PATH=~/bin:$PATH

 

2 . 下載 Repo 工具,並確保它可執行:

$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo

 

  • 初始化 Repo 客戶端

安裝 Repo 後,設置您的客戶端以訪問 Android 源代碼代碼庫: 1 . 創建一個空目錄來存放您的工作文件。

$ mkdir AndroidSource // AndroidSource這個是我自己命名存放源代碼的目錄名稱
$ cd AndroidSource

 

  1. 使用您的真實姓名和電子郵件地址配置 Git。如果你設置了Git的配置則跳過這一步。
$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

 

  1. 運行 repo init進行初始化。以下-b進行檢出相對應的分支,要查看分支列表,請參閱源代碼標記和編譯版本
repo init -u https://android.googlesource.com/platform/manifest -b android-7.1.1_r57

初始化成功後,客戶端目錄中現在應包含一個 .repo 目錄,清單等文件將保存在該目錄下。

下載 Android 源代碼樹

然後將 Android 源代碼樹從預設清單中指定的代碼庫下載到工作目錄,運行以下命令:

$ repo sync

在下載的時候保證網路的穩定性,保證電腦設置了不休眠,可以晚上放著讓它下載。下載完大概30G左右。 下載源碼出現的問題不會太多,有問題的話大多數為網路的問題,真正出問題最多的是源代碼的編譯,那簡直就是惡夢。

準備編譯

下載專有二進位文件

我需要將編譯的源代碼刷到Nexus6,所以需要下載Nexus6的相對應的驅動。 具體找到系統版本對應手機型號相對應的驅動二進位文件可以在這裡找到here二進位驅動文件

然後將這三個壓縮包下載後,解壓縮得到三個sh文件。 將這三個sh文件copy到Android編譯目錄下。

$ ./extract-broadcom-shamu.sh
$ ./extract-moto-shamu.sh
$ ./extract-qcom-shamu.sh

 

運行以上命令後會顯示聲明信息,一直按回車,當你看到以下信息就輸入:I ACCEPT就可以了。不要按得太快,很容易跳了輸入接受。。。。 圖片.png

Jack配置

Jack 是一種 Android 工具鏈,用於將 Java 源代碼編譯成 Android dex 位元組碼。要使用 Jack,您只需使用標準的 Makefile 命令來編譯源代碼樹或您的項目即可,無需進行任何其他操作。Android 8.1 是使用 Jack 的最後一個版本。

2017 年 3 月 14 日公告發佈之後,Jack 工具鏈已被棄用。Jack 是 Android 6.0–8.1 的預設 Android 編譯工具鏈

如果你編譯AOSP的master分支,以及Android O及以後版本,Android提供了禁用的支持。具體可以參考 here

在編譯7.1.1源碼的時候,我並沒有查怎麼關閉Jack編譯。所以,需要檢查一下Jack-Server是否已經安裝以及啟動。

  • 根據機器的RAM設置Jack-Server的VM大小,我機器是16G記憶體,所以設置8G左右VM。 修改prebuilts/sdk/tools/jack-admin 文件,找到變數JACK_SERVER_VM_ARGUMENTS位置在後面添加,添加參數 -Xmx8000M

  • 進入prebuilts/sdk/tools 運行以下命令:

$ ./jack-admin start-server 
  • 如果提示沒有安裝的話,則運行以下命令,然後再次運行上面啟動jack-server的命令。
$ ./jack-admin install-server jack-launcher.jar jack-server-4.8.ALPHA.jar 

保證Jack-Server服務啟動。不然在編譯的時候會遇到Jack-Server很多坑的。。。

設置環境

使用 envsetup.sh 腳本進行初始化環境。

$ source build/envsetup.sh

使用 lunch 選擇要編譯的目標。

$ lunch

運行以上命令後,會列出當前所有的Build Type,然後輸入23。這裡我選擇23. aosp_shamu-userdebug,這個Build Type是可以調試,所以建議你選擇userdebug。具體可以參考這裡的解析 here

編譯代碼

make -j8 //-j8是並行的任務數,根據機器CPU的內核線程數來設置。

編譯過程遇到的問題

  • 編譯百分比之0就報出來的錯誤,m4沒有安裝。
FAILED: /bin/bash -c "prebuilts/misc/linux-x86/flex/flex-2.5.39 -o/home/chris/rom7.0/out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_l.cpp system/tools/aidl/aidl_language_l.ll"
flex-2.5.39:嚴重內部錯誤,exec of /usr/bin/m4 failed
[  0% 8/49773] Yacc: aidl <= system/tools/aidl/aidl_language_y.yy
FAILED: /bin/bash -c "prebuilts/misc/linux-x86/bison/bison -d  --defines=/home/chris/rom7.0/out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_y.h -o /home/chris/rom7.0/out/host/linux-x86/obj/STATIC_LIBRARIES/libaidl-common_intermediates/aidl_language_y.cpp system/tools/aidl/aidl_language_y.yy"
[  0% 8/49773] host C++: ijar <= build/tools/ijar/classfile.cc
ninja: build stopped: subcommand failed.
build/core/ninja.mk:151: recipe for target 'ninja_wrapper' failed
make: *** [ninja_wrapper] Error 1

 

解決方法:

sudo apt-get install m4

  • 編譯百分之一的時候報的錯誤,bison 沒有安裝。

編譯錯誤1

解決方法:

1. sudo apt-get install bison
2. sudo apt-get install  g++-multilib gcc-multilib lib32ncurses5-dev lib32readline6-dev lib32z1-dev

 

  • 其中編譯過程有Jack-Server也報的問題,有沒有安裝,沒有啟動的問題,那時候急著解決問題,所以沒有相對應的截圖。所以我在上面也寫保證Jack-Server先安裝啟動,不然在後面的編譯7.1.1源碼會報錯。在編譯的過程中,我的機器暫時沒有報Jack-Server記憶體不足的錯誤。如果你使用虛擬機進行編譯時,記憶體至少要8G,不然會報記憶體不足的編譯錯誤。

Jack-Server錯誤.png

圖片.png

編譯的時候遇到的坑遠遠不止以上的問題,有些沒有記錄下來。。。

編譯失敗後,我都是重新手動刪掉out目錄,以避免出現更多的問題,然後重新運行上面的>設置環境步驟。

  • 經過幾天的努力與堅持,終於編譯成功了,激動~~
  • 編譯成功後的提示.png

使用 fastboot 刷機

首先,保證已經unlock解鎖 可以正常刷機。具體怎麼解鎖Google一下。刷機前,請備份好個人重要的資料,刷機會將所有資料都會清空。 然後,連上電腦。 接著,在源碼根目錄下(就是下載源代碼的目錄)執行下麵命令:

開始刷機.png

刷機已完成.png

End

在這裡整一個過程就結束了,但是這隻是閱讀源代碼的一個新開始!接然的還有如何將AOSP導入到Android Studio進行閱讀以及調試和如何閱讀。雖然這個過程辛苦,但是這是值得的,一起加油努力學習~~

更多編譯錯誤鏈接:https://ichrisking.github.io/2017/08/25/rom7.0-build/


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

-Advertisement-
Play Games
更多相關文章
  • *—*—python開發基礎(2)—*—*一、while迴圈1.while條件: 迴圈體 若條件滿足,迴圈體執行 若條件不滿足,迴圈體不執行 例:number = 1 #輸出結果:1 while number < 4: 2 print(number) 3 number = number + 12.死 ...
  • 前面ORM模塊我們已經完成了開發,接下來要做的就是對項目代碼進行重構了。因為對底層資料庫操作模塊(db_helper.py)進行了改造,之前項目的介面代碼全都跑不起來了。 在寫ORM模塊時,我們已經對產品介面的分頁查詢、新增、修改、獲取指定產品實體介面已經重構好了,還剩下刪除介面未完成 如果前面代碼 ...
  • 體會 第一次開始學習Python,不知道自己之後能否持續堅持下去。我想不論怎樣只要有時間和就努力堅持。爭取以周為單位按要求完成相應工作量的學習。持續學習,不斷總結和進步。 一、Python安裝 Python的安裝是還是是一件比較麻煩的事情。之前安裝python環境到還比較簡單一些。後面再安裝PyCh ...
  • 1、線程的實現方式 線程有兩種實現方式,分別為繼承Thread、實現Runnable介面。差異性:實現方式避免了類的繼承單一性,且對於多個線程同時訪問同一個資源時更便捷。 (1)繼承Thread class TestThread extends Thread { @Override public v ...
  • 1 from lxml import etree 2 from selenium import webdriver 3 import pymysql 4 5 def Geturl(fullurl):#獲取每個招聘網頁的鏈接 6 browser.get(fullurl) 7 shouye_html_t... ...
  • 開始接觸php,奇怪的是,每次打PHP的時候,都會出現,拍*黃*片,覺得好搞笑 今天聽了一上午的課,老司機講的是,面向對象,世間萬物皆對象~ 以下是上課的筆記,和大家共用,不謝,多練習~ //面向對象 // 1 世間萬物皆對象 //一個人,一個車,一架飛機,一個垃圾桶 一切可見之物都是對象,一切不可 ...
  • 數組左移 i 位 3 種方法 1.臨時數組存儲 先將前 i 個元素用數組存起來 再將後 n - i 個元素左移 i 位 最後將存起來的數組添加到後面去即可 2.通過多次調用左移 1 位的函數 3.翻轉 將待移動的數組以 i 為分隔看成兩段 AB 先將 A 翻轉,再將 B 翻轉 之後將數組整個翻轉 1 ...
  • 目錄: 一、os模塊中關於文件/目錄常用的函數使用方法 二、os.path模塊中關於路徑常用的函數使用方法 三、課時30課後習題及答案 接下來會介紹跟Python的文件相關的一些很有用的模塊。模塊是什麼?其實我們寫的每一個源代碼文件(*.py)都是一個模塊。Python自身帶有非常多使用的模塊。 比 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...