(一)成為Android高手必須掌握的8項(xiàng)基本要求
【1】 Android操作系統(tǒng)概述
1. Android系統(tǒng)架構(gòu)。
2. Android利用設(shè)計(jì)理念。
3. Android 開源知識(shí)。
4. Android 參考網(wǎng)站與權(quán)威信息。
【2】 Android SDK及其開發(fā)環(huán)境搭建
1. Android SDK的版本發(fā)布。
2. ADT插件的安裝和更新。
3. Android利用程序架構(gòu)。
4. 建立第一個(gè)Android項(xiàng)目(HelloAndroid!)。
5. 通過Eclipse導(dǎo)入一個(gè)開源項(xiàng)目
6. 可視化的界面開發(fā)工具
7. 布置利用程序到Android模仿器或手機(jī)
【3】Android源代碼開發(fā)環(huán)境搭建與源碼結(jié)構(gòu)分析
1.開發(fā)系統(tǒng)主機(jī)環(huán)境搭建。
2. 安裝軟件包Required Packages。
3.Ubuntu 6.06 (Dapper)。
4. Ubuntu 8.04。
5. Ubuntu 7.10。
6.Install javva。
7.源碼結(jié)構(gòu)分析Android source (kernel / platform/application)。
8. Android build system。
9. Android bring up。
【4】 Android 利用程序設(shè)計(jì)模型
1. drawable。
2. layout 。
3. values(strings.xml、colors.xml、style.xml 、arrays.xml等)。
4. R.java分析及應(yīng)用 。
5. AndroidManifest.xml。
6. Android.mk。
7. Activity 。
8. Intent。
9. Service 。
10.ContentProvider。
【5】 Android 利用程序界面(一)
1. TextView的應(yīng)用。
2. drawable的應(yīng)用 。
3. 引用Drawable色彩常數(shù)及背風(fēng)景。
4. CharSequence數(shù)據(jù)類型與ResourceID利用。
5. DisplayMetrics的應(yīng)用。
6. Style樣式的定義。
7. Button事件處理。
8. setContentView的利用。
9. Intent對(duì)象的應(yīng)用。
10. Bundle對(duì)象的實(shí)現(xiàn)。
11. startActivityForResult法子。
12. AlertDialog窗口。
13. Button與TextView的交互。
14. Typeface對(duì)象應(yīng)用。
15. Gallery對(duì)象。
16. 多按鈕利用。
17. Menu功效菜單程序設(shè)計(jì)。
18. ProgressDialog與線程利用。
19. 動(dòng)態(tài)產(chǎn)生按鈕并最大化。
20. 選擇功效的對(duì)話框。
21. Android主題(Theme)實(shí)現(xiàn)。
22. 支撐多種分手率的屏幕。
【6】 Android利用程序界面(二)
1. EditText與setOnKeyListener事件。
2.ImageButton的焦點(diǎn)及事件處理。
3. Toast對(duì)象的應(yīng)用。
4. CheckBox的isChecked屬性。
5. 多選項(xiàng)CheckBox的利用。
6. RadioGroup組與onCheckedChanged事件。
7. ImageView的堆棧利用。
8. Spinner與setDropDownViewResource。
9. ArrayList與Widget的依附性。
10. Gallery與衍生BaseAdapter容器。
11. JavaI/O的利用。
12.ImageButton選擇特效。
13. AutoCompleteTextView與數(shù)組。
14. AnalogClock與DigitalClock的原理。
15. DatePicker與TimePicker利用。
16. ImageView點(diǎn)擊事件與透明度處理。
17. ProgressBar與Handler的整合利用。
18. GridView與ArrayAdapter設(shè)計(jì)。
19. ListView的布局。
20. ListActivity與Menu整合技術(shù)。
21. JavaI/O與ListActivity的聯(lián)合。
22. 應(yīng)用decodeFile法子。
23. 運(yùn)用Matrix對(duì)象來縮放圖文件。
24. Bitmap與Matrix旋轉(zhuǎn)ImageView。
25. RadioButtonID。
26. 對(duì)話窗口上的ICON圖標(biāo)。
【7】Android 利用交互與手機(jī)模塊把持
1. PendingIntent與AlarmManager。
2. PendingIntent 與 SmsManager 。
3. Intent 與 Email。
4. 數(shù)據(jù)存儲(chǔ)法子。
5. NotificationManager與Notification。
6. Adapter對(duì)象與Cursor。
7. TelephonyManager的利用。
8. RunningTaskInfo的利用。
9. Provider.Contact的應(yīng)用。
10.Provider.Calendar的應(yīng)用。
11. Service與Runnable整合并用。
12.BroadcastReceiver與Intent 。
13. receiver與intent-filter。
14. Android網(wǎng)絡(luò)編程。
15. HTTP懇求與連接。
16. WebView.loadUrl。
17. Webkit 與 WebCore。
18. HttpURLConnection與URLConnection和運(yùn)行線程。
19. Runnable混搭SurfaceView。
20. Google ApI。
【8】 Android 系統(tǒng)服務(wù)
1. Activity Manager。
2. Windows Manager。
3. Surface Manager(surface flinger)。
4. Package Manager。
5. Telephony Manager。
6. Content Provider。
7.Resource Manager。
8. AssetManager。
9. View System。
10.Location Manager。
11. Notification Manager。
12.AlarmManager。
13. BatteryManager。
14. HardwareManage。
15. 如何添加一個(gè)新系統(tǒng)Service并開放API。
16. 要害服務(wù)。
17. Android系統(tǒng)啟動(dòng)流程。
(二)成為Android高手必須掌握的20項(xiàng)進(jìn)階要求
ARM平臺(tái) Android 移植與驅(qū)動(dòng)核心開發(fā)
Android嵌入式智能操作系統(tǒng)是基于Linux內(nèi)核和驅(qū)動(dòng)的,對(duì)于HTC、華為等公司開發(fā)Android操作系統(tǒng)時(shí),需要專門將Android移植到特定硬件平臺(tái)下,同時(shí)將必要的驅(qū)動(dòng)進(jìn)行編寫及開發(fā)。本課程旨在讓學(xué)員成為Android的核心層開發(fā)者,讓學(xué)員在這種嵌入式設(shè)備廠商中謀得核心開發(fā)人員的職位。
1. Android系統(tǒng)體系及移植相關(guān)工具
1.1Android操作系統(tǒng)體系結(jié)構(gòu)介紹。
Android Linux內(nèi)核移植介紹。
文件系統(tǒng),toolbox等移植。
存儲(chǔ)驅(qū)動(dòng)移植。
Bootloader相應(yīng)方案與移植。
Android虛擬器Dalvik移植介紹。
1.2ARM處理器介紹。
ARMv5TJS。
ARM中斷處理。
ARM體系結(jié)構(gòu)與ARM處理器的體系結(jié)構(gòu)。
IP核、芯片與開發(fā)板。
ARM處理器結(jié)構(gòu)處理器模式。
. 寄放器。
. 流水線結(jié)構(gòu)。
C語言內(nèi)嵌匯編款式與編程實(shí)例。
1.3ARM指令系統(tǒng)。
.算術(shù)邏輯指令。
.指令對(duì)狀態(tài)寄放器的影響。
.對(duì)比指令。
.分支指令。
.移位。
.指令位圖。
.辨認(rèn)機(jī)器指令。
1.4內(nèi)存造訪與內(nèi)存把持。
.數(shù)據(jù)總線與地址總線的應(yīng)用與實(shí)例。
.STR/LDR 。
1.5ARM歷程調(diào)用標(biāo)準(zhǔn)。
.LDM/STM。
.反匯編。
.APCS。
.C語言函數(shù)與匯編的互相調(diào)用。
【案例】應(yīng)用Android Linux patch進(jìn)行Linux內(nèi)核的構(gòu)建
2. AndroidLinux內(nèi)核移植與核心開發(fā)
2.1ARM處理器的Android系統(tǒng)構(gòu)建。
2.2輸入輸出設(shè)備驅(qū)動(dòng)移植。
2.3存儲(chǔ)設(shè)備nand flash,MMC/SD卡驅(qū)動(dòng)移植。
2.4Framebuffer移植。
2.5 Touchscreen移植 。
2.6 Open Binder IPC移植。
【案例】
2.7在ARM處理器上移植Android實(shí)驗(yàn) 。
2.8編寫Nand flash驅(qū)動(dòng)。
2.9移植Framebuffer驅(qū)動(dòng)。
2.10硬件相關(guān)部分(鍵盤、觸摸屏、LCD等)。
3. Android相關(guān)環(huán)境庫、以及Bionic系統(tǒng)移植
3.1libc移植。
3.2libm移植。
3.3libdl移植。
3.4libm移植。
3.5 busybox, toolbox移植。
【案例】
1.移植glibc。
2.移植busybox和toolbox。
4. Android Dalvik移植一
4.1 JNI Call Bridge相關(guān)原理 。
4.2 dx, dalvitvm原理和應(yīng)用。
4.3 Dalvik指令款式。
4.4 Dalvik履行款式dex 。
4.5 Java字節(jié)碼款式。
5. Android Dalvik移植二
5.1 Dalvik Library原理 。
5.2 dalvit libcore核心庫移植。
5.3 dalvit/vm/native移植。
5.4 Dalvik Interpreter原理 。
5.5 Dalvik Mterp。
6. ARMAT&T匯編
6.1AT&T匯編語法詳解。
6.2gas工具的應(yīng)用。
6.3label標(biāo)簽的作用。
6.4數(shù)據(jù)與代碼的散播。
7. 鏈接腳本ld-script
7.1 段地址的斷定。
7.2 編寫ld-script。
7.3 ELF款式與libc函數(shù)庫的關(guān)系。
8. 時(shí)序電路根基
8.1電平信號(hào)。
8.2 電路圖分析。
8.3時(shí)序圖分析。
8.4datasheet查看。
8.5s3c2440的外圍器件結(jié)構(gòu)。
8.6GPIO操作。
9. AMBA總線標(biāo)準(zhǔn)
9.1 AMBA總線標(biāo)準(zhǔn) 。
9.2 FCLK/HCLK/PCKL頻率分配與設(shè)置。
9.3 Watchdog計(jì)時(shí)操作。
9.4 UART操作。
9.5 ARM中斷體系。
9.6 異常向量表。
9.7 ARM模式切換。
9.8 ARM中斷把持器。
9.9 軟中斷。
9.10 Linux系統(tǒng)調(diào)用的實(shí)現(xiàn)。
10. Nand Flash把持器
10.1 Flash原理。
10.2 Nand把持器原理及時(shí)序分板。
10.3k9f1208時(shí)序分析。
11. 內(nèi)存把持器
11.1 s3c2440物理地址散播 。
11.2 SDRAM原理與時(shí)序。
11.3 內(nèi)存把持器的物理連接。
11.4 地址對(duì)齊。
11.5 SRAM造訪。
12. 內(nèi)存管理單元
12.1 MMU的原理。
12.2ARM協(xié)處理器指令。
12.3 section模式。
12.4 small page模式 。
12.5 I & D TLBs 。
12.6 I & DCache。
12.7 哈佛結(jié)構(gòu)的原理與實(shí)現(xiàn)。
13. DMA 直接內(nèi)存造訪的機(jī)制與應(yīng)用
13.1 DMA的狀態(tài)機(jī) 。
13.2 DMA的把持。
14. 觸摸屏接口與ADC接口 與實(shí)例
14.1 ADC原理。
14.1 觸摸屏接口與把持。
15. LCD把持器
15.1 圖形顯示原理。
15.2 LCD把持器。
15.3 LCD時(shí)序。
15.4 LCD驅(qū)動(dòng)相關(guān)的框架與體系 。
16. I2S音頻總線
16.1音頻硬件原理。
16.2 I2S時(shí)序。
16.3 s3c2440上I2S的操作。
16.4音頻設(shè)備的裸驅(qū)動(dòng)討論。
17. CS8900網(wǎng)卡把持
17.1 邏輯鏈路層與MAC層。
17.2 CS8900原理與時(shí)序分析。
17.3后續(xù)網(wǎng)卡裸驅(qū)動(dòng)討論與體系結(jié)構(gòu)。
18. TCP/IP協(xié)議棧移植,與網(wǎng)絡(luò)體系結(jié)構(gòu)
18.1 LwIP TCP/IP協(xié)議棧簡介 。
18.2 LwIP配置與編譯。
18.3 tftp配置與編譯。
19. Bootloader原理與移植
19.1u-boot的配置、編譯。
19.2u-boot啟動(dòng)歷程分析。
19.3ARM-Linux的啟動(dòng)請(qǐng)求。
19.4 ARM-Linux kernel的ld-sript分析 。
19.5 u-boot到ARM-Linux的跳轉(zhuǎn)代碼分析 。
19.6應(yīng)用mkimage制作啟動(dòng)鏡像文件。
20. ARM-Linux原理與移植
20.1ARM-Linux的配置、編譯。
20.2ARM-Linux啟動(dòng)代碼分析。
20.3ARM-Linux 地址映射的關(guān)系。
20.4 Busybox的配置、編譯 。
(三)成為Android高手的十個(gè)建議
1、Q:如何成為高手?
A:成為一名真正的Android高手必須掌握和遵循的一些準(zhǔn)則:
1)學(xué)會(huì)懶惰
aDon"t Reinvent the Wheel(不要重復(fù)發(fā)明輪子)。
bInventing the Wheel(發(fā)明輪子)。
cDon"t Reinvent the Wheel(不要重復(fù)發(fā)明輪子)。
“輪子理論”,也即“不要重復(fù)發(fā)明輪子”,這是西方國家的一句諺語,原話是:Don"t Reinvent the Wheel。“不要重復(fù)發(fā)明輪子 ”意思是企業(yè)中任何一項(xiàng)工作實(shí)際上都有人做過,我們所需要做的就是找到做過這件事情的人。拿到軟件領(lǐng)域中就是指有的項(xiàng)目或功能,別人已經(jīng)做過,我們需要用的時(shí)候,直接拿來用即可,而不要重新制造。
2)精通Android體系架構(gòu)、MVC、常見的設(shè)計(jì)模式、控制反轉(zhuǎn)(IoC)
3)編寫可重用、可擴(kuò)展、可維護(hù)、靈活性高的代碼
4)高效的編寫高效的代碼
5)學(xué)會(huì)至少一門服務(wù)器端開發(fā)技術(shù)
2、Q:JNI是什么?
A:JNI是Java Native Interface的縮寫,中文為JAVA本地調(diào)用。從Java1.1開始,Java Native Interface(JNI)標(biāo)準(zhǔn)成為java平臺(tái)的一部分,它允許Java代碼和其他語言寫的代碼進(jìn)行交互。JNI一開始是為了本地已編譯語言,尤其是 C和C++而設(shè)計(jì)的,但是它并不妨礙你使用其他語言,只要調(diào)用約定受支持就可以了。
使用java與本地已編譯的代碼交互,通常會(huì)喪失平臺(tái)可移植性。但是,有些情況下這樣做是可以接受的,甚至是必須的,比如,使用一些舊的庫,與硬件、操作系統(tǒng)進(jìn)行交互,或者為了提高程序的性能。JNI標(biāo)準(zhǔn)至少保證本地代碼能工作在任何Java 虛擬機(jī)實(shí)現(xiàn)下。
3、Q:Android和Linux的區(qū)別?
A:Android是一個(gè)專門針對(duì)移動(dòng)設(shè)備的軟件集,包括一個(gè)操作系統(tǒng),中間件和一些重要的應(yīng)用程序。Android SDK 提供了在Android平臺(tái)使用java語言進(jìn)行android 應(yīng)用程序開發(fā)必須的工具和API接口。Android 系統(tǒng)架構(gòu)除了Linux2.6內(nèi)核之外,還提供了豐富的lib和適用于java的運(yùn)行時(shí)環(huán)境(很重要的一點(diǎn)是Dalvik虛擬機(jī),類似于JVM)、應(yīng)用程序框架和核心應(yīng)用。在此基礎(chǔ)之上可以快速開發(fā)應(yīng)用程序。
linux內(nèi)核像是核心技術(shù)支持,而google 將其商業(yè)化于移動(dòng)設(shè)備上。android上開發(fā)應(yīng)用程序和Windows MFC開發(fā)有些類似。
4、Q:SDK升級(jí)了,如何更新SDK?
A:更新SDK是非常棘手的。當(dāng)一個(gè)新的SDK發(fā)布,必須是plugin也發(fā)布。更新容易出現(xiàn)的錯(cuò)誤是兩個(gè)版本都存在,而且都不正常。最終不得不卸載了它們并且重新安裝最新的一個(gè)。然后那個(gè)最新的SDK工作正常了。建議任何面對(duì)SDK或者plugin升級(jí)的人都采用相同的過程。簡單的卸載老版本,然后安裝新版本。不要升級(jí)。
5、Q:如何進(jìn)入Recovery模式
A:每部Android設(shè)備進(jìn)入Recovery模式的方法不同。以Milestone為例:若bootloader為90.78,按住鍵盤的“X”鍵,再按電源鍵開機(jī),看到moto的經(jīng)典logo即可放開此2鍵。等待出現(xiàn)一個(gè)三角形圖標(biāo),然后按住音量向上鍵+輕按拍照鍵,會(huì)出現(xiàn)四個(gè)選項(xiàng)。放開按鍵,可以用方向鍵選擇一個(gè)選項(xiàng)。作用分別為重啟,應(yīng)用update.zip,清除所有數(shù)據(jù)至出廠狀態(tài)、清除cache。
6、Q:Android bionic移植需要注意的事項(xiàng)
A:下面通過一個(gè)例子來說明移植binic需要做的事情(BIONIC使用的內(nèi)核頭文件從2.6.29 升級(jí)到 2.6.31):
1)修改之前,先要備份 android/bionic
2)按照下面方法復(fù)制linux kernel v2.6.31 頭文件:
復(fù)制 include/asm-generic 到 bionic/libc/kernel/original folder
復(fù)制 include/linux 到 bionic/libc/kernel/original folder
復(fù)制 include/mtd 到 bionic/libc/kernel/original folder
3)運(yùn)行 tools/update_all.py 腳本,生成新的頭文件,方法如下.
$ cd android/bionic/libc/kernel
$ tools/update_all.py
以上的操作將復(fù)制新的頭文件到 bionic/libc/kernel/common 目錄
4)刪除 bionic/libc/kernel/original 目錄
5)復(fù)制平臺(tái)相關(guān)的頭文件:
復(fù)制 linux v2.6.31 平臺(tái)相關(guān)的 asm 目錄到指定的路徑,方法如下:
復(fù)制 arch/arm/include/asm 到 android/bionic/libc/kernel/arch-arm/
復(fù)制 arch/x86/include/asm 到 android/bionic/libc/kernel/arch-x86/
6)從 v2.6.29 bionic/libc/kernel/common/linux 復(fù)制一下的頭文件到新的 android/bionic/libc/kernel/common/linux 目錄:
android-alarm.h
android-pmem.h
android_power.h
ashmem.h
binder.h
msm_adsp.h
msm_audio.h
msm_mdp.h
keychord.h
7)編譯
$ cd android
$ make -j4
7、Q:Android源碼下vendor目錄下文件的作用?
A:指的是某些公司的產(chǎn)品型號(hào),主要是一些針對(duì)硬件配置的東西,比如radio 方面的,若是采用TI 的,這里面會(huì)有TI提供的一些RIL方面的接口等。
8、Q:編譯Android源碼和編譯Android內(nèi)核有什么區(qū)別?
A:其實(shí)沒什么區(qū)別,就多了幾個(gè)android特有的驅(qū)動(dòng),最重要的是binder
9、Q:如何獲取手機(jī)和存儲(chǔ)卡上的圖片?
A:
protected String getAbsoluteImagePath(Uri uri)
{
// can post image
String [] proj={MediaStore.Images.Media.DATA};
Cursor cursor = managedQuery( uri,
proj, // Which columns to return
null, // WHERE clause; which rows to return (all rows)
null, // WHERE clause selection arguments (none)
null); // Order-by clause (ascending by name)
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}
10、Q:如何使用雙緩沖?
A:系統(tǒng)自身已經(jīng)實(shí)現(xiàn)了雙緩沖,也就是說為了避免重影,必須連續(xù)onDraw兩次,或者是對(duì)上一次onDraw里面畫臟的部分進(jìn)行修復(fù)。
執(zhí)行Bitmap.createBitmap函數(shù)一般要花銷100-300ms的時(shí)間,要想提高它的效率,只能祈禱google能把android的代碼寫得更高效一些了(來自編程苦力)