如何提升安卓架構能力
⑴ 安卓開發需要學什麼
安卓開發需要學:
一、應用程序
Android以java為編程語言,使介面到功能,都有層出不窮的變化,其中Activity等同於J2ME的MIDlet,一個 Activity 類負責創建視窗,一個活動中的Activity就是在 foreground(前景)模式,背景運行的程序叫做Service。
二、中介軟體
操作系統與應用程序的溝通橋梁,並用分為兩層:函數層(Library)和虛擬機(Virtual Machine)。 Bionic是 Android 改良libc的版本。
Android 同時包含了Webkit,所謂的Webkit 就是Apple Safari瀏覽器背後的引擎。Surface flinger 是就2D或3D的內容顯示到屏幕上。Android使用工具鏈(Toolchain)為Google自製的Bionic Libc。
三、硬體抽像層
Android 的 HAL(硬體抽像層)是能以封閉源碼形式提供硬體驅動模塊。HAL
的目的是為了把 Android framework 與 linux kernel 隔開。
讓 Android 不至過度依賴 Linux
kernel,以達成 kernel independent 的概念,也讓 Android framework
的開發能在不考量驅動程序實現的前提下進行發展。
四、編程語言
Android 是運行於 Linux kernel之上,但並不是GNU/Linux。因為在一般GNU/Linux 里支持的功能,Android 大都沒有支持。
包括Cairo、X11、Alsa、FFmpeg、GTK、Pango及Glibc等都被移除掉了。Android又以bionic 取代Glibc、以Skia 取代Cairo、再以opencore 取代FFmpeg 等等。
五、安全控制
目前Android 的 Linux kernel控制包括安全(Security),存儲器管理(Memory Managemeat),程序管理(Process Management),網路堆棧(Network Stack),驅動程序模型等。
下載Android源碼之前,先要安裝其構建工具Repo來初始化源碼。Repo 是 Android 用來輔助Git工作的一個工具。
參考資料來源:網路—android開發
⑵ 如何成為優秀的系統架構師
如何成為優秀的系統架構師
系統架構師的工作是復雜設計總體解決方案以及領域對象的邏輯和物理布局,這是一項在復雜環境中高風險、高影響力的活動。那麼如何才能成為一名優秀的系統架構師呢,一起來學習學習吧!
1、軟體架構的定義:
軟體架構(Software Architecture)也稱之為軟體體系結構,它是一組有關如下要素的重要決策:軟體系統的組織,構成系統的結構化元素,介面和它們相互協作的行為的選擇,結構化元素和行為元素組合成粒度更大的子系統方式的選擇,以及指導這一組織(元素及其介面、協作和組合方式)的架構風格的選擇。換句話說,軟體架構實際上是對系統整體結構設計的刻劃,系統架構師是做全局的、整體的把握工作。架構的組成與決策是架構設計的兩個基本概念。架構=>藍圖+規則+解決方案
軟體架構是一個認識事物的過程:原型、發現、改進、再發現、再改進,這是軟體開發的必由螺旋。
2、架構師成長路線圖:
系統架構師已經不僅僅是技術精湛的技術專家,他需要與業務團隊緊密合作,並且精通市場、業務與管理。從上升趨勢來說,可以有三個層面的路線圖:第一個層面,要關注系統思考。在這個層面,重要的不僅僅是掌握設計的知識點,而是更重視分析能力、創新思維能力的提升,需要更廣闊的思路,這方面的空間相當非常大。這是第一層面的能力基礎。第二個層面,要關注總結和指導,思維空間要轉向群體。如何把已有的經驗總結出來,並讓這種智力資產真正發揮作用?成為架構師上升第二層面的能力基礎。第三個層面,要提升自身的全面修養。我們必須引發自己思維方式的變革,要培養組織力、領導力、創新力以及擁有激情,這是架構師上升第三層面的能力基礎。
要看到自身的弱點,思路要寬,多思考
架構師並不是一個普通的技術人員,他對設計站的角度更高,需要的知識和能力結構更復雜,他需要具有其他人所沒有的思想、眼光和感知世界的方法,必須突破已有的思維模式和行為模式,突破長期束縛自己的思維瓶頸,才可能達到自己從未達到過的高度。
架構師要養成每項工作都記錄並分析的好習慣,以形成更扎實的工作風格。在每個項目完成都需要進行總結。
3、架構師要保持自己的競爭力:
架構師必須關注今天的IT技術、商業模式變革以及由此引發的軟體產業變革的重大趨勢,勤於思考並迎接新的挑戰。一個人最核心的競爭優勢是學習能力。架構師作為技術層面資深的一群,為了保持競爭力需要注意以下幾個問題:(1)、保持激情:關鍵是信念。激情源自於信念,有了信念才會主動挑戰自我,迎接挑戰才會有激情,有了激情工作才會更有意思。(2)、創新思考:在工作中多嘗試一些新方法,是維持自我能力的重要手段。(3)、逆向思維:逆向思維指的是使用與正常思路相反的思維方式去分析同一個問題,使思路多樣化。逆向思維能夠幫助人們沖破傳統思維的束縛,克服慣性思維方式。從反方向考慮問題往往會取得出人意料的結果。
4、架構師要關注軟體的新趨勢:
目前傳統軟體危機暴露出的問題還未真正解決,新的挑戰卻已擺在眼前。在人們不斷思考面臨的挑戰以及對策中,形成了一些新的趨勢,包括:(1)、軟體質量以服務質量形式展現,對質量的投資可獲得更高的投資回報。(2)、軟體過程擴展到用戶,希望更多的用戶深入參與到軟體全生命周期。(3)、功能至上遠遠不夠,用戶體驗得到空前重視。(4)、系統集成模式面臨變革,軟體、服務、終端、IT基礎設施將形成更緊密的價值體系。(5)、研發要更多關注非功能性需求,如安全性質量、性能、可靠性、可擴充性、可伸縮性、可用性等,從而不斷提高軟體的價值。
知識就是力量==>信息就是力量
架構並不完全是概要設計。概要設計還是停留在圖紙上,而架構必須證明這個技術路線可行,並且能夠證明大多數質量風險已經得到了解決。
5、所謂設計就是解決問題的過程:
軟體設計是一種思維活動,設計的魅力在於破解難題,通過直面問題的挑戰,以及對相應解決方案的仔細推敲,才可能設計出真正有靈性的產品。(1)、設計不具普遍性:軟體設計很少具有普通性,不同的目標需要不同的設計來支持。(2)、做出權衡:所謂軟體設計,本質上就是在質量、成本、時間以及其它各種因素之間做出權衡。(3)、記錄設計的理由(設計文檔)。
多關注各種方面的架構設計
6、質量屬性決定了架構風格:
一種架構的風格,很大程度上與設計者如何滿足質量要求的對策有關。需求的功能和非功能兩方面都可能有質量要求。具體歸納如下:(1)、與功能性有關的質量屬性主要包括:A、正確性:是指軟體按照需求正確執行任務的能力。B、健壯性:指的是在異常情況下,軟體能夠正常運行的能力。正確性與健壯性的區別在於,前者是在功能需求之內描述問題,後者是在功能需求之外描述問題。健壯性一般有兩層含義:首先是容錯能力,其次是恢復能力。容錯指的'是發生異常情況不出錯誤的能力,而恢復指的是軟體發生錯誤以後能恢復到沒有發生錯誤錢的狀態的能力。C、可靠性:是一個與時間相關的屬性,指的是在一定的環境下,在一定的時間段,系統不出現故障的概率。通常用平均無故障時間來衡量。(2)、與非功能性有關的質量屬性主要包括:A、性能:是指軟體的“時間-空間”效率,而不僅僅是指軟體運行速度。換句話說是速度要快而佔用資源要少。性能=速度/資源。B、易用性:指的是用戶使用軟體的容易程度。C、清晰性:意味著工作成果易讀、易理解。D、安全性:它的目的是系統應該具備防止非法入侵的能力,這既屬於技術問題也屬於管理問題。E、可擴展性:這反映軟體適應“變化”的能力,包括需求、設計的變化、演算法的改進和變化。F、可移植性:指的是軟體不經修改(或者稍加修改)就可以在不同軟硬體環境中使用的能力。
7、抵制前期進行龐大設計的誘惑:
(1)、架構應該具備易演化特徵;(2)、項目開發周期不要超過6個月;(3)、分而治之:抓住真正的需求、分而治之(把大項目分成小項目)、設置優先順序、盡快交付;(4)、增量式開發與交付:如果前期需求比較清楚,可以把一個大項目分成若干相對獨立能夠持續交付的部分,這樣就可以把大問題分成若干小問題;(5)、迭代式開發與交付:如果前期需求不是太清楚,項目帶有強烈的創新成分,可以使用具有強迭代的逐步求精的模型。
8、重構:
在不影響整體外部行為的前提下,不斷地對軟體進行細微的設計改進,這種漸進式的實踐叫做重構。通過重構不僅能夠降低維護成本,而且也為我們提供了改進代碼質量的通用標准,並使我們能迅速添加新功能。從本質上說,重構根本上就是一個態度問題,而不全是技術問題。
在集中精力完成了代碼邏輯以後,就需要集中精力做第二件事情,那就是重構。在對代碼進行重構時,我們不會增加新功能,甚至也不會去修復bug。相反,我們會通過將代碼變得更易於理解來提升代碼的可讀性。
重構要堅持不懈:(1)重構可以加快進度;(2)、重構應該是小步驟地進行;(3)、技術債務積累越多,重構的難度就越大。
9、對結構進行優化的基本原則:
在完成了功能邏輯之後,除了代碼重構以外,很多情況下還需要重新審視一下軟體結構,對結構進行重構。良好的結構設計需要遵循一些原則,而原則本身就是經驗的總結。依據這些原則,我們就可以在設計中有良好的設計指向。如需求不變則不需結構。
結構的4條設計原則:(1)單一職責原則(SRP):也被稱之為內聚性原則;SRP原則的描述為:就一個類而言,應該僅有一個引起它變化的原因;(2)、開放--封閉原則(OCP):OCP的關鍵是依賴於抽象。OCP原則的目的,是要求我們設計的軟體實體(類、組件、函數等等)應該是可以擴展的,但是不可修改的。A、對於擴展是開放的:這意味著組件的行為是可以擴展的,當應用的需求改變時,我們可以對組件進行擴展,使其具有滿足那些改變的新行為。換句話說我們可以改變組件的功能。B、對於更改是封閉的:對組件行為進行擴展時,不必改動組件的源代碼,無論是動態鏈接庫、DLL或者是Java的jar文件都無需改動。(3)、依賴倒置原則(DIP):使用傳統的結構化設計所創建出來的依賴關系結構,策略是依賴於細節的,這是糟糕的,因為這樣會使策略受到細節改變的影響。面向對象的程序設計倒置了依賴關系結構,使得細節和策略都依賴於抽象,並且常常是客戶擁有服務介面。事實上,這種依賴關系的倒置正是好的面向對象設計的標志所在。DIP的原則是:A、高層組件不應該依賴於低層組件。二者都應該依賴於抽象;B、抽象不應該依賴於細節,細節應該依賴於抽象。(4)、介面隔離原則(ISP):這個原則用來處理“胖(fat)”介面所具有的缺點。類的“胖”(不內聚)介面可以分解成多組方法。每一組方法都服務於一組不同的客戶程序。這樣,一些客戶程序可以使用一組成員函數,而其它客戶程序可以使用其它組的成員函數。實際中當然也存在有一些對象,它們確實不需要內聚的介面,但是ISP建議客戶程序不應該看到它們作為單一的類存在。相反,客戶程序看到的應該是多個具有內聚介面的抽象基類。
10、關注變化、關注特徵:
擁抱著變化而設計。讓變化成為一個重要的設計要素,需求總是會發生變化。面向對象是個思維方式。基於介面進行設計。
軟體復用(SoftwareReuse):是將已有軟體的各種有關知識用於建立新的軟體,以縮減軟體開發和維護的花費。軟體復用是提高軟體生產力和質量的一種重要技術。早期的軟體復用主要是代碼級復用,被復用的知識專指程序,後來擴大到包括領域知識、開發經驗、設計決定、體系結構、需求、設計、代碼和文檔等一切有關方面。
軟體重用,是指在兩次或多次不同的軟體開發過程中重復使用相同或相似軟體元素的過程。軟體元素包括程序代碼、測試用例、設計文檔、設計過程、需要分析文檔甚至領域知識。通常,可重用的元素也稱作軟構件,可重用的軟構件越大,重用的粒度越大。
11、面向服務的架構(Service-OrientedArchitecture, SOA):
面向服務的架構成功的要點是服務識別。服務識別的基本過程:(1)、了解項目的性質;(2)、業務牽頭,一定不是技術牽頭;(3)、明確產品的戰略目標;(4)、研究企業業務流程;(5)、重用行業製品;(6)、建立契約基線;(7)、完善服務屬性等級矩陣(ARMS);(8)、使用業務敏捷場景模擬(BASS)進行測試;(9)、擁抱變更。
12、架構與框架的區別:
框架是一個軟體,但架構不是軟體,而是關於軟體如何設計的重要決策。但是在引入軟體框架以後,軟體架構決策往往會體現在框架設計之中。不論是架構技術還是框架技術,都是為了解決軟體日益復雜所帶來的困難,而採取的“分而治之”的結果。架構的思維是先大局後局部,這是一種問題在抽象層面地解決方案,首先考慮大局而忽略細節。框架的思維是先通用後專用,這是一種半成品,還需要通過後期的定製才能成為具體的軟體。
框架和架構的關系可以總結為兩個方面:(1)、為了盡早驗證架構設計,或者出於支持產品線開發的目的,可以把通用機制甚至整個架構以框架方式實現;(2)、企業可能存在大量可重用框架,這些框架可能已經實現了架構所需的重要機制,或者對某個子系統提供了可擴展的半成品,最終軟體架構可以藉助這些框架來構造。
框架設計最重要的部分,其實並不在於採用何種技術方案來實現,而是對已經存在的業務過程進行深入思考,尋找它們的共性,探究其中的規律,建立恰當的模式,然後選擇恰當的技術實現方案。
帶團隊關鍵因素:決心、手段(方法)、激情、信心,技術不是關鍵因素。
13、把經驗歸納總結成理論:
總結是兩方面的,(1)總結過程:歸納出良好設計必須遵循的步驟,以及每一步驟的目標、解決什麼問題、應該有什麼樣的思考點和思考方向。(2)總結模式(設計模式):模式是一種實踐經驗的總結,通過總結每個思考點的各種解決方案,並且和過程的節點裝配在一起,形成能夠指導他人的模式語言。
;⑶ 怎麼提高安卓系統CPU的運行速度
安卓系統的運行速度取決於CPU
架構和主頻,還有運行內存(RAM)的大小。可以說RAM越大,運行越流暢,但RAM的大小改不了的,所以可以想辦法提高CPU的主頻。一般CPU的頻率是按照需求系統自動調節的,空閑的時候頻率會降低。
首先確定你的手機已經ROOT。其實去網上看看,CPU超頻的軟體有很多,可以隨便找一些。而且安兔兔的「CPU大師」等也提供了使CPU鎖定在最高頻率的功能。
雖然提高CPU頻率會使手機運行快一些,但這樣的話耗電量會明顯增加。(我試過把CPU鎖在1200MHz,結果一分鍾掉1%的電……)CPU大師里有計劃功能,可以在裡面設置比如鎖屏時頻率降到最低等等。這樣的話也許還可以……
不過不管怎麼說超頻提升有限,會帶來發熱和用電加快等問題。所以最好還是買一部高配置手機吧,所謂一分價錢一分貨——
話說你的208是指什麼?要是208MHz的話應該只是最低頻率,你使用程序時會自動升高的。
⑷ 一個資深的Android開發者需要掌握哪些技能
1.Android/iphone平台手機終端軟體開發精通Android開發平台及框架,一年以上實際開發經驗;
2.精通Android GUI程序開發;
3.1年以上J2ME開發經驗,熟悉J2ME編程;熟悉Linux環境編程優先 ;從事過嵌入式開發工作2年以上。
4.熟悉HTML/WML/HTTP,具有良好的編程思想;
5.熟悉C/C++或者Java開發語言和環境;
6.有一年以上移動終端應用軟體開發經驗,有Android或者iPhone開發經驗尤佳;
7.基礎扎實,精通常用數據結構與演算法和設計能力;
8.熟悉移動終端特性和開發特點; 熟悉移動終端網路編程,了解3G\WiFi等技術;
9.熟悉C++/C#, MSSQL/MySQL資料庫開發;熟悉多線程、Socket或ACE等網路通信編程技術;
10.熟悉java各種編程方法,比如多線程,jni,idl等。 熟悉JVM的運行機制,移植或者擴展過JVM到嵌入式平台者優先,比如phoneme 等。
11.精通Android平台UI開發優先;英語良好,能閱讀英文資料;
工作職責:
1.負責Android平台的瀏覽器開發。
2.在Android手機上設計並開發應用程序或游戲;
3.Android平台框架層的維護以及擴展。
4.移植各種流行的框架體系(多媒體,藍牙,無線)到android上負責Android項目的開發工作;
5.負責Android項目的架構設計、方案的制定;
6.跟進Android的新技術發展。纂寫設計開發及實現文檔;
7.根據產品功能需求設計並完成軟體實現;
8.參與產品需求分析並制定技術實施方案;
⑸ 系統架構師的技能要求
系統架構師的技能要求
架構師負責設計系統整體架構,確定系統實現的行動綱領,使設計的項目盡量高性能、高可用、易實現,並且在上線後運維方便,在新功能加入時擴展性良好。那麼系統架構師的技能要求有哪些呢?
架構師的能力要求:
1. 較強的代碼能力,對日常問題有豐富的閱歷及解決之道,設計不是空談,需要實踐,代碼能力、解決問題的能力是系統實踐的一個副產品;
2. 較好的抽象能力,業務需求在架構師消化後,需要轉化為設計藍圖,這中間需要大量的抽象。
3. 良好的溝通和組織能力,架構設計出來,需要組織討論、頻繁溝通,讓項目組成員理解架構組成及設計取捨的原因,明白架構設計中的how和why,在遇到疑問、反對、建議時,能進行良好的溝通並有序的推進。
4. 較好的團隊協作能力和領導能力,架構師需要得到項目組成員的認可,在關鍵時刻對技術的選擇作出及時、有效的決定,並為決定負責。
架構師的主要職責:
1. 把業務需求轉換為實現架構,定義每個組成模塊的外部特性,比如它的依賴、性能、異常處理等,並確定模塊之間如何通信,最終形成可以指導業務開發的行動圖;
2. 組織討論,組織更多的人來了解、討論架構,能夠讓大家理解架構整體方案、模塊特性及邊界、決策權衡點,進而可以自行進行組件服務的設計及實現;
3. 協助項目經理制定開發計劃和控制項目進度;
4. 確定系統的基礎架構、實現技術,必要時組織技術調研和攻關。
延伸閱讀:架構師應該是一種角色
每個資深的團隊成員都可以也應該扮演架構師的角色,不用每個團隊指定一個人來當。實際上,最好有多個人來扮演架構師。在會議中討論架構設計和討論功能設計類似,如果你是那個要實現所有事情的人,那麼你需要帶著明確的想法去參會。任何的過度設計(大部分架構師經常會犯這個錯誤)需要在你面前證明是合理的——“我是否願意去寫這些模板代碼,或者是否有一種更簡單優雅的.實現方式”。
職位可以使“軟體工程師”,但角色可以是“敏捷大師”、”架構師”、”持續集成官”,等等。如果公司需要一個“架構師議會”去決定系統間更宏觀的整合,開發者可以提名某個人去參與這些會議,這個人有可能是對這些系統最了解的人。
我知道現在架構師在想什麼——有一些更加高層次的關注點開發要麼不太能理解要麼不應該為此被打擾。大錯特錯!如果你的開發不理解更高層次的架構規劃,那麼遲早你會遇到問題的。是的,因為他們要讓代碼適應你正在規劃的更大的藍圖,他們需要被打擾。
還有一方面於團隊成員的態度和動態的交流。如果某個不是特別優秀或者受人尊敬的開發被提升為“架構師”,那麼可能破壞團隊的和諧。另一方面,某些人被提升為“架構師”以後可能會過於自信,以至於他們會想當然的去做出設計決定,而不管那些反對他們的好的爭論點。
;⑹ 如何成為一名Android架構師
架構師從來都不是看書看來的,需要長久的實踐與累積。最好的方式就是在工作中累積。
首先,你得明確,你是在做產品,不是做項目。
其次,架構的前期需求分析與建模非常重要,多思考未來可能的擴展。
最後,最好有一定的代碼規范甚至是潔癖。
要用嚴格的標准來要求自己,是否當上架構師其實沒差,無非就是希望自己成為團隊核心得到更多的認可而已。
如覺得自己目前的工作沒什麼挑戰性,也可以自己來設計一款產品,從需求到架構到實現。碰到那種常見的需求,可以參考一些成熟的第三方開源項目,另外在看第三方項目時,要明白what how why。
what 這個項目是為了解決什麼問題而生的,提供了什麼樣的API?
how 它是如何實現的?有哪些小的功能模塊組成?它們是怎樣解耦的?如果我有擴展需求,我該如何改?
why 為什麼會這樣來實現?有沒有更好的方案?
一般來說,我們看代碼,基本順序是what how why,能去翻源碼理解how的不多,真正做到why的少的可憐。如果你想提升技術成為主力,那至少,你得多去理解how,試圖去解釋why。
⑺ 如何做一個優秀的架構師
《00-金融架構師 三期(大量課程)》網路網盤資源免費下載
鏈接:https://pan..com/s/1LqygEcoZLBUKp3lwLreHuA
00-金融架構師 三期(大量課程)|股權投資系列課程|20.中國十大金融高手及項目分享(翟山鷹)|19.金融項目研討會(孔憲富)|18.金融資本運營問題與迴避(孔憲富)|17.期貨與金融衍生品(翟山鷹)|16.股權私募基金(劉泓毅)|15.信託(孫金剛)|14.投資與理財(劉贏)|13.中國文化(翟山鷹)|12.財務與稅務(翟山鷹)|11.政府性融資(朱瑾)|10.融資租賃 (楊茗皓)|09.品牌與資本(孔憲富)|08.商業銀行(曾德君)
⑻ 如何提升軟體架構能力
有學習才會有提高,找有豐富經驗的前輩學習是再好不過的方法,要是身邊沒有這類人,你也可以參加希賽軟體架構設計案例分析與最佳實踐課程的企業內訓。
⑼ 北大青鳥java培訓:如何學習安卓軟體開發技術
安卓的市場份額還會不斷的上升,使得企業對於安卓工程師的需求呈現出爆炸式的增長。
所以選擇學習安卓開發,無論是從薪資待遇還是發展前景來說,都是不錯的選擇。
如何學習安卓軟體開發技術?首先要注重基礎階段的學習,掌握好基礎。
了解安卓的基本構建。
學習學習編寫代碼和程序,這樣才能擁有扎實的編程功底。
如果是剛開始接觸安卓開發,不妨去選擇一個專業的培訓機構來學習,例如河北北大青鳥嘉薈學校。
即使是零基礎也不用擔心。
他們對課程有合理的安排,保證不會落下任何一位學員。
其次,看Android源代碼,多練習,敢於嘗試。
知識學得差不多了,可以自己嘗試做一些游戲開源。
河北河北IT培訓http://www.kmbdqn.cn/建議要積極的增加實戰的練習,對於想要從事安卓開發的學生來說,也是很好的鍛煉,能力提高了,就為將來拿高薪做好的准備。
最後,要多參加項目訓練。
學校有相對多的訓練課程來提升學員的水平。
平時要多注重經驗的積累。
這樣在將來找工作的過程中才會一帆風順。
北大青鳥嘉薈學校還有完善的就業保障,100%保證學員就業,並且月薪都在4000元以上。
有很多想要學安卓開發的學生都加入到河北北大青鳥這個大家庭中,通過北大青鳥走向了成功。
⑽ Android 驅動開發應該如何入門和學習成長
一.認識android的架構
Android其本質就是在標準的Linux系統上增加了Java虛擬機Dalvik,並在Dalvik虛擬機上搭建了一個JAVA的application framework,所有的應用程序都是基於JAVA的application framework之上。
android分為四個層,從高層到低層分別是應用程序層、應用程序框架層、系統運行庫層和linux核心層。
二.搭建環境
搭建開發環境
對國內的開發者來說最痛苦的是無法去訪問android開發網站。為了更好的認識世界,對程序員來說,會翻牆也是的一門技術,帶你去領略牆外的世界,好了,不廢話了, 國內開發者訪問(androiddevtools) 上面已經有了所有你要的資源,同時可以下載到我們的主角framework
但是這樣的搭建只能去閱讀源代碼,我們無法去更進一步去實現自己的rom,我們看到錘子的系統在早期的開放rom是自己從新實現了framework的代碼,現在看起來他成功了,所以我們還要去搭建android系統的源碼編譯環境。
搭建源碼編譯環境
三.開始主題
在一開始寫c程序的時候都有一個運行的入口,比如
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
//這里的main就是應用的入口
int main(int argc, const char * argv[]){
return 0;
}
在計算機網路原理中我們用socket實現一個伺服器端,不斷的接聽客戶端的訪問,而且他的代碼是這樣實現的:
#include <winsock2.h>
#pragma comment(lib, "WS2_32.lib")
#include <stdio.h>
void main()
{
WORD wVersionRequested;//版本號
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD(2, 2);//2.2版本的套接字
//載入套接字型檔,如果失敗返回
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0)
{
return;
}
//判斷高低位元組是不是2,如果不是2.2的版本則退出
if (LOBYTE(wsaData.wVersion) != 2 ||
HIBYTE(wsaData.wVersion) != 2)
{
return;
}
//創建流式套接字,基於TCP(SOCK_STREAM)
SOCKET socSrv = socket(AF_INET, SOCK_STREAM, 0);
//Socket地址結構體的創建
SOCKADDR_IN addrSrv;
addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY);//轉換Unsigned long型為網路位元組序格
addrSrv.sin_family = AF_INET;//指定地址簇
addrSrv.sin_port = htons(6000);
//指定埠號,除sin_family參數外,其它參數都是網路位元組序,因此需要轉換
//將套接字綁定到一個埠號和本地地址上
bind(socSrv, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR));//必須用sizeof,strlen不行
listen(socSrv, 5);
SOCKADDR_IN addrClient;//字義用來接收客戶端Socket的結構體
int len = sizeof(SOCKADDR);//初始化參數,這個參數必須進行初始化,sizeof
//循環等待接受客戶端發送請求
while (1)
{
//等待客戶請求到來;當請求到來後,接受連接請求,
//返回一個新的對應於此次連接的套接字(accept)。
//此時程序在此發生阻塞
SOCKET sockConn = accept(socSrv, (SOCKADDR*)&addrClient, &len);
char sendBuf[100];
sprintf(sendBuf, "Welcome %s to JoyChou",
inet_ntoa(addrClient.sin_addr));//格式化輸出
//用返回的套接字和客戶端進行通信
send(sockConn, sendBuf, strlen(sendBuf)+1, 0);//多發送一個位元組
//接收數據
char recvBuf[100];
recv(sockConn, recvBuf, 100, 0);
printf("%s\\n", recvBuf);
closesocket(sockConn);
}
}
他採用了一個while死循環去監聽客戶端的請求。
先上源代碼
public final class ActivityThread {
public static void main(String[] args) {
SamplingProfilerIntegration.start();
CloseGuard.setEnabled(false);
Environment.initForCurrentUser();
EventLogger.setReporter(new EventLoggingReporter());
Security.addProvider(new AndroidKeyStoreProvider());
final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());
TrustedCertificateStore.setDefaultUserDirectory(configDir);
Process.setArgV0("<pre-initialized>");
Looper.prepareMainLooper();
//從中可以看到為app開辟了一個線程進入了looper之中
ActivityThread thread = new ActivityThread();
thread.attach(false);
if (sMainThreadHandler == null) {
sMainThreadHandler = thread.getHandler();
}
AsyncTask.init();
if (false) {
Looper.myLooper().setMessageLogging(new
LogPrinter(Log.DEBUG, "ActivityThread"));
}
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
}
看到源碼失望了,沒有一個while循環啊,其實用了他方法實現
//用一個looper的機制循環監聽響應
Looper.prepareMainLooper();
Looper.loop();
進一步深入代碼
public static void loop() {
final Looper me = myLooper();
if (me == null) {
throw new RuntimeException("No Looper; Looper.prepare() wasn't called on this thread.");
}
final MessageQueue queue = me.mQueue;
Binder.clearCallingIdentity();
final long ident = Binder.clearCallingIdentity();
// 在這里看到了一個循環監聽消息
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
Printer logging = me.mLogging;
if (logging != null) {
logging.println(">>>>> Dispatching to " + msg.target + " " +
msg.callback + ": " + msg.what);
}
msg.target.dispatchMessage(msg);
if (logging != null) {
logging.println("<<<<< Finished to " + msg.target + " " + msg.callback);
}
// Make sure that ring the course of dispatching the
// identity of the thread wasn't corrupted.
final long newIdent = Binder.clearCallingIdentity();
if (ident != newIdent) {
Log.wtf(TAG, "Thread identity changed from 0x"
+ Long.toHexString(ident) + " to 0x"
+ Long.toHexString(newIdent) + " while dispatching to "
+ msg.target.getClass().getName() + " "
+ msg.callback + " what=" + msg.what);
}
msg.recycleUnchecked();
}
}