1. 安卓開發需要學習什麼
學習分三個階段:
1,android基礎階段:平台架構特性(java/C) Market/應用程序組件 環境搭建與部署/打包與發布 AVD/DDMS/AAPT 調試與測試 相關資源訪問/資源製作 Activity/Service/Broadcast Receiver/Content Provider/原理(生命周期)及深層實現
2,Android進階初級:組件Widget/ 菜單Menu/ 布局Layout 詳解 Xml解析(Pull/Dom/Sax)/JNI 解析SQL資料庫原理,。
SQLite /SharedPreferences/File詳解 多媒體Audio/Video/Camera 詳解
3,Android進階高級:藍牙/WIFI SMS/MMS 應用實現 深層次解析GPS原理。
實現LocationManager/LocationProvider 進行定位/跟蹤/查找/趨近警告以及Geocoder正逆向編解碼等技術細節 2D圖形庫(Graphics/View)詳解 SDCARD/感測器/手勢 應用實現
(1)安卓源碼設計模式擴展閱讀:
知識體系
1、Unix/Linux平台技術:基本命令,Linux下的開發環境
2、企業級資料庫技術:SQL語言、SQL語句調優、Oracle資料庫技術
3、Java 語言核心技術:Java語言基礎、Java面向對象編程、JDK核心API、Java集合框架、Java網路編 程、JavaI/O編程、Java多線程編程、Java異常機制、Java安全、JDBC、XML
4、軟體工程和設計模式:軟體工程概述、配置管理及SVN、UML、基本設計模式
5、Android應用開發基礎:Android開發平台、Eclipse+ADT開發環境、AVD及感測模擬器調試、Android核心組件、Android常用組件、Android高級組件、文件及網路訪問、SQLite資料庫編程、後台服務編程
6、互聯網核心技術: HTML、CSS、JavaScript、JQuery、Ajax應用
7、Android高級應用開發:音頻視頻攝像頭、互聯網應用、GPS和位置服務、Google Map、2D3D繪制、感測器開發、游戲開發、電話及SMS服務、網路BluetoothWi-Fi等。
8、Android系統級開發:移植、驅動、NDK(C方向)。
9、JavaEE核心技術:Servlet核心技術、JSP核心技術、Struts、Spring、Hibernate框架。
2. 想成為一個Android開發工程師,還需學習其他什麼技術
開發android,需要掌握這些基礎。
①Java基礎知識 ②Linux基礎知識 ③資料庫基礎知識 ④網路協議 ⑤Android基礎知識 ⑥伺服器端開發知識①Java基礎知識
很多朋友一上手就開始學習Android,似乎太著急了一些。Android應用程序開發是以Java語言為基礎的,所以沒有扎實的Java基礎知識,只是機械的照抄別人的代碼,是沒有任何意義的。萬丈高樓平地而起,Java就是築起高樓的每一塊磚頭。那麼Java學到什麼程度才算是過關呢?我個人認為至少要掌握以下兩個方面的內容:
a)Java基礎語法:具體的知識點列表可以在這里下載:《Java知識點列表》V1.0。這部分內容沒有討價還價的餘地,必須爛熟於胸。至於具體的學習方法,可以看書或者是看視頻,但是關鍵是要多加練習,無論是書上的練習還是視頻裡面的練習,都需要仔仔細細的完成;
b)設計模式:由於在Android系統的框架層當中,使用了大量的設計模式,如果沒有這個方面的知識,對於Android的理解就會大打折扣。設計模式的種類非常之多,一個一個的全部掌握,是不現實的,必須首先掌握面向對象的基礎設計原則,有了這些基礎原則的支持,就可以舉一反三。這部分內容可以在《Effective Java》和《Agile.Software.Development:Principles,Patterns.and.Practices》這兩本書中找到。
②Linux基礎知識
大家都知道,Android系統的基礎是Linux操作系統。在開發過程當中,我們也需要使用到一些Linux命令。所以說一些Linux的基礎知識是必須的(話說現在的程序員,不懂Linux都不好意思跟人家打招呼),推薦大家看看《鳥哥的私房菜》這本書,寫的相當不錯;
③資料庫基礎知識
這個比較簡單,就是一個增刪改查的資料庫操作,可以看一下這本書:《SQL編程練習與解答》
④網路協議
至少需要學習兩種基礎的協議,HTTP協議與Socket協議;
⑤Android基礎知識
⑥伺服器端開發知識
由於很多Android應用程序都需要伺服器端的支持,所以掌握一些伺服器端開發知識還是非常有必要的。至於選擇哪一種伺服器端知識進行學習,就比較麻煩了,因為技術的種類實在是太多了:
a)Java EE:就是上面郵件當中所提到的SSH—Struts+Spring+Hibernate。這種技術的優點的功能完整、強大,已經使用了很多年,而且既然大家已經非常熟悉Java了,那麼學習SSH看起來也順理成章。但是使用這種技術開發伺服器端程序,非常麻煩。即使是一些簡單的功能,也可能需要大量的代碼和配置文件來實現;
b)PHP:簡單易學,開發快速。但是我們需要多學一種語言,是否得不償失,就要大家自己判斷了;
c).NET:這項技術的特點和Java EE差不多,但是要想掌握.NET,則需要掌握c#,也是個麻煩的事情;
d)ruby on rails:這是我個人最喜歡的伺服器端技術,簡潔,優雅,寥寥幾行代碼,就可以實現很復雜的功能,但是這需要Ruby語言知識作為基礎;
至於選擇哪一種知識,就看大家自己的判斷了,畢竟每個人想法不一樣,愛好也不相同。
安卓開發學習書籍
書的話建議買 精通Android2 ,或者 Android2高級編程 這兩本書,講解的細致,但是一定要結合sdk來看。國內的不要買。。。。(切身體會,千萬別買)
看完之後就可以自己動手做做項目了。
對於java基礎,我現在的感覺是 如果要深入學習android平台,java基礎一定要好(里邊包括各種java類庫的用法,本地代碼jni什麼的)。但如果平時隨便做做應用的話,會面向對象編程就完全可以了。
安卓開發學習學習網站
推薦你關注DevStore(主要是開發者服務商店)還有csdn和開源中國,都是開發者經常關注的網站。
DevStore(全球首家開發者服務商店)主要是整合開發者會用到的服務,可以實現在線對比評測,省去自己去網上搜索尋找的過程,還有sdk配置過程,很方便的,嘿嘿,我還在這個網站上寫評測掙過外快呢。
csdn是 中國最大的開發者技術社區,牛人還是很多的
開源中國是目前國內最大的開源技術社區,主要是軟體下載,源碼託管
自學的話平時就多看一些官方文檔,幫助文檔也是一個很好的參考資料,多看看,平時多敲代碼,多看住喲啊哈斯看規范,看完之後去敲代碼主要是在實踐過程中發現錯誤,多做項目自然多遇見問題,遇見問題解決問題,下次自然就知道怎麼解決,在實踐中發現真理。
當然可以的話有一個老師還是很好的,但是要記得要是的作用只是引導,師傅領進門修行在個人。
3. 安卓開發需要學習什麼
可以根據自己目前的技術能力,判斷需要往以下那個階段去進階
1.Android基礎階段
主要需要掌握的技能體系:架構設計必入技能(註解、豎渣戚泛型)/架構動態編程技術原理/Android虛擬機指令/Android虛擬機垃圾回收/Android虛擬機類和對象的結構/並發內存模型/synchronize機制/深入並發原理只線程池/高效IO與數據序列化。
8.Android前言技術
主要需要掌握余陵的技能:自動化構建App/前言編譯插件技術/Compose基礎/Compose進階。
相關資料:
【騰訊文檔】Android進階學習路線資料
4. android軟體開發工程師的進階之路應該如何走
小明首先需要購買一本Android入門的書籍,為了更快地學習Android,小明業余時間也都用來一邊看書一邊照著書中的例子敲代碼,結果2周時間小明就把這本書學了一遍。看完這本書後,小明對Android的歷史、結構、代碼規范等都有了一個大概的了解,並且,小明已經可以寫出一些簡單的Activity了。這個時候在小明眼裡,Android開發很簡單很好玩,通過在xml中擺放一些按鈕文本框什麼的就可以做一些界面了。
小明開始跟著他的技術導師做需求,一些簡單的小需求小明自然是不在話下了。突然有一天來了一個需求,該需求要求小明在Activity中為一個button加一個動畫效果,小明慌了:「完全沒接觸過,書上也沒有講,怎麼辦呢?」小明冷靜了下,打開了網路搜索,輸入「Android 動畫」,打開前幾個鏈接,小明恍然大悟,照著網上的例子把需求給實現了。後來導師告訴他:「學好Android,官方文檔是必須看的,既全面又權威」。然後小明如獲至寶,花了一年時間把上面的guide和training都看了一遍,並且他還動手抄了幾個小例子。
有一天,小明又需要做一個動畫相關的需求,這可難不倒小明,它熟練地打開了www..com,輸入「Android 動畫」,突然他楞了一下:」總不能每次寫動畫都要網路一下吧!「,於是他在CSDN開了一個博客,把動畫相關的知識點都寫上去,為的是後面再寫動畫相關的代碼就不用網路去搜了,事實如何呢?後面再寫動畫相關的代碼,小明的確不用再去網路搜了,因為通過寫一篇動畫博客,他把動畫相關的細節都已經記住了,這樣他就可以不用再去參考任何文檔了,後來小明還學會了把一些瑣碎的不方便放在博客上的東西寫到了印象筆記上面,什麼時候忘了10秒鍾以內都可以快速找回來,而不是花10分鍾去再次搜索一遍。
這里總結一下,Android入門的時候,需要有一本入門書,好好學習書中的內容,同時花一年時間把Android官方文檔中的training和guide看一遍,同時通過寫博客和記筆記的方式來做總結,建議讓自己的每篇博客都有價值些。通過一年時間的學習,相信每個人都可以達到中級工程師的水平。
技術要求:
- 基本知識點
比如四大組件如何使用、如何創建Service、如何進行布局、簡單的自定義View、動畫等常見技術
- 書籍推薦
《第一行代碼 Android》、《瘋狂Android》
中級工程師
小明經過一年的努力學習終於成為Android中級工程師了,月薪變成了17k。到了中級工程師,已經可以在公司里干很多體力活了,但是一些很重要的任務小明還不能一個人承擔起來,這個時候小明需要學習的內容就很多了,如下所示:
- AIDL:熟悉AIDL,理解其工作原理,懂transact和onTransact的區別;
- Binder:從Java層大概理解Binder的工作原理,懂Parcel對象的使用;
- 多進程:熟練掌握多進程的運行機制,懂Messenger、Socket等;
- 事件分發:彈性滑動、滑動沖突等;
- 玩轉View:View的繪制原理、各種自定義View;
- 動畫系列:熟悉View動畫和屬性動畫的不同點,懂屬性動畫的工作原理;
- 懂性能優化、熟悉mat等工具
- 懂點常見的設計模式
學習方法
閱讀進階書籍,閱讀Android源碼,閱讀官方文檔並嘗試自己寫相關的技術文章,需要有一定技術深度和自我思考。在這個階段的學習過程中,有2個點是比較困擾大家的,一個是閱讀源碼,另一個是自定義View以及滑動沖突。
如何閱讀源碼呢?這是個頭疼的問題,但是源碼必須要讀。閱讀源碼的時候不要深入代碼細節不可自拔,要關注代碼的流程並盡量挖掘出對應用層開發有用的結論。另外仔細閱讀源碼中對一個類或者方法的注釋,在看不懂源碼時,源碼中的注釋可以幫你更好地了解源碼中的工作原理,這個過程雖然艱苦,但是別無他法。
如何玩轉自定義View呢?我的建議是不要通過學習自定義view而學習自定義view。為什麼這么說呢?因為自定義view的種類太多了,各式各樣的絢麗的自定義效果,如何學的玩呢!我們要透過現象看本質,更多地去關注自定義view所需的知識點,這里做如下總結:
- 搞懂view的滑動原理
- 搞懂如何實現彈性滑動
- 搞懂view的滑動沖突
- 搞懂view的measure、layout和draw
- 然後再學習幾個已有的自定義view的例子
- 最後就可以搞定自定義view了,所謂萬變不離其宗
大概再需要1-2年時間,即可達到高級工程師的技術水平。我個人認為通過《Android開發藝術探索》和《Android群英傳》可以縮短這個過程為0.5-1年。注意,達到高級工程師的技術水平不代表就可以立刻成為高級工程師(受機遇、是否跳槽的影響),但是技術達到了,成為高級工程師只是很簡單的事。
技術要求:
- 稍微深入的知識點
AIDL、Messenger、Binder、多進程、動畫、滑動沖突、自定義View、消息隊列等
- 書籍推薦
《Android開發藝術探索》、《Android群英傳》
高級工程師
小明成為了夢寐以求的高級工程師,月薪達到了20k,還拿到了一丟丟股票。這個時候小明的Android水平已經不錯了,但是小明的目標是資深工程師,小明聽說資深工程師月薪可以達到30k+。
為了成為Android資深工程師,需要學習的東西就更多了,並且有些並不是那麼具體了,如下所示:
- 繼續加深理解」稍微深入的知識點「中所定義的內容
- 了解系統核心機制:
1. 了解SystemServer的啟動過程
2. 了解主線程的消息循環模型
3. 了解AMS和PMS的工作原理
4. 能夠回答問題」一個應用存在多少個Window?「
5. 了解四大組件的大概工作流程
6. …
- 基本知識點的細節
1. Activity的啟動模式以及異常情況下不同Activity的表現
2. Service的onBind和onReBind的關聯
3. onServiceDisconnected(ComponentName className)和binderDied()的區別
4. AsyncTask在不同版本上的表現細節
5. 線程池的細節和參數配置
6. …
- 熟悉設計模式,有架構意識
學習方法
這個時候已經沒有太具體的學習方法了,無非就是看書、看源碼和做項目,平時多種總結,盡量將知識融會貫通從而形成一種體系化的感覺。同時這個階段對架構是有一定要求的,架構是抽象的,但是設計模式是具體的,所以一定要加強下設計模式的學習。關於設計模式的學習,最近一本新書推薦給大家《Android 源碼設計模式解析與實戰》,既可以學習設計模式,又可能體會到Android源碼中的設計思想,我最近也在閱讀此書。
技術要求:
- 稍微深入的知識點
- 系統核心機制
- 基本知識點的細節
- 設計模式和架構
- 書籍推薦
《Android開發藝術探索》、《Android 源碼設計模式解析與實戰》、《Android內核剖析》
資深工程師
這個階段的程序員也許並沒有太具體的學習路線了。
5. 結構型模式-安卓源碼實戰之的Proxy(代理)、Delegate(委託)
Proxy和Delegate的設計思想是相同的,可以一起討論。前面是代理模式的簡要介紹,後面是具體源碼實戰。
以下基礎知識摘抄自《設計模式-可復用面向對象軟體的基礎》Proxy章節
為其他對象提供一種代理以控制對這個對象的訪問
當創建某一具體對象RealSubject開銷很大時,應該根據需要進行創建,當真正需要到這個RealSubject對象時在進行創建,此時就需要用到代理Proxy 。
例如需要在文檔中嵌入 圖形對象的文檔編輯器功能 ,然而 創建圖形文檔編輯器的開銷很大也不是每一個文檔都需要用到圖形文檔編輯器 。所以我們使用另外一個對象(即圖像Proxy) 代替 真正的圖形文檔編輯器。 Proxy可以代替一個圖形文檔編輯器,並且在真正需要的時候負責實例化這個圖形文檔編輯器對象。
只有當文檔編輯器點擊 圖形文檔編輯器 代理Proxy的圖標以啟動功能時,圖形代理Proxy才創建真正的 圖形文檔編輯器 對象
上面說過,代理(委託)模式是為了避免直接創建開銷大的資源而不使用,採用的一種代理模式以便於真正使用時在實例化。
在 PhoneWindowManager 中使用 KeyguardServiceDelegate 來代理 KeyguardService 的功能( KeyguardService 由 KeyguardServiceWrapper 包裝器進行包裝)
PhoneWindowManager 需要使用到 KeyguardService 的功能,但是在創建 PhoneWindowManager 時就實例化 KeyguardService 沒必要且開銷大,因為還沒用到 KeyguardService 的功能。直接創建 KeyguardService 會浪費 binder線程池 資源,所以應該在需要使用的時候再創建,所以引入 KeyguardServiceDelegate 。
PhoneWindowManager 並沒有直接創建 KeyguardService 對象,而是創建了代理對象 KeyguardServiceDelegate 。 後面 PhoneWindowManager 需要使用到 KeyguardService 的功能時,通過調用 KeyguardServiceDelegate.bindService 將 KeyguardService 的 binder 對象轉化為 介面 封裝到 KeyguardServiceWrapper 包裝器,最後將 KeyguardServiceWrapper 賦值到 KeyguardServiceDelegate 的成員變數,完成整個代理模式的架構。
最終的方法調用流程:
PhoneWindowManager -> KeyguardServiceDelegate ->KeyguardServiceWrapper->KeyguardService
通過創建KeyguardServiceDelegate來避免直接創建KeyguardService而不使用帶來不必要的開銷。屬於延遲載入。
[SystemServer.java]
眾所周知SystemServer用來完成服務的創建和初始化過程。
一:WindowManagerService.main();啟動了WMS,可以看到new PhoneWindowManager()傳入WMS的main方法中,它將被賦值到成員變數WindowManagerPolicy mPolicy;
二:wm.onInitReady();調用WMS的init方法,這里是KeyguardServiceDelegate的創建流程
[WindowManagerService.java]
[WindowManagerService.java]
調用PhoneWindowManager.init方法
[PhoneWindowManager.java]
這里可以看到,在PhoneWindowManager.init函數中並沒有直接創建KeyguardService對象,而是創建了代理對象KeyguardServiceDelegate。在後面需要使用到KeyguardService的功能時,通過調用KeyguardServiceDelegate.bindService將KeyguardService的binder對象轉化為介面封裝到KeyguardServiceWrapper包裝器,最後將包裝器賦值給KeyguardServiceDelegate的成員變數
[KeyguardServiceDelegate.java]
[SystemServer.java]
[SystemServer.java]
[WindowManagerService.java]
mPolicy指的是WindowManagerPolicy。而PhoneWindowManager實現了WindowManagerPolicy介面。mPolicy的賦值在WMS的構造函數中就已經完成了。而WMS的啟動在systemServer中。
[PhoneWindowManager.java]
[PhoneWindowManager.java]
[PhoneWindowManager.java]
調用context.bindServiceAsUser(...)來綁定服務,重點關注以下幾點
通過指定ComponentName來綁定服務。可以看到KeyguardServiceDelegate所在包名為
/frameworks/base/services/core/java/com/android/server/policy/keyguard/KeyguardServiceDelegate.java
尋找resources.getString(com.android.internal.R.string.config_keyguardComponent)的定義位置
[/frameworks/base/core/res/res/values/config.xml]
可以看到config_keyguardComponent對應啟動的就是 KeyguardService 這個服務。通過 ServiceConnection 去指定拿到 KeyguardService 後,將 KeyguardService 轉換為介面對象 IKeyguardService.Stub.asInterface(service) 來創建 KeyguardServiceWrapper 對象。看一看 KeyguardServiceWrapper 的創建過程
[KeyguardServiceWrapper.java]
可以看到將IKeyguardService service傳遞給了成員變數mService
ServiceConnection mKeyguardConnection 里通過 KeyguardService 的創建了代理對象 KeyguardServiceWrapper 。
後續當需要使用到 KeyguardService 功能是將是以下的調用過程
PhoneWindowManager -> KeyguardServiceDelegate ->KeyguardServiceWrapper->KeyguardService