日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

前言

一文讀懂 Android 系統(tǒng)的源代碼

 

目前,互聯(lián)網(wǎng)行業(yè)正在朝著移動(dòng)互聯(lián)網(wǎng)方向強(qiáng)勁地發(fā)展,而移動(dòng)互聯(lián)網(wǎng)的發(fā)展離不開背后的移動(dòng)平臺(tái)的支撐; 眾所周知,如今在移動(dòng)平臺(tái)市場(chǎng)上,蘋果的IOS、谷歌的Android和微軟的windows Phone系統(tǒng)已經(jīng)形成了三足鼎立的形勢(shì),而Android系統(tǒng)的市場(chǎng)占有率是最高的

Android系統(tǒng)之所以能夠在市場(chǎng)上占據(jù)著第一的位置,一來是因?yàn)樗劳兄雀璧钠返滦?yīng)和技術(shù)實(shí)力,二來是因?yàn)樗情_放的,任何人都可以得到它的源代碼,并且能夠自由地使用它; 既然Android系統(tǒng)是開放的,作為一個(gè)移動(dòng)平臺(tái)開發(fā)人員來說,當(dāng)然希望能夠深入地去分析和研究它的源代碼了,然而,Android系統(tǒng)的源代碼非常龐大,我們需要循序漸進(jìn)地去學(xué)習(xí)

工欲善其事,必先利其器; 為了全面、深入地理解Android系統(tǒng)的源代碼,在正式進(jìn)入Android系統(tǒng)源代碼的世界前,我們需要準(zhǔn)備實(shí)驗(yàn)環(huán)境;此外,還需要了解Android系統(tǒng)的架構(gòu)知識(shí)

硬件環(huán)境要求

1、編譯環(huán)境

按照官方的說法,編譯Android 2.3.x及以上版本的系統(tǒng)源碼需要64位的系統(tǒng)運(yùn)行環(huán)境來支持,而編譯2.3.x以下的版本則需要32位的系統(tǒng)運(yùn)行環(huán)境

2、硬盤空間

官方建議最好預(yù)留100G的磁盤空間來下載源碼,150G的磁盤空間用來編譯源碼,如果使用了ccache(一個(gè)高速編譯緩存工具,可以大幅加快gcc的編譯速度),那么則需要更大的空間來支持

所以盡可能地保證自己的磁盤空間夠大吧,之前就因?yàn)榇疟P空間預(yù)留不夠?qū)е略创a編譯過程中空間不足,狠狠地把自己坑了一把

3、內(nèi)存空間

如果你是在虛擬機(jī)上跑linux,官方建議至少需要16G的內(nèi)存空間,我的機(jī)器只有8G的內(nèi)存空間跑虛擬機(jī),目前跑起來也沒太大問題,就是編譯源碼的過程非常漫長(zhǎng),不知道是否跟內(nèi)存大小有關(guān)

軟件環(huán)境要求

1、操作系統(tǒng)

Android系統(tǒng)的源碼的編譯支持 Linux 跟 mac OS 兩種操作系統(tǒng); 一般情況下,Android系統(tǒng)源碼都是在Linux Ubuntu系統(tǒng)上進(jìn)行開發(fā)與測(cè)試的,所以如果你準(zhǔn)備使用Linux系統(tǒng)來進(jìn)行源碼編譯,那一般推薦安裝Ubuntu版本的Linux

下面列出了各Android版本與編譯系統(tǒng)版本的對(duì)應(yīng)關(guān)系:

Linux:

一文讀懂 Android 系統(tǒng)的源代碼

 

Mac OS:

一文讀懂 Android 系統(tǒng)的源代碼

 

2、JDK 版本要求

不同的Android版本編譯也需要對(duì)應(yīng)的JDK環(huán)境,這里列出了各版本之間的對(duì)應(yīng)關(guān)系

一文讀懂 Android 系統(tǒng)的源代碼

 

環(huán)境搭建

開發(fā)Android應(yīng)用程序可以在兩種環(huán)境下進(jìn)行; 一是在Android SDK環(huán)境下進(jìn)行,一般是集成在Eclipse里面進(jìn)行開發(fā),二是在Android源代碼工程環(huán)境下進(jìn)行,在這種環(huán)境進(jìn)行開發(fā)的好處是可以使用一些在SDK中不公開的接口

但是如果我們要修改Android系統(tǒng)的源代碼,或者為Android系統(tǒng)增加新的功能接口,那么就只能在Android源代碼工程環(huán)境下進(jìn)行了; 由于我們的目的是對(duì)Android系統(tǒng)源代碼進(jìn)行分析,因此,我們?cè)陂_發(fā)Android應(yīng)用程序時(shí),也在Android源代碼環(huán)境下進(jìn)行;這樣,我們就需要搭建一套Android源代碼工程環(huán)境了

目前,Android源代碼工程環(huán)境只能在Linux平臺(tái)上使用,而Linux系統(tǒng)的發(fā)行版本比較多,這里我們推薦Ubuntu系統(tǒng); Ubuntu系統(tǒng)是免費(fèi)的,而且非常易于使用,安裝和更新應(yīng)用程序也非常方便

安裝好Ubuntu系統(tǒng)之后,我們就可以在上面下載、編譯和安裝Android源代碼了

Android系統(tǒng)的源代碼工程默認(rèn)是不包含Linux內(nèi)核源代碼的; 如果我們需要修改Android系統(tǒng)的內(nèi)核或者在里面增加新的模塊,那么就要把Android內(nèi)核源代碼一起下載、編譯和安裝了

Android源代碼工程環(huán)境搭建好了之后,我們就可以在里面開發(fā)新的應(yīng)用程序或者修改系統(tǒng)代碼了; 增加了新的應(yīng)用程序或者修改了系統(tǒng)的代碼之后,不需要重新編譯整個(gè)源代碼工程,只要單獨(dú)編譯有改動(dòng)的模塊就可以了

對(duì)于已經(jīng)開發(fā)好的應(yīng)用程序或者系統(tǒng)功能; 如果想把當(dāng)作Demo展示給客戶來體驗(yàn)時(shí),我們既可以在真機(jī)上面運(yùn)行,也可以在模擬器(Android源代碼工程環(huán)境或者Android SDK環(huán)境都集成了模擬器)上面運(yùn)行

當(dāng)我們手頭上沒有真機(jī),而且我們又不想把整個(gè)Android源代碼工程環(huán)境或者Android SDK環(huán)境帶去展示我們的Demo時(shí),就可以考慮把模擬器這兩個(gè)環(huán)境中獨(dú)立出來了

系統(tǒng)架構(gòu)

Android系統(tǒng)是按層次、分模塊來設(shè)計(jì)的; 在我們著手對(duì)Android系統(tǒng)的源代碼進(jìn)行分析前,需要對(duì)Android系統(tǒng)的架構(gòu)有一個(gè)總體的認(rèn)識(shí),這樣我們就能夠快速地知道哪些代碼位于哪個(gè)層次上的哪個(gè)模塊中,節(jié)省搜索代碼的時(shí)間,把更多的精力投入在源代碼的分析上去

整個(gè)系統(tǒng)劃分內(nèi)核空間和用戶空間兩部分; 內(nèi)核空間包含了進(jìn)程管理、內(nèi)存管理以及設(shè)備驅(qū)動(dòng)程序模塊等,其中Android專用驅(qū)動(dòng)Binder、Logger和Ashmem就是在內(nèi)核空間實(shí)現(xiàn)的

用戶空間包含了硬件抽象層(HAL)、外部庫(kù)和運(yùn)行時(shí)庫(kù)層(External Libraries & Android Runtime)、應(yīng)用程序框架層(Application Framework)和應(yīng)用程序?qū)樱ˋpplications)四個(gè)層次; 我們應(yīng)該如何去掌握這個(gè)層次結(jié)構(gòu)呢?最好的方法就是從學(xué)習(xí)Android的硬件抽象層作為切入點(diǎn)了

可能大家會(huì)覺得比較奇怪,為什么要把Android系統(tǒng)的硬件抽象層作為學(xué)習(xí)Android系統(tǒng)架構(gòu)的切入點(diǎn)呢?

其實(shí)是這個(gè)層次因?yàn)樯婕暗接布?,看起來這是一個(gè)比較復(fù)雜和深?yuàn)W的知識(shí)點(diǎn); 實(shí)則不然,Android系統(tǒng)的硬件抽象層在實(shí)現(xiàn)和使用上,層次都是非常清晰的,它從上到下涵蓋了Android系統(tǒng)的用戶空間和內(nèi)核空間

內(nèi)核空間主要就是涉及到硬件驅(qū)動(dòng)程序,而用戶空間就涉及到了Android系統(tǒng)應(yīng)用程序?qū)?、?yīng)用程序框架層和系統(tǒng)運(yùn)行時(shí)庫(kù)層的相關(guān)知識(shí); 因此,學(xué)習(xí)Android系統(tǒng)的硬件抽象層,可以使大家快速地認(rèn)識(shí)整個(gè)Android系統(tǒng),從而對(duì)Android系統(tǒng)得到一個(gè)感性的認(rèn)識(shí),為后面深入分析Android系統(tǒng)的源代碼打下良好的基礎(chǔ)

學(xué)會(huì)了編寫基本的Android應(yīng)用程序并且對(duì)Android系統(tǒng)的整體架構(gòu)有一個(gè)大概的了解之后,我們就可以去分析Android系統(tǒng)的源代碼了

在分析Android源代碼的過程中,我們經(jīng)常進(jìn)入到應(yīng)用程序框架層去分析它的源代碼; 而在應(yīng)用程序框架層中,有一部分代碼是使用C++來實(shí)現(xiàn)的,這時(shí)候就會(huì)經(jīng)常碰到智能指針,因此,我們把Android系統(tǒng)中的智能指針也作為一個(gè)基礎(chǔ)知識(shí)點(diǎn)來學(xué)習(xí)

相信使用過C++語(yǔ)言來做開發(fā)的讀者對(duì)智能指針不會(huì)感到陌生; 用C++來寫代碼最容易出錯(cuò)的地方就是指針了,一旦使用不當(dāng),輕則造成內(nèi)存泄漏,重則造成系統(tǒng)崩潰,因此,系統(tǒng)為我們提供了智能指針,避免出現(xiàn)上述問題

在Android系統(tǒng)中,提供了三種類型的智能指針,分別是輕量級(jí)指針、強(qiáng)指針和弱指針,它們都是基于對(duì)象引用計(jì)數(shù)技術(shù)來實(shí)現(xiàn)的;

輕量級(jí)指針的計(jì)數(shù)技術(shù)比較簡(jiǎn)單,只要對(duì)象的引用計(jì)數(shù)值為0,它就會(huì)被釋放

強(qiáng)指針和弱指針的計(jì)數(shù)技術(shù)相對(duì)比較復(fù)雜; 一個(gè)對(duì)象可以同時(shí)被強(qiáng)指針和弱指針引用,但是這個(gè)對(duì)象的生命周期一般只受強(qiáng)指針的控制,即當(dāng)這個(gè)對(duì)象的強(qiáng)引用計(jì)數(shù)為0的時(shí)候,這個(gè)對(duì)象就被釋放了,即使這時(shí)候這個(gè)對(duì)象的弱引用計(jì)數(shù)不為0

引進(jìn)強(qiáng)指針和弱指針這種復(fù)雜的引用計(jì)數(shù)技術(shù)是為了解決垃圾收集(Garbage Collection)問題而提出的; 考慮這樣的一個(gè)場(chǎng)景,系統(tǒng)中有兩個(gè)對(duì)象A和B,在對(duì)象A的內(nèi)部引用了對(duì)象B,而在對(duì)象B的內(nèi)部也引用了對(duì)象A

當(dāng)兩個(gè)對(duì)象A和B都不再使用時(shí),垃圾收集系統(tǒng)會(huì)發(fā)現(xiàn)無法回收這兩個(gè)對(duì)象的所占據(jù)的內(nèi)存的; 因?yàn)橄到y(tǒng)一次只能收集一個(gè)對(duì)象,而無論系統(tǒng)決定要收回對(duì)象A還是要收回對(duì)象B時(shí),都會(huì)發(fā)現(xiàn)這個(gè)對(duì)象被其它的對(duì)象所引用,因而就都回收不了,這樣就造成了內(nèi)存泄漏

如果采用強(qiáng)指針和弱指針技術(shù),這個(gè)問題就迎刃而解了,即A和B都用弱指針來引用對(duì)方

尾述

文章基本上就到這里,文章只是對(duì) Android 源碼做了一些個(gè)人理解的東西,如有地方不對(duì)或者有不同理解的可以提出來

有需要獲取更多Android相關(guān)資訊的同學(xué) 可以 私信發(fā)送 “進(jìn)階” 或 “筆記” 即可 免費(fèi)獲取

現(xiàn)在發(fā)送還可以獲得 更多《Android 學(xué)習(xí)筆記+源碼解析+面試視頻》

最后我想說:

對(duì)于程序員來說,要學(xué)習(xí)的知識(shí)內(nèi)容、技術(shù)有太多太多,要想不被環(huán)境淘汰就只有不斷提升自己,從來都是我們?nèi)ミm應(yīng)環(huán)境,而不是環(huán)境來適應(yīng)我們

當(dāng)程序員容易,當(dāng)一個(gè)優(yōu)秀的程序員是需要不斷學(xué)習(xí)的; 從初級(jí)程序員到高級(jí)程序員,從初級(jí)架構(gòu)師到資深架構(gòu)師,或者走向管理,從技術(shù)經(jīng)理到技術(shù)總監(jiān),每個(gè)階段都需要掌握不同的能力。早早確定自己的職業(yè)方向,才能在工作和能力提升中甩開同齡人

技術(shù)是無止境的,你需要對(duì)自己提交的每一行代碼、使用的每一個(gè)工具負(fù)責(zé),不斷挖掘其底層原理,才能使自己的技術(shù)升華到更高的層面

Android 架構(gòu)師之路還很漫長(zhǎng),與君共勉

PS:有問題歡迎指正,可以在評(píng)論區(qū)留下你的建議和感受;

歡迎大家點(diǎn)贊評(píng)論,覺得內(nèi)容可以的話,可以轉(zhuǎn)發(fā)分享一下

分享到:
標(biāo)簽:系統(tǒng) Android
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定