編輯:關於Android編程
此博文記錄一下Android從系統源碼下載到刷機的全過程。
(https://source.android.com/source/build-numbers.html 頁面中列表信息找到自己設備對應的Android版本進行選擇,博文中選擇MOB301)
硬件:Google 親兒子 Nexus6("shamu")
Android系統:選擇了Android官網上的MOB301對應的android-6.0.1_r42
驅動:自然就是MOB301_Nexus6對應的驅動了
編譯系統:Ubuntu14.0.4
PS: 小小啰嗦一下~
我們知道僅僅看代碼,提高是比較有限的,而且理解起來也比較膚淺,往往過目就忘. 而自己寫過的代碼,往往會印象比較深刻,在寫的時候也會比較容易理解流程. 所以我們在看代碼的同時, 如果能修改代碼, 在手機上跑起來並看到修改的效果,這無疑會加快看代碼的效率和積極性. 所以這篇文章,就講解一下如何自己編譯Android M的源碼,並且在Nexus 6上跑起來. 至於為何需要自己編譯固件,而不是直接安裝Google給出的工廠固件?原因是Google給出的工廠固件是User版本,是沒法隨心所欲Push東西進去的. 所以我們需要編譯自己的Userdebug版本.
另外你需要知道AOSP,AOSP即Android Open Source Project 漢語意思是:谷歌開放源代碼項目.我們通過Google官方下載的源代碼,就是AOSP的代碼, 其中是不包含Google開發的那些個應用的,各個廠商拿到的也是這個版本,在這個版本的基礎上進行修改. 而Google發布的工廠固件則是包含全套Google服務的. 廠商如果想安裝Google服務,就需要過Google的那一套認證,比較麻煩,而且價格不菲,鑒於Google在國內的尴尬地位,國內很多廠商都沒有過這個認證.
因此有人會說刷出來的ROM和Google發布的user版本的ROM看起來界面不一致的原因就在於此。
一開始請先清楚幾個點:
1.手上的手機型號是什麼?
2.Android官網上是否有支持該手機的系統源代碼和驅動程序?
本文以Nexus 6為例,後面的內容不再重復。
Ubuntu編譯環境配置
本文以Android系統編譯為主,因此不寫關於VirtualBox裝Ubuntu14.04的相關內容(網上搜索下,一堆的資料)
裝完了Ubuntu系統後,咱們在命令窗口下執行:
1.執行如下命令,下載編譯相關的組件:
sudo apt-get install flex bison gperf build-essential curl zlib1g-dev g++-multilib g++-4.4-multilib libc6-dev-i386 lib32ncurses5-dev lib32z1 lib32ncurses5 lib32bz2-1.0 x11proto-core-dev libx11-dev lib32readline-gplv2-dev lib32z1-dev mingw32 libxml2-utils gnupg zip xsltproc python-markdown wine tofrodos
2.java環境配置(1.7)
將Ubuntu切換到163的源下,下載安裝openjdk-7相關的jre和jdk
sudo apt-get install 對應的openjdk組件名
Android系統源代碼下載和驅動sh腳本下載
1.Android系統源代碼下載(接下來這些操作最好都是基於翻牆的情況下進行)
這部分內容也可以參照Andorid官方網站的介紹說明(http://source.android.com/source/downloading.html)
(1).安裝命令行方式下工作的文件傳輸工具curl.
sudo apt-get install curl
(2).開源的分布式版本控制系統git(Android項目使用git管理).
sudo apt-get install git
(3).安裝Repo命令行工具(Repo是Google開發的基於git更好管理Android項目的工具)
mkdir ~/bin
PATH=~/bin:$PATH
curl http://commondatastorage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
(4).初始化Repo客戶端
mkdir Android
cd Android
repo init -u https://android.googlesource.com/platform/manifest -b 你所要選擇的android系統對應的Branch (MOB301對應android-6.0.1_r42)
則為:repo init -u https://android.googlesource.com/platform/manifest -b android-6.0.1_r42
Branch的列表在:http://source.android.com/source/build-numbers.html 網站中可以看到相關列表信息
(5).下載Android源代碼
repo sync
執行完後進入漫長的等待,系統大概有20多個G要下載,所以可以晚上的時候放著下載(記得一定要處於翻牆可訪問外網狀態喲~)
完成後,如圖所示就可以了
(PS:這個時候Android目錄下是有個文件夾的.repo,這個文件夾大概占用了30G的空間,假設你後面不需要再更新系統,那麼這個文件夾可以刪除掉了)<喎?/kf/ware/vc/" target="_blank" class="keylink">vc3Ryb25nPjwvcD4NCjxwPjxpbWcgYWx0PQ=="這裡寫圖片描述" src="/uploadfile/Collfiles/20160528/20160528090434233.png" title="\" />
在設備驅動頁中找到相應的驅動程序sh腳本,並下載
Nexus對應驅動頁:https://developers.google.com/android/nexus/drivers
將這三個壓縮包下載後,解壓縮得到三個sh文件。
將這三個sh文件copy到Android編譯目錄下。
執行這3個sh文件,會下載相關驅動文件到 vendor 目錄
./extract-broadcom-shamu.sh
./extract-moto-shamu.sh
./extract-qcom-shamu.sh
過程中會讓我們看一些聲明信息,看完後輸入I ACCEPT即可:
編譯Android系統
(1).環境初始化
source build/envsetup.sh
執行完後,會將一些文件include進來:
panghu@panghu:~/Android$ source ./build/envsetup.sh
including device/asus/deb/vendorsetup.sh
including device/asus/flo/vendorsetup.sh
including device/asus/fugu/vendorsetup.sh
including device/generic/mini-emulator-arm64/vendorsetup.sh
including device/generic/mini-emulator-armv7-a-neon/vendorsetup.sh
including device/generic/mini-emulator-mips/vendorsetup.sh
including device/generic/mini-emulator-x86_64/vendorsetup.sh
including device/generic/mini-emulator-x86/vendorsetup.sh
including device/htc/flounder/vendorsetup.sh
including device/huawei/angler/vendorsetup.sh
including device/lge/bullhead/vendorsetup.sh
including device/lge/hammerhead/vendorsetup.sh
including device/moto/shamu/vendorsetup.sh
including sdk/bash_completion/adb.bash
(2)lunch選擇要build的類型
lunch
執行該命令後,會列出當前可供選擇的build type,對應選擇自己需要的即可
panghu@panghu:~/Android$ lunch
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_deb-userdebug
8. aosp_flo-userdebug
9. full_fugu-userdebug
10. aosp_fugu-userdebug
11. mini_emulator_arm64-userdebug
12. m_e_arm-userdebug
13. mini_emulator_mips-userdebug
14. mini_emulator_x86_64-userdebug
15. mini_emulator_x86-userdebug
16. aosp_flounder-userdebug
17. aosp_angler-userdebug
18. aosp_bullhead-userdebug
19. aosp_hammerhead-userdebug
20. aosp_hammerhead_fp-userdebug
21. aosp_shamu-userdebug
Which would you like? [aosp_arm-eng] 21
機型對照表
(3)開始編譯
make -j8
等待編譯結束………灰常灰常漫長.機器比較好的大概1-2小時,機器不好的,那個酸爽…..!!!!!
編譯結束後提示如下即可:
####make completed successfully ####
刷機
Nexus6關機狀態下,長按音量下+電源,進入recovery模式
然後在源碼根目錄下(Android根目錄下)執行下面命令:
fastboot -w flashall
如果這時候提示:< waiting for device > 的話,證明你的虛擬機VirtualBox沒有識別到你的手機,可以在VirtualBox上菜單中 “設備” -> “分配USB設備” -> 選中你的手機對應的設備名就可以了。
panghu@panghu:~/Android$ fastboot -w flashall
< waiting for device >
target reported max download size of 536870912 bytes
Creating filesystem with parameters:
Size: 28474998784
Block size: 4096
Blocks per group: 32768
Inodes per group: 8160
Inode size: 256
Journal blocks: 32768
Label:
Blocks: 6951904
Block groups: 213
Reserved block group size: 1024
Created filesystem with 11/1738080 inodes and 153124/6951904 blocks
Creating filesystem with parameters:
Size: 268435456
Block size: 4096
Blocks per group: 32768
Inodes per group: 8192
Inode size: 256
Journal blocks: 1024
Label:
Blocks: 65536
Block groups: 2
Reserved block group size: 15
Created filesystem with 11/16384 inodes and 2089/65536 blocks
--------------------------------------------
Bootloader Version...: moto-apq8084-71.18
Baseband Version.....: D4.01-9625-05.34+FSG-9625-02.111
Serial Number........: ZY222WQN82
--------------------------------------------
checking product...
OKAY [ 0.004s]
sending 'boot' (8201 KB)...
OKAY [ 1.291s]
writing 'boot'...
OKAY [ 0.153s]
sending 'recovery' (8917 KB)...
OKAY [ 1.403s]
writing 'recovery'...
OKAY [ 0.126s]
sending sparse 'system' (516549 KB)...
OKAY [ 84.029s]
writing 'system'...
OKAY [ 7.818s]
sending sparse 'system' (137398 KB)...
OKAY [ 23.156s]
writing 'system'...
OKAY [ 2.137s]
erasing 'userdata'...
OKAY [ 2.898s]
sending 'userdata' (139061 KB)...
OKAY [ 21.777s]
writing 'userdata'...
OKAY [ 2.672s]
erasing 'cache'...
OKAY [ 0.045s]
sending 'cache' (6248 KB)...
OKAY [ 0.983s]
writing 'cache'...
OKAY [ 0.107s]
rebooting...
finished. total time: 149.323s
OK,到此為止,Android系統下載,編譯,刷機都結束了,大家可以開始自己的Android系統定制之旅了。(PS:原生的弄完後,建議可以去試試弄CM的系統,CM做了一些優化,感覺比較不錯!)
Android的Notification是android系統中很重要的一個機制, 產品人員常常利用通知欄的方式,跟用戶進行弱溝通。擁有推送通知的app要比沒有此類功能的a
以前我們創建項目時候,一個頁面的布局是線性或者相對等,當我在AS上新建一個module時,系統默認的最外層布局不再是我們熟悉的五大布局中的一種,而是一個全新的布局:Coo
第5節 Activity的Manifest配置5.1 Activity的聲明Activity作為四大組件,代碼中每定義一個Activity就需要在AndroidManif
Person實體類復制代碼 代碼如下:package com.ljq.domain;public class Person { pri