第一篇:淺析基于Android 的個(gè)人記賬本平臺(tái)開(kāi)發(fā)論文
項(xiàng)目研究意義
隨著我國(guó)國(guó)民經(jīng)濟(jì)的持續(xù)增長(zhǎng),人們的收入也在逐年增加,個(gè)人身邊可以支配的財(cái)產(chǎn)也在增加,而且隨著現(xiàn)在經(jīng)濟(jì)形勢(shì)多樣化,人們收入與支出形式也出現(xiàn)多樣化,所以我們需要一個(gè)現(xiàn)代化的工具來(lái)管理我們個(gè)人財(cái)產(chǎn)以及日常支出和收入,以合理管理支出行為,是經(jīng)濟(jì)效益最大化。我的記賬本手機(jī)軟件就是針對(duì)上面的這些問(wèn)題而設(shè)計(jì)的,讓每個(gè)用戶對(duì)自己的經(jīng)濟(jì)行為有個(gè)比較清晰的掌握,合理分配個(gè)人收入和管理自己的資產(chǎn)。項(xiàng)目開(kāi)發(fā)目的俗話說(shuō)“你不理財(cái),財(cái)不理你”,只有通過(guò)合理的記賬,才能夠有效管理你的個(gè)人資產(chǎn)的合理運(yùn)用。記賬本軟件不僅可以幫你記帳,更多的是可以實(shí)時(shí)掌握你的收入與支出,掌握資金的變動(dòng)情況,同時(shí)還可以統(tǒng)計(jì)出資金的主要流向,從而更合理的分配資金。本課題將達(dá)到以下幾個(gè)目的:
(1)清晰、簡(jiǎn)便、明了,友好的操作界面。
(2)提供最主要的記賬軟件功能。
(3)降低開(kāi)發(fā)周期和成本成本。
記賬本系統(tǒng)的主要工作,是對(duì)用戶的各種收入、支出、預(yù)算有詳細(xì)的記錄,讓每個(gè)用戶對(duì)自己的經(jīng)濟(jì)行為有個(gè)比較清晰的掌握,合理分配個(gè)人收入和管理自己的資產(chǎn)。
通過(guò)調(diào)查,要求本系統(tǒng)應(yīng)該具備以下特點(diǎn):界面設(shè)計(jì)美觀大方,方便、快捷、操作靈敏。功能有增加賬單,增加修改和分類(lèi),預(yù)算和密碼管理,報(bào)表分析,導(dǎo)出數(shù)據(jù),分類(lèi)統(tǒng)計(jì),管理賬單,公積金的計(jì)算,匯率的查詢。軟件開(kāi)發(fā)
根據(jù)需求分析,得到系統(tǒng)的模塊劃分。有收支模塊:收支管理、流水賬、支持預(yù)算、公積金。管理模塊:報(bào)表、科目管理、密碼管理、我的賬戶。系統(tǒng)模塊:系統(tǒng)介紹、系統(tǒng)評(píng)分、匯率查詢、偏好設(shè)置。系統(tǒng)詳細(xì)設(shè)計(jì)
系統(tǒng)主要有以下功能。
4.1 收支管理
在主界面中點(diǎn)擊收入管理、支出管理或快捷鍵收入一筆、支出一筆,進(jìn)入支出收入界面,如圖1 所示。在收支管理界面頂端是界面標(biāo)題欄,中間有金額,科目,日期,賬本,賬戶和收支心得需要填寫(xiě)或選擇,最下方有3 個(gè)Button,返回,保存和下一筆
4.2 公積金
在主界面中點(diǎn)擊公積金,將進(jìn)入公積金界面。公積金界面有稅前工資,公積金類(lèi)型,園區(qū)統(tǒng)籌,個(gè)人所得稅和稅后工資,其中稅前工資需要填寫(xiě),公積金類(lèi)型需要選擇。
4.3 流水賬
在主界面中點(diǎn)擊流水賬,將進(jìn)入流水賬界面。在流水賬中的數(shù)據(jù)是對(duì)收入與支出的記錄。在這個(gè)界面中可以對(duì)數(shù)據(jù)進(jìn)行查詢、修改、刪除以及增加。當(dāng)點(diǎn)擊流水賬中的賬目時(shí)會(huì)進(jìn)入賬目明細(xì)。
4.4 系統(tǒng)點(diǎn)評(píng)
從主界面中點(diǎn)擊系統(tǒng)評(píng)分,用戶可以對(duì)本軟件中的系統(tǒng)便捷度、系統(tǒng)美觀度、系統(tǒng)實(shí)用度、系統(tǒng)省錢(qián)度等進(jìn)行評(píng)分以及對(duì)本軟件的一些缺點(diǎn)以及優(yōu)點(diǎn)都可指出發(fā)送給開(kāi)發(fā)商來(lái)進(jìn)行交互。
4.5 報(bào)表
在主界面中點(diǎn)擊報(bào)表可選擇收入對(duì)比餅狀圖、支出對(duì)比餅狀圖或收支對(duì)比線性圖。由于本軟件用代碼使報(bào)表和Android中自帶的數(shù)據(jù)庫(kù)SQLite 連接,可以對(duì)收入支出水平,和支出比例進(jìn)行數(shù)據(jù)分析,通過(guò)餅圖和對(duì)比線來(lái)表示。另外還有支出預(yù)算、科目管理等附屬功能。系統(tǒng)開(kāi)發(fā)總結(jié)
本系統(tǒng)基本實(shí)現(xiàn)了記賬本系統(tǒng)的基本功能,界面友好,在小范圍內(nèi)測(cè)試,基本達(dá)到了用戶的需求。就是如何將該軟件與用戶的“支付寶”,“微信”等常用支付工具進(jìn)行
第二篇:Qualcomm平臺(tái)android開(kāi)發(fā)總結(jié)
1、高通平臺(tái)android開(kāi)發(fā)總結(jié).7 1.1 搭建高通平臺(tái)環(huán)境開(kāi)發(fā)環(huán)境.7 1.2 搭建高通平臺(tái)環(huán)境開(kāi)發(fā)環(huán)境.7 1.2.1 高通android智能平臺(tái)概述.7
1.2.1.1 什么是L4,REX,BREW,AMSS以及相互之間的關(guān)系.7 1.2.2 選擇合適的源代碼以及工具.8
1.2.2.1 獲取經(jīng)過(guò)高通打補(bǔ)丁的android 源代碼.8 1.2.2.2 獲取高通針對(duì)不同處理器的vendor源代碼.9 1.2.2.3 獲取 modem 源代碼.9
1.2.2.3.1 高通 modem 源代碼編譯前的修正.13 1.2.3 建立 Android 開(kāi)發(fā)環(huán)境.14 1.2.4 建立 modem 開(kāi)發(fā)環(huán)境.15 1.2.4.1 補(bǔ)充.16
1.2.4.1.1 獲取 licenses 16
1.2.4.1.2 Flex 簡(jiǎn)單使用指南.16 1.2.4.1.3 啟動(dòng) license 服務(wù)器.18
1.2.4.1.4 license 沒(méi)有辦法從服務(wù)器獲取的幾種情況.18 1.2.4.1.5 破解 rvds 的license 19 1.2.5 在高通開(kāi)發(fā)板上燒錄文件系統(tǒng).19
1.3 高通平臺(tái),android和 modem 編譯流程分析.21 1.3.1 android代碼編譯流程分析.21 1.3.1.1 編譯工具檢測(cè).22 1.3.1.1.1 22
1.3.1.2 appsboot.mbn 生成過(guò)程解析.22
1.3.1.3 boot.img 生成過(guò)程解析,怎樣手動(dòng)生成 boog.img 28 1.3.1.4 編譯過(guò)程存在的問(wèn)題.32
1.3.1.4.1 prelinkmap 的時(shí)候 base 0xaff00000 out of range 32 1.3.1.4.2 LOCAL_SDK_VERSION 使應(yīng)用程序不能訪問(wèn)hide的api 32 1.3.1.4.3 armv5te-vfp 導(dǎo)致一些游戲運(yùn)行不了.32 1.3.2 分布式編譯 android 代碼.33 1.3.3 modem 代碼編譯流程分析.33
1.3.3.1 單獨(dú)編譯某個(gè)模塊(如:qcsbl oemsbl).34 1.3.3.2 $(TARGETDIR)/exist 規(guī)則解析.36 1.3.3.3 setup規(guī)則解析.36
1.3.3.3.1 corebsp_create_incpaths 36 1.3.3.3.2 create_incpaths 36 1.3.3.3.3 amsssetup 36
1.3.3.3.4 amsslinkaddress 36 1.3.3.3.5 firmware 38 1.3.3.4 deps規(guī)則解析.38
1.3.3.5 corebsp_build規(guī)則解析.38 1.3.3.5.1 corebsp_build_action 38 1.3.3.5.1.1 corebsp_scons 規(guī)則.39 1.3.3.5.1.1.1 corebsp_scons_start 39 2.3.3.5.1.1.1 corebsp_scons_action 39
1.3.3.5.1.1.2.1 命令 pboot_gen_elf image_header pboot_add_hash 解析.40
1.3.3.5.1.1.2.2 env.BinBuilder 過(guò)程解析.41 1.3.3.5.1.1.2.3 env.MbnBuilder 過(guò)程解析.41
1.3.3.5.1.1.2.4 env.MbnDummyBuilder 過(guò)程解析.42 1.3.3.5.1.1.2.5 fsbl.mbn 生成過(guò)程解析.43 1.3.3.5.1.1.2.6 dbl.mbn 生成過(guò)程解析.43
1.3.3.5.1.1.2.7 AMSS_AABBQOLYM.mbn 生成過(guò)程解析.43 1.3.3.5.1.1.2.8 adsp.mbn 生成過(guò)程解析.43 1.3.3.5.1.1.2.9 osbl.mbn 生成過(guò)程解析.44
1.3.3.5.1.1.2.10 enandprg_AABBQOLYM.mbn 生成過(guò)程解析.44 1.3.3.5.1.1.2.11 nandprg_AABBQOLYM.mbn 生成過(guò)程解析.45 1.3.3.5.1.1.2.12 emmcbld.mbn 生成過(guò)程解析.45 3.3.3.5.1.1.1 corebsp_scons_done 46 1.3.3.5.1.2 corebsp 46
1.3.3.5.2 corebsp_create_incpaths 46 1.3.3.5.3 corebsp_setup 46 1.3.3.6 libs 46
1.3.3.7 copybar規(guī)則解析.47 1.3.3.8 exe規(guī)則解析.47
1.3.3.8.1 CORELIBS_AABBQOLYM.mbn生成過(guò)程解析.47 1.3.3.8.2 amss.mbn 生成過(guò)程解析.47 1.3.3.9 bldprod規(guī)則解析.48
1.3.3.10 create_mem_feat_html規(guī)則解析.48 1.3.3.10.1 50
1.3.3.11 partition規(guī)則解析.50
1.3.3.11.1 eMCC 啟動(dòng)和 NAND 啟動(dòng)的分區(qū)格式是不一樣的,如果是 eMCC 啟動(dòng),多了編譯選項(xiàng):.50
1.4 高通平臺(tái) 7630 啟動(dòng)流程分析.52 1.4.1 啟動(dòng)流程概述.52 1.4.2 pbl 流程.52 1.4.3 dbl 流程.52 1.4.4 osbl 流程.54
1.4.4.1 osbl 裝載 appsbl 過(guò)程分析.56
1.4.5 appsbl 流程(源代碼在 android中).56
1.4.5.1 aboot_init 過(guò)程分析(需要側(cè)重關(guān)心的部分).58 1.4.5.1.1 fastboot 模式分析.61
1.4.5.1.1.1 什么是 fastboot 模式.61
1.4.5.1.1.2 fastboot 模式與 recovery 模式的區(qū)別.61 1.4.5.1.1.3 怎樣進(jìn)入 fastboot 模式.62
1.4.5.1.1.4 android 系統(tǒng)手機(jī)刷機(jī)過(guò)程分析(補(bǔ)充知識(shí))62 1.4.5.1.2 appsbl 引導(dǎo) android 系統(tǒng).63
1.4.5.1.2.1 Android 系統(tǒng)啟動(dòng)過(guò)程中存在的問(wèn)題.67 1.4.5.1.1.1.1 linker 問(wèn)題導(dǎo)致系統(tǒng)無(wú)法啟動(dòng).67 1.4.6 AMSS 流程.69
1.5 android 系統(tǒng)重啟關(guān)機(jī)流程分析.82 1.5.1 c語(yǔ)言中調(diào)用 reboot 函數(shù).82 1.5.2 通過(guò) adb 讓系統(tǒng)重啟.82
1.5.3 fastboot 模式下系統(tǒng)重啟.83 1.5.4 系統(tǒng)關(guān)機(jī).84
1.5.5 內(nèi)核中的系統(tǒng)調(diào)用 reboot 85 1.6 軟件調(diào)用流程分析.89 1.6.1 設(shè)置sim卡狀態(tài).89 1.6.2 設(shè)置背光.90 1.6.3 獲取電池信息.90
1.7 python scons 語(yǔ)法學(xué)習(xí).94 1.8 python 語(yǔ)法學(xué)習(xí).94 1.8.1 Python中文全攻略.94
1.8.2 推薦一款Python編輯器.94
1.8.3 使用 pyExcelerator 讀 Execl 文件.94 1.8.4 xlrd 解析 xls 文件.95 1.8.5 xlrd 生成 xls 文件.95
1.9 Python 語(yǔ)言之 scons 工具流程分析.95 1.9.1 Program 方法.100 1.9.2 Library 方法.100
2、高通常用工具使用.101 2.1 QPST 101 2.2 QXDM 101 2.3 QCAT 101
3、工程模式.101
4、Android 系統(tǒng)更新升級(jí)總結(jié).104 4.1 刷機(jī)基本知識(shí).104
4.1.1 各品牌代表手機(jī)刷機(jī)模式進(jìn)入方法.104 4.1.1.1 HTC G1 104
4.1.1.2 三星 Galaxy i7500 104 4.1.1.3 Google Nexus One 105 4.1.2 fastboot 模式.105
4.1.2.1 fastboot 模式概述.105
4.1.2.2 PC端fastboot 命令分析.106 4.1.2.2.1 命令選項(xiàng) –w –s-p –c 106 4.1.2.3 手機(jī)端fastboot 命令分析.107 4.1.2.3.1 boot 107 4.1.2.3.2 erase 107 4.1.2.3.3 flash 107 4.1.2.3.4 continue 107 4.1.2.3.5 reboot 107
4.1.2.3.6 reboot-bootloader 107 4.1.2.3.7 getvar 107 4.1.2.3.8 download 108 4.1.2.3.9 update 108
4.1.2.3.9.1 system/core/fastboot/fastboot.c:294: 108 4.1.2.3.9.2 fprintf(stderr, “archive does not contain '%s'n”, name);108 4.1.2.4 fastboot 模式流程分析.108 4.1.3 recovery 模式.108
4.1.3.1 recovery 模式概述.108 4.1.3.2 軟件升級(jí)包.109
4.1.3.3 recovery v1跟recovery v2的區(qū)別.109 4.1.3.4 軟件升級(jí)腳本語(yǔ)法解析.109 4.1.3.4.1.1 mount 110 4.1.3.4.1.2 getprop 111
4.1.3.4.1.3 file_getprop 111 4.1.3.4.1.4 assert 111 4.1.3.4.1.5 format 111
4.1.3.4.1.6 apply_patch_check 111 4.1.3.4.1.7 apply_patch_space 111 4.1.3.4.1.8 apply_patch 111
4.1.3.4.1.9 package_extract_file 112 4.1.3.4.1.10 ui_print 112
4.1.3.4.1.11 META-INF/com/google/android/update-script 腳本分析.1124.1.3.4.2 Recovery 模式中 install_package 函數(shù)解析.117 4.1.3.5 Recovery 流程分析.118 4.1.3.5.1 恢復(fù)出廠設(shè)置.118 4.1.3.5.2 系統(tǒng)更新流程.119
4.1.3.5.3 通過(guò)sd卡實(shí)現(xiàn)刷機(jī).121 4.1.3.6 系統(tǒng)升級(jí)包案例分析.122 4.1.4 工程模式(HBoot)模式.122 4.1.4.1 HBOOT降級(jí)方法.122
4.2 如何制作升級(jí)包 update.zip 123 4.2.1 手動(dòng)制作升級(jí)包.123 4.2.2 自動(dòng)制作升級(jí)包.123 4.3 Android 簽名機(jī)制.125
4.4 android 文件系統(tǒng)權(quán)限概述.125 4.4.1 獲取手機(jī)root權(quán)限.127 4.4.2 adb默認(rèn)權(quán)限分析.128
4.4.3 adb root命令切換到 root 權(quán)限.129 4.4.4 掛載系統(tǒng)分區(qū)為讀寫(xiě)(remount)130
4.4.5 通過(guò)修改 boot.img 獲取 Nexus One 權(quán)限.132 4.5 系統(tǒng)應(yīng)用移植.132
4.5.1 Android 2.2在線升級(jí)的移植.132
4.5.2 解決donut Gtalk、Market登錄不了的問(wèn)題.133 4.5.3 apk反編譯問(wèn)題總結(jié).133
4.5.4 系統(tǒng)重啟.133
5、高通linux內(nèi)核驅(qū)動(dòng)開(kāi)發(fā).133 5.1 添加串口調(diào)試.133 5.2 Sensor 傳感器.133
5.3 USB 枚舉 USB Composition 134 5.4 USB 枚舉 USB Composition 136
6、從 android 源代碼制作 sdk 136 6.1 linux sdk 137 6.2 windows sdk 137
7、程序安裝與調(diào)試.138
8、android 框架流程分析.138 8.1 屏幕顯示相關(guān).138 8.1.1 屏幕分辨率.138 8.1.2 屏幕模式.139
8.2 Android 開(kāi)機(jī)充電.141 8.3 Android 開(kāi)機(jī)動(dòng)畫(huà).141 8.3.1 內(nèi)核開(kāi)機(jī)畫(huà)面.141 8.3.2 文件系統(tǒng)開(kāi)機(jī)畫(huà)面.141
8.3.2.1 開(kāi)機(jī)顯示的 ANDROID 文字.141 8.3.2.2 ANDROID 發(fā)光動(dòng)畫(huà).142
8.3.2.3 initlogo.rle 文件分析.143
8.3.2.4 bootanimation.zip 文件分析.143 8.3.3 三星I9000 開(kāi)機(jī)動(dòng)畫(huà).144 8.4 JNI調(diào)用流程.145
8.5 Android 開(kāi)機(jī)鈴聲.145 8.6 GPS 導(dǎo)航.145
8.6.1 GPS導(dǎo)航原理.145 8.6.2 GPS導(dǎo)航軟件.145
9、高通modem框架流程分析.146 9.1.1 添加自定義rpc調(diào)用.146
9.1.1.1 從AP端獲取modem的系統(tǒng)分區(qū)信息.146 9.1.2 添加自定義 AT命令.146
10、linux 應(yīng)用.146
10.1 嵌入式Linux通過(guò)幀緩存截圖包括Scheduling(調(diào)度), File system(文件系統(tǒng)), Networking(網(wǎng)絡(luò)), Device driver(設(shè)備驅(qū)動(dòng)程序), Memory management(存儲(chǔ)管理), Paging(存儲(chǔ)頁(yè)面管理)-都在內(nèi)核中完成.一直到現(xiàn)在廣泛應(yīng)用的操作系統(tǒng),如UNIX,Linux,和Windows還大都是monolithic kernel操作系統(tǒng).但隨著操作系統(tǒng)變得越來(lái)越復(fù)雜(現(xiàn)代操作系統(tǒng)的內(nèi)核有一兩百萬(wàn)行C程序是很常見(jiàn)的事情),把所有這些功能都放在內(nèi)核中使設(shè)計(jì)難度迅 速增加.微內(nèi)核是一個(gè)與Monolithic Kernel相反的設(shè)計(jì)理念.它的目的是使內(nèi)核縮到最小,把所有可能的功能模塊移出內(nèi)核.理想情況下,內(nèi)核中僅留下Address Space Support(地址空間支持),IPC(Inter-Process Communication,進(jìn)程間通訊),和Scheduling(調(diào)度),其他功能模塊做為用戶進(jìn)程運(yùn)行。
REX 是在 L4 之上封裝的服務(wù),是一個(gè)搶占式,多任務(wù)的RTOS,所有的任務(wù)都以task的形式存在,REX提供包括任務(wù)創(chuàng)建,同步,互斥,計(jì)時(shí)器,中斷控制等功能的 API,這里的task實(shí)際上就是我們的線程,每個(gè) task對(duì)應(yīng)著一個(gè)線程。REX維護(hù)一個(gè)task list(雙向鏈表),始終運(yùn)行高優(yōu)先級(jí)的task。products里面所有的服務(wù)包括3g協(xié)議棧等都是以task的形式跑在rex之上的。而B(niǎo)rew的話是運(yùn)行的環(huán)境,跟Java 有點(diǎn)兒類(lèi)似,相當(dāng)于是一個(gè)虛擬機(jī)。AMSS――高級(jí)的移動(dòng)用戶軟件(Advanced Mobile Subscriber Software)技術(shù),是一種新的軟件架構(gòu),是對(duì)原來(lái)軟件架構(gòu) DMSS 的升級(jí)。AMSS源代碼實(shí)際上是QC BREW(Binary Runtime Environment For Wireless)平臺(tái)的的底層部分,去掉了為應(yīng)用程序提供接口的AEE(application execution environment)部分,高通在Dual Proc芯片上的其他平臺(tái)基本上都是采用的這樣的架構(gòu)。
參考文檔:
微內(nèi)核操作系統(tǒng)及L4概述
http://wenku.baidu.com/view/90929762caaedd3383c4d311.html MSM平臺(tái)上的AMSS http://blog.csdn.net/yili_xie/archive/2010/01/04/5129469.aspx
1.2.2 選擇合適的源代碼以及工具 要編譯出可供燒寫(xiě)使用的鏡像文件需要三部分代碼: 1)獲取經(jīng)過(guò)高通打補(bǔ)丁的 android 源代碼 2)獲取高通針對(duì)不同處理器的 vendor 源代碼 3)獲取 modem 源代碼
1.2.2.1 獲取經(jīng)過(guò)高通打補(bǔ)丁的android 源代碼 網(wǎng)址:
http://004km.cn1312 Chipset(such as QSC6270):MSM7227-1 RF chipset(such as RGR6240):RTR6285 PMIC chipset(such as PM7540):PM7540 WCMDA Supported Bands(900,1900,2100?.if support WCDMA):2100 CMDA Supported Bands(450,850,1900,2100? if support CDMA):not suport OS(Brew,BMP,Android,WM,ThinUI(no UI)?):android froyo OS version(Android Donuts?): android froyo
1.2.2.3.1 高通 modem 源代碼編譯前的修正
從高通獲取的源代碼直接編譯會(huì)存在一些問(wèn)題,以下為可能的問(wèn)題以及解決方法:
1)為相應(yīng)的腳本加上編譯選項(xiàng)
vim./AMSS/products/7x30/build/ms/xxxxxx.cmd 加上: BUILD_UNIX=yes
2)如果編譯過(guò)程出現(xiàn).pl 文件沒(méi)有執(zhí)行權(quán)限而退出,那么為工程下面所有的 pl 文件加上可執(zhí)行屬性,命令:
find./-name “*.pl” |xargs chmod 755
3)無(wú)法找到需要的 pl 腳本解析器
vim./AMSS/products/7x30/tools/build/depgen.pl 修改
#!/pkg/perl/5.6.1/bin/perl-w 為
#!/usr/bin/perl-w
4)如果出現(xiàn)錯(cuò)誤:
“AMSS/products/7x30/core/bsp/build/data/incpathsaaabqmlym.py”, line 14 IndentationError: expected an indented block 修改文件:./AMSS/products/7x30/core/bsp/build/scripts/genpaths.pl 內(nèi)容:
#if($line =~ /^# makefile(from/)為:
if($line =~ /^# makefile /)原因分析:
genpaths.pl 會(huì)對(duì)編譯過(guò)程的中間信息 :...line=# makefile(from'incpaths.min',line 363)line=QVPCODEC_AUDIOINC = $(QVPCODEC)/audio/inc...等信息進(jìn)行解析,由于我們使用的是中文系統(tǒng),所以以上內(nèi)容變?yōu)椋?line=# makefile(從'incpaths.min',行 363)line=QVPCODEC_AUDIOINC = $(QVPCODEC)/audio/inc 所以導(dǎo)致:
#if($line =~ /^# makefile(from/)判斷條件為為 false 無(wú)法正確生成 incpathsaaabqmlym.py,python 在解析該文件的時(shí)候認(rèn)為存在語(yǔ)法錯(cuò)誤。
在 modem 代碼 M7630AABBQMAZM2020(HY11-N2280-2.zip)中開(kāi)始使用 genincpaths.py 產(chǎn)生
./AMSS/products/7x30/core/bsp/build/data/incpathsaaabqoazm.py 文件,所以修改文件 amend-source-code-qualcomm-modem.sh 在腳本中需要加入以下內(nèi)容: incpathsxxx_py=$PRODUCT_DIR/core/bsp/build/scripts/genincpaths.py if test-f $incpathsxxx_py;then PERL=`which /usr/bin/perl` sed-i “s/(from//g” $incpathsxxx_py fi./AMSS/products/7x30/multimedia/audio/drivers/Adie/AdieCodecDb/src/DALAdieCodecDb.c #DalAdieCodecDbInternal.h 改為: #include “DALAdieCodecDbInternal.h”
5)如果出現(xiàn) make: execvp:../../../../platform/cs/bin/cifc: Permission denied 錯(cuò)誤,執(zhí)行以下命令:
chmod-R 755 AMSS/platform/cs/bin/*
1.2.3 建立 Android 開(kāi)發(fā)環(huán)境(略)
curl http://android.git.kernel.org/repo >~/bin/repo chmod a+x ~/bin/repo export PATH=~/bin:$PATH 1)安裝基本軟件
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl sun-java5-jdk zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev
2)安裝 sun-java5-jdk ubuntu 下通過(guò)命令: sudo apt-get install sun-java5-jdk 將會(huì)安裝下面的包 sun-java5-bin sun-java5-demo sun-java5-jdk sun-java5-jre sun-java5-plugin 如果ubuntu 發(fā)布版本中沒(méi)有 sun-java5-jdk 那么 sudo vim /etc/apt/source.list #for sun-java5-jdk deb http://us.archive.ubuntu.com/ubuntu/ jaunty multiverse deb http://us.archive.ubuntu.com/ubuntu/ jaunty-updates multiverse sudo apt-get update sudo apt-get sun-java5-jdk 或者,如果 ubuntu 版中不支持 apt-get,那么用手動(dòng)安裝: sudo mount-t nfs 172.20.127.15:/home/shared /mnt sudo dpkg-i /mnt/tools/debs/java-1.5.0-sun/sun-java5-*
3)配置usb cd /etc/udev/rules.d/ sudo vi 50-android.rules # adb single interface device SUBSYSTEM==“usb_device”, SYSFS{idVendor}==“18d1”, SYSFS{idProduct}==“d00d”, MODE=“0664”, GROUP=“plugdev” # adb composite interface device SUBSYSTEM==“usb_device”, SYSFS{idVendor}==“18d1”, SYSFS{idProduct}==“deed”, MODE=“0664”, GROUP=“plugdev” # Sooner low-level bootloader BUS==“usb”, SYSFS{idVendor}==“0bb4”, SYSFS{idProduct}==“0a51”, MODE=“0664”,GROUP=“plugdev” sudo /etc/init.d/udev restart
1.2.4 建立 modem 開(kāi)發(fā)環(huán)境
與android 源代碼不同,modem 編譯工具使用的是 RVDS ,實(shí)際上只用到其中的 RVCT 編譯器,高通不提供該工具,我們必須從arm公司獲取相應(yīng)的授權(quán),RVDS 是 ADS 的升級(jí)版本,從 ADS 1.2 開(kāi)始到 RVDS 3.1 我們公司都有其授權(quán),按照高通的要求我們目前必須使用 RVDS 2.2 并且使用他的 349 patch。RVDS 2.2 安裝以及使用步驟如下:
1).RVDS 2.2 共享在 172.20.127.15:/home/shared/ 目錄 sudo mount-t nfs 172.20.127.15:/home/shared/ /mnt cd /mnt/qualcommon/RVDS-2.2/ linux下rvds2.2的安裝程序?yàn)椋?/p>
./rvds2.2_linux-pentium/setuplinux.bin 執(zhí)行以上命令,按照默認(rèn)步驟安裝,安裝路徑為:~/ARM 注意事項(xiàng):
安裝過(guò)程如果出現(xiàn)錯(cuò)誤:
..................java.lang.UnsatisfiedLinkError: /tmp/ismp001/6073753.tmp: libstdc++-libc6.2-2.so.3: cannot open shared object file: No such file or directory 從網(wǎng)上下載 libstdc++-libc6.2-2.so.3 拷貝到 /usr/lib 目錄 ,或者從下面地址獲取:
http://172.20.127.15/repositories/DocsAndTools/Tools/Qualcomm/RVDS-2.2-patch/patch/libstdc++-libc6.2-2.so.3 工具的安裝通過(guò)腳本進(jìn)行了簡(jiǎn)化,具體過(guò)程請(qǐng)參考文檔: 80-N0216-2_A_M7630AABBQMAZM1170.pdf 80-VR881-7_B_M7630AABBQMLZA1200.pdf 80-VR192-1_C_AMSS_Linux_Software_Users_Guide.pdf 80-VR192-1_D_AMSS_Linux_Software_Users_Guide.pdf
2)安裝高通指定的 593 patch cd /mnt/qualcommon/RVDS2.2/下執(zhí)行命令:./setup-patch-rvct2.2-bin593-lib349.sh
目前版本只支持 32 位的系統(tǒng) 1.2.4.1 補(bǔ)充
vim./AMSS/products/7x30/core/bsp/build/scripts/defaults.py 定義了工作線程
#num_jobs = num_cpu * 2 modified by mhf num_jobs = 2 if num_jobs < 4: num_jobs = 2 if num_jobs > 8: num_jobs = 8 env.SetOption('num_jobs', num_jobs)――――――― 獲取 RVDS 官方網(wǎng)站下載評(píng)估版本
https://silver.arm.com/browse http://004km.cn/wiki/QAEP#Branch_Releases http://004km.cn/wiki/QLBEP 下載 M7630AABBQMLZA1150 分支:
February 1, 2010 M7630AABBQMLZA1150 msm7630 eclair M7630AABBQMLZA1150.xml 命令如下:
mkdir-pv ~/workspace/gphone/eclair-M7630AABBQMLZA1150-20100201 cd ~/workspace/gphone/eclair-M7630AABBQMLZA1150-20100201 repo init-u git://codeaurora.org/platform/manifest.git-b eclair-m M7630AABBQMLZA1150.xml nohup repo sync 代碼下的 vendor/qcom-proprietary 來(lái)自包 HY11-VR881-5.zip 以上兩部分代碼已經(jīng)下載并且合并,共享在:
http://172.20.127.15/repositories/TD1002/trunk/eclair-M7630AABBQMLZA1150---------------編譯 eclair 代碼
svn co http://172.20.127.15/repositories/TD1002/trunk/eclair-M7630AABBQMLZA1150 cd eclair-M7630AABBQMLZA1150 cd eclair-M7630AABBQMLZA1150$../setenv.sh../make-image.sh ======= modem代碼從高通網(wǎng)站:https://support.cdmatech.com/login/ 上獲取 我們目前使用的是: 共享在:
http://172.20.127.15/repositories/TD1002/trunk/modem-M7630AABBQMAZM1220-------編譯 modem 代碼
svn co http://172.20.127.15/repositories/TD1002/trunk/modem-M7630AABBQMAZM1220 cd modem-M7630AABBQMAZM1220../setenv-qualcomm.sh../make ======== 編譯結(jié)果分別如下:------------其中 adsp.mbn,amss.mbn,dbl.mbn,osbl.mbn,partition.mbn 位于以下目錄:./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/adsp.mbn./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/amss.mbn./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/dbl.mbn./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/osbl.mbn./modem-M7630AABBQMAZM1220/AMSS/products/7x30/build/ms/bin/AAABQMAZ/partition.mbn------------appsboot.mbn,boot.img,system.img,userdata.img 位于以下目錄:./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/appsboot.mbn./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/boot.img./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/system.img./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/userdata.img./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/system.img.ext3./eclair-M7630AABBQMLZA1150/out/target/product/msm7630_surf/userdata.img.ext3------------eMMC 啟動(dòng)使用的是 ext3 文件系統(tǒng),需要使用鏡像 system.img.ext3 userdata.img.ext3 補(bǔ)充說(shuō)明:
partition.mbn 文件的原始數(shù)據(jù)來(lái)自配置文件:
./AMSS/products/7x30/tools/jsdcc/partition_load_pt/partition.xml
1.3 高通平臺(tái),android和 modem 編譯流程分析 android 代碼編譯流程分析 modem 代碼編譯流程分析 1.3.1 android代碼編譯流程分析
1.從服務(wù)器下載 android 源碼到當(dāng)前目錄
http://smartphone/repositories/TD1014/branch/froyo_almond-M76XXTSNCJNLYA6050-drivers/ svn co http://172.20.127.15/repositories/TD1014/trunk/froyo_almond-M76XXTSNCJNLYA6050/ cd froyo_almond-M76XXTSNCJNLYA6050/../setenv.sh 設(shè)置環(huán)境變量 Setting Environment...通常情況下 generic 用于編譯模擬器版本 Options are: 1.generic 2.msm7627_surf 3.msm7627_ffa 4.tiny-system ====從以上列表中選擇==== Which would you like? [1]
燒錄的鏡像文件appsboothd.mbn appsboot.mbn boot.img system.img userdata.img persist.img 來(lái)自 android 源碼 appsboot.mbn 的主要功能是裝載 linux 內(nèi)核,通過(guò) linux 的引導(dǎo)來(lái)完成 android 系統(tǒng)的加載,appsboot.mbn 被燒寫(xiě)在相應(yīng)的分區(qū),它的加載由 osbl.mbn 來(lái)完成,osbl.mbn 程序來(lái)自 modem。
7x30 7x27 系列 appsboot 不一樣,7x30 的 appsboot.mbn 是 7x27 appsboothd.mbn appsboot.mbn 兩個(gè)文件的合并
1)appsboot.mbn 生成過(guò)程解析
2)boot.img 生成過(guò)程解析,怎樣手動(dòng)生成 boog.img
1.3.1.1 編譯工具檢測(cè)
make out/target/product/msm7630_surf/appsboot.mbn 1.3.1.1.1
1.3.1.2 appsboot.mbn 生成過(guò)程解析
make out/target/product/msm7630_surf/appsboot.mbn make out/target/product/msm7630_surf/nandwrite make out/target/product/msm7630_surf/emmc_appsboot.mbn 分別執(zhí)行:
make-C bootable/bootloader/lk BOOTLOADER_OUT=../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ msm7630_surf make-C bootable/bootloader/lk BOOTLOADER_OUT=../../.././out/target/product/msm7630_surf/obj/nandwrite msm7630_surf_nandwrite BUILD_NANDWRITE=1 make-C bootable/bootloader/lk BOOTLOADER_OUT=../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_EMMC_OBJ msm7630_surf EMMC_BOOT=1 生成 nandwrite =============== #build nandwrite as a part of Android Build TARGET_NANDWRITE := $(PRODUCT_OUT)/obj/nandwrite/build-$(TARGET_PRODUCT)_nandwrite/lk NANDWRITE_OUT := $(TOP)/$(TARGET_OUT_INTERMEDIATES)/nandwrite
nandwrite_clean: $(hide)rm-f $(TARGET_NANDWRITE)$(hide)rm-rf $(NANDWRITE_OUT)
$(NANDWRITE_OUT): mkdir-p $(NANDWRITE_OUT)
$(TARGET_NANDWRITE): nandwrite_clean $(NANDWRITE_OUT)@echo $(TARGET_PRODUCT)_nandwrite $(MAKE)-C bootable/bootloader/lk BOOTLOADER_OUT=../../../$(NANDWRITE_OUT)$(TARGET_PRODUCT)_nandwrite BUILD_NANDWRITE=1 ================
vim./bootable/bootloader/lk/makefile:98: TARGET := msm7630_surf #./bootable/bootloader/lk/project/msm7630_surf.mk PLATFORM := msm7x30 #./bootable/bootloader/lk/target/msm7630_surf/rules.mk msm7x30 msm7630_surf.mk msm7630_surf_nandwrite ============================= include project/$(PROJECT).mk include target/$(TARGET)/rules.mk include target/$(TARGET)/tools/makefile include platform/$(PLATFORM)/rules.mk include arch/$(ARCH)/rules.mk include platform/rules.mk include target/rules.mk include kernel/rules.mk include dev/rules.mk include app/rules.mk...include make/module.mk...include make/build.mk ======================== vim bootable/bootloader/lk/make/module.mk INCMODULES := $(MODULES)$(info including $(INCMODULES))include $(addsuffix /rules.mk,$(INCMODULES))展開(kāi)為:./bootable/bootloader/lk/app/nandwrite/rules.mk./bootable/bootloader/lk/dev/fbcon/rules.mk./bootable/bootloader/lk/dev/keys/rules.mk./bootable/bootloader/lk/lib/debug/rules.mk./bootable/bootloader/lk/lib/heap/rules.mk./bootable/bootloader/lk/lib/libc/rules.mk./bootable/bootloader/lk/lib/ptable/rules.mk ======================== bootable/bootloader/lk/make/build.mk:29: include arch/$(ARCH)/compile.mk
./bootable/bootloader/lk/project/msm7630_surf_nandwrite.mk 中有: MODULES += app/nandwrite./bootable/bootloader/lk/platform/msm7x30/rules.mk中有: MODULES += dev/fbcon./bootable/bootloader/lk/kernel/rules.mk 中有: MODULES += lib/libc lib/debug lib/heap./bootable/bootloader/lk/target/msm7630_surf/rules.mk 中有: MODULES += dev/keys lib/ptable 所以:
MODULES= app/nandwrite dev/fbcon dev/keys lib/debug lib/heap lib/libc lib/ptable 因?yàn)?/p>
ifeq($(BUILD_NANDWRITE), 1)APPSBOOTHDR_FILES := else out/host/linux-x86/bin/acp-fpt out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk out/target/product/msm7630_surf/nandwrite
25780 184 34000 59964 ea3c../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk arm-eabi-objcopy-O binary../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.bin generating listing:../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.lst generating listing:../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.debug.lst generating symbols:../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.sym generating size map:../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.size make[2]:正在離開(kāi)目錄
/opt/workspace/gphone/qualcomm/eclair-M7630AABBQMLZA1150/bootable/bootloader/lk make[1]:正在離開(kāi)目錄
/opt/workspace/gphone/qualcomm/eclair-M7630AABBQMLZA1150/bootable/bootloader/lk target Prebuilt:(out/target/product/msm7630_surf/nandwrite)
make-C bootable/bootloader/lk BOOTLOADER_OUT=./out/target/product/msm7630_surf/obj/nandwrite msm7630_surf_nandwrite BUILD_NANDWRITE=1 make[2]: 正在進(jìn)入目錄
`/opt/workspace/gphone/qualcomm/eclair-M7630AABBQMLZA1150/bootable/bootloader/lk` msm7630_surf_nandwrite make-C bootable/bootloader/lk BOOTLOADER_OUT=../../.././out/target/product/msm7630_surf/obj/nandwrite msm7630_surf_nandwrite BUILD_NANDWRITE=1 ==》生成 mkheader 工具
gcc target/msm7630_surf/tools/mkheader.c-o target/msm7630_surf/tools/mkheader
$(BUILDDIR)/system-onesegment.ld: $(LOCAL_DIR)/system-onesegment.ld @echo generating $@ @$(MKDIR)$(NOECHO)sed “s/%MEMBASE%/$(MEMBASE)/;s/%MEMSIZE%/$(MEMSIZE)/” < $< > $@
generating../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/system-onesegment.ld compiling arch/arm/crt0.S compiling arch/arm/crt0.S。。compiling lib/ptable/ptable.c compiling lib/ptable/ptable.c
vim bootable/bootloader/lk/platform/msm7x30/rules.mk-----LINKER_SCRIPT += $(BUILDDIR)/system-onesegment.ld include platform/msm_shared/rules.mk-----
./build/core/product_config.mk:177:TARGET_DEVICE := $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_DEVICE)./build/core/envsetup.mk:152:OUT_DIR := $(TOPDIR)out./build/core/envsetup.mk:159:TARGET_OUT_ROOT_release := $(OUT_DIR)/target./build/core/envsetup.mk:161:TARGET_OUT_ROOT := $(TARGET_OUT_ROOT_$(TARGET_BUILD_TYPE))./build/core/envsetup.mk:178: TARGET_PRODUCT_OUT_ROOT := $(TARGET_OUT_ROOT)/product./build/core/envsetup.mk:184:PRODUCT_OUT := $(TARGET_PRODUCT_OUT_ROOT)/$(TARGET_DEVICE)build/core/envsetup.mk:200:TARGET_OUT_INTERMEDIATES := $(PRODUCT_OUT)/obj bootable/bootloader/lk/AndroidBoot.mk:4:BOOTLOADER_OUT := $(TOP)/$(TARGET_OUT_INTERMEDIATES)/BOOTLOADER_OBJ bootable/bootloader/lk/makefile:32:BUILDDIR := $(BOOTLOADER_OUT)/build-$(PROJECT)bootable/bootloader/lk/makefile:34:OUTELF := $(BUILDDIR)/lk 所以:
TARGET_PRODUCT_OUT_ROOT=out/target/product/ PRODUCT_OUT=out/target/product/msm7630_surf/ TARGET_OUT_INTERMEDIATES=out/target/product/msm7630_surf/obj/ BOOTLOADER_OUT=out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/ 所以:
BUILDDIR=out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf 所以:
OUTELF=out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk
make-C bootable/bootloader/lk BOOTLOADER_OUT=../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ msm7630_surf
bootable/bootloader/lk/makefile OUTELF := $(BUILDDIR)/lk./bootable/bootloader/lk/make/build.mk $(OUTELF): $(ALLOBJS)$(LINKER_SCRIPT)@echo linking $@ $(NOECHO)$(LD)$(LDFLAGS)-T $(LINKER_SCRIPT)$(ALLOBJS)$(LIBGCC)-o $@
vim./bootable/bootloader/lk/AndroidBoot.mk TARGET_NANDWRITE := $(PRODUCT_OUT)/obj/nandwrite/build-$(TARGET_PRODUCT)_nandwrite/lk $(TARGET_NANDWRITE): nandwrite_clean $(NANDWRITE_OUT)@echo $(TARGET_PRODUCT)_nandwrite $(MAKE)-C bootable/bootloader/lk BOOTLOADER_OUT=../../../$(NANDWRITE_OUT)$(TARGET_PRODUCT)_nandwrite BUILD_NANDWRITE=1
BOOTLOADER_EMMC_OUT := $(TOP)/$(TARGET_OUT_INTERMEDIATES)/BOOTLOADER_EMMC_OBJ
vim./bootable/bootloader/lk/make/build.mk $(OUTELF): $(ALLOBJS)$(LINKER_SCRIPT)@echo linking $@ $(NOECHO)$(LD)$(LDFLAGS)-T $(LINKER_SCRIPT)$(ALLOBJS)$(LIBGCC)-o $@
bootable/bootloader/lk/makefile:33:OUTBIN := $(BUILDDIR)/lk.bin bootable/bootloader/lk/makefile:34:OUTELF := $(BUILDDIR)/lk
./lk/platform/msm7x30/rules.mk:23:LINKER_SCRIPT += $(BUILDDIR)/system-onesegment.ld
==》鏈接 lk linking../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk linking../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk generating image:../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk.bin generating image:../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.bin text data bss dec hex filename 29592 7388 42720 79700 13754../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk text data bss dec hex filename 25780 184 34000 59964 ea3c../../.././out/target/product/msm7630_surf/obj/nandwrite/build-msm7630_surf_nandwrite/lk
==》以 binary 格式,把文件
out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk 輸出到:
out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.bin arm-eabi-objcopy-O binary out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.bin ==》
生成...out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.lst 生成...out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.debug.lst 生成...out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.sym 生成...out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.size make[1]:正在離開(kāi)目錄 /opt/workspace/gphone/qualcomm/eclair-M7630AABBQMLZA1150/bootable/bootloader/lk ==》
make-C kernel O=../out/target/product/msm7630_surf/obj/KERNEL_OBJ ARCH=arm CROSS_COMPILE=arm-eabi-msm7630-perf_defconfig make[1]: 正在進(jìn)入目錄
/opt/workspace/gphone/qualcomm/eclair-M7630AABBQMLZA1150/kernel generating symbols:../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.sym generating size map:../../.././out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.size
mkheader 從 lk.bin 生成 appsboothd.mbn 語(yǔ)法: mkheader
out/target/product/msm7630_surf/appsboot.mbn cat out/target/product/msm7630_surf/appsboothd.mbn out/target/product/msm7630_surf/obj/BOOTLOADER_OBJ/build-msm7630_surf/lk.bin > out/target/product/msm7630_surf/appsboot.mbn 刪除:out/target/product/msm7630_surf/appsboothd.mbn ==== 1.3.1.3 boot.img 生成過(guò)程解析,怎樣手動(dòng)生成 boog.img boot.img 包括兩個(gè)部分: kernel 和 ramdisk,通過(guò)命令: make out/target/product/msm7630_surf/boot.img showcommands 會(huì)自動(dòng)生成 kernel 和 ramdisk,然后把兩者合并制作成燒寫(xiě)的鏡像文件:boot.img kernel 為
out/target/product/$TARGET_PRODUCT/obj/KERNEL_OBJ/arch/arm/boot/zImage 或者 out/target/product/$TARGET_PRODUCT/kernel , kernel 是 zImage 的拷貝
編譯內(nèi)核之前必須獲取一個(gè)默認(rèn)的配置文件.config ,此配置文件可以生成,或者來(lái)自默認(rèn)配置,高通中 msm7630_surf 的
默認(rèn)配置文件名為: msm7630-perf_defconfig 在文件: vendor/qcom/msm7630_surf/AndroidBoard.mk:45 中通過(guò): KERNEL_DEFCONFIG := msm7630-perf_defconfig 進(jìn)行了指定。我們可以通過(guò)命令:
make-j3 ARCH=arm CROSS_COMPILE=arm-eabi-kernel showcommands 或者通過(guò)如下命令一步步完成:
1.獲取默認(rèn)的內(nèi)核配置并生成.config 的命令如下: make-C kernel O=../out/target/product/msm7630_surf/obj/KERNEL_OBJ ARCH=arm CROSS_COMPILE=arm-eabi-msm7630-perf_defconfig-C kernel 告訴 make 進(jìn)入 kernel 工作目錄,到其下面尋找 makefile 文件
O 內(nèi)核編譯的中間文件以及編譯結(jié)果等都存儲(chǔ)在該目錄下,此做法的好處是不會(huì)在kernel源代碼目錄下生成垃圾文件
ARCH=arm 告訴系統(tǒng)到./kernel/arch/$ARCH/configs/ 目錄下找文件 msm7630-perf_defconfig,生成的.config 保存在:
out/target/product/msm7630_surf/obj/KERNEL_OBJ/.config 2.手動(dòng)編譯內(nèi)核
make-C kernel O=../out/target/product/msm7630_surf/obj/KERNEL_OBJ/ 3.如果需要配置內(nèi)核,使用下面的命令 make kernelconfig 他首先會(huì)進(jìn)入 menuconfig 界面,用戶配置完成以后,會(huì)把修改后的配置文件$(KERNEL_OUT)/.config 更新為默認(rèn)的配置文件
cp out/target/product/msm7627_ffa/obj/KERNEL_OBJ/.config kernel/arch/arm/configs/msm7627-perf_defconfig kernel/arch/arm/configs/$(KERNEL_DEFCONFIG)
4.手動(dòng)生成 ramdisk 執(zhí)行命令
make out/target/product/msm7630_surf/ramdisk.img showcommands 會(huì)用到命令:
out/host/linux-x86/bin/mkbootfs out/target/product/msm7630_surf/root | out/host/linux-x86/bin/minigzip > out/target/product/msm7630_surf/ramdisk.img 5.手動(dòng)生成 boot.img 需要使用命令 mkbootimg ,語(yǔ)法如下: mkbootimg--kernel 內(nèi)核--ramdisk ramdisk鏡像--cmdline 命令行--base 基地址--pagesize 大小--output 輸出的boot.img ========== KERNEL=out/target/product/$TARGET_PRODUCT/kernel KERNEL=out/target/product/$TARGET_PRODUCT/obj/KERNEL_OBJ/arch/arm/boot/zImage RAMDISK=out/target/product/$TARGET_PRODUCT/ramdisk.img CMDLINE=“console=ttyDCC0 androidboot.hardware=qcom” BASE=0x00200000 PAGESIZE=4096 OUTPUT=out/target/product/$TARGET_PRODUCT/boot.img out/host/linux-x86/bin/mkbootimg--kernel $KERNEL--ramdisk $RAMDISK--cmdline “$CMDLINE”--base $BASE--pagesize $PAGESIZE--output $OUTPUT =========================================
編譯 bootloader(appsboot.mbn),nandwrite 生成過(guò)程解析./vendor/qcom/msm7630_surf/AndroidBoard.mk:25: include bootable/bootloader/lk/AndroidBoot.mk =================== 因?yàn)橛校?/p>
bootable/bootloader/lk/AndroidBoot.mk:3: TARGET_BOOTLOADER := $(PRODUCT_OUT)/appsboot.mbn INSTALLED_BOOTLOADER_TARGET := $(PRODUCT_OUT)/bootloader file := $(INSTALLED_BOOTLOADER_TARGET)
第三篇:《Android應(yīng)用開(kāi)發(fā)》個(gè)人總結(jié)報(bào)告
《Android應(yīng)用開(kāi)發(fā)》個(gè)人總結(jié)報(bào)告
剛開(kāi)始接觸Android感覺(jué)到它很有意思,在界面開(kāi)發(fā)上和web也可以形成了相通的架構(gòu),更加方便,視覺(jué)上也是非常的酷,在前期我通過(guò)的大量的Android SDK開(kāi)發(fā)范例大全中的例子以及Android提供的APIDEMOS進(jìn)行學(xué)習(xí),盡管例子之間的連接比較零散,不過(guò)通過(guò)這些例子的學(xué)習(xí)我可以學(xué)習(xí)到了很多和以前java上相通的思想,因?yàn)锳ndroid在現(xiàn)在也是全新的技術(shù)和框架,在其中我也學(xué)到了如何用單例模式、工廠模式等常用的設(shè)計(jì)模式進(jìn)行學(xué)習(xí),通過(guò)API進(jìn)行開(kāi)發(fā)客戶端,對(duì)Request發(fā)送,Response處理中通過(guò)比較方便的JSON對(duì)象傳輸,以及對(duì)XML、JSON、圖片、業(yè)務(wù)等下載處理,對(duì)API接口調(diào)用等問(wèn)題處理。
首先在界面上,我們同樣可以通過(guò)不同布局進(jìn)行設(shè)計(jì)非常酷的界面,這些界面可以通過(guò)include進(jìn)行引入,和jsp、html也有相通的地方,同樣在android上可以用到自定義的樣式這和css也有比較相通的地方,我們可以通過(guò)一些公用的方法寫(xiě)個(gè)BaseActivity這個(gè)基類(lèi),通過(guò)繼承方式比較不錯(cuò)的實(shí)現(xiàn)了Activity的界面,因?yàn)檫@樣你可以Header(頭部)和Footer(尾部)進(jìn)行處理一些觸發(fā)事件或者特效等。布局模式以相對(duì)模式為主,線線布局模式可以在比較簡(jiǎn)單的include進(jìn)行完成,最重要的一點(diǎn)就是:我們可以自己通過(guò)重寫(xiě)方法或者通過(guò)實(shí)現(xiàn)View或者Layout等類(lèi)進(jìn)行擴(kuò)充項(xiàng)目需
要的布局(或者控件),在學(xué)習(xí)界面中,我發(fā)現(xiàn)Android為我們提供了很好的類(lèi)似反射機(jī)制,通過(guò)Layout文件夾下的配置文件,可以快速的形成界面,在配置文件可以設(shè)置屬性或者樣式都是很快捷方便。對(duì)比較特殊的界面也可以通過(guò)處理嵌入到指定的界面,同樣你可以通過(guò)java代碼直接創(chuàng)建View進(jìn)行添加,不過(guò)這種方式比較復(fù)雜。對(duì)一些點(diǎn)擊、選中、按鍵等處理的事件,界面之間的 跳轉(zhuǎn)Intent管理,通過(guò)Bundle對(duì)數(shù)據(jù)在界面之間進(jìn)行傳輸。
Android的界面顯示同樣也是基于控件的。通常是用View(包括ViewGroup)控件配上XML的樣式來(lái)做的。具體細(xì)節(jié)不想說(shuō)了,可以參考 Samples里的ApiDemos/View,和View的Doc,以及Implementing a UI這篇Doc。其他還有很多,感覺(jué)算是SDK講述的最多的內(nèi)容。從控件的使用上,和網(wǎng)頁(yè)的設(shè)計(jì)類(lèi)似,盡量用parent_width之類(lèi)的抽象長(zhǎng)度,用Theme來(lái)做風(fēng)格,抽取所有的字串等信息做本地化設(shè)計(jì)。相關(guān)內(nèi)容參看Implementing a UI就好。
一類(lèi)比較重要的是數(shù)據(jù)綁定控件。如果做過(guò)ASP.Net會(huì)從中看到很多類(lèi)似的地方。一個(gè)支持?jǐn)?shù)據(jù)綁定的控件,比如ListView??梢酝ㄟ^(guò)一個(gè) ListAdapter綁定到一個(gè)數(shù)據(jù)源上。ListAdapter是一個(gè)抽象類(lèi),主要的實(shí)現(xiàn)類(lèi)包括SimpleAdapter和 SimpleCursorAdapter。前者是綁定一個(gè)靜態(tài)的Array,后者是綁定一個(gè)動(dòng)態(tài)的Cursor。Cursor前面說(shuō)過(guò),是一個(gè)指向數(shù)據(jù)源的隨機(jī)迭代器,將View綁定到Cursor通常要設(shè)置這樣幾個(gè)參數(shù)。一個(gè)是每一行的樣式,稱(chēng)作Row Layout,其實(shí)就是一個(gè)普通的Layout的XML文件。還有就是一個(gè)列和現(xiàn)實(shí)控件的對(duì)應(yīng)關(guān)系。那個(gè)控件顯示哪個(gè)列的值,這是需要配置的。為了定制一個(gè)良好的數(shù)據(jù)顯示控件,最簡(jiǎn)單你可以定制很PP的Row Layout,復(fù)雜一點(diǎn)就是可以重載綁定控件View,或者是適配器ListAdapter。如果是一個(gè)數(shù)據(jù)顯示密集的應(yīng)用,且你對(duì)UI有些追求,這個(gè)工作估計(jì)是必不可少的。
一個(gè)主要用于顯示數(shù)據(jù)內(nèi)容的Activity,可以選擇派生自ListActivity。它提供了一個(gè)具有
ListView 的Layout,還有
simple_list_item_1, simple_list_item_2, two_line_list_item等默認(rèn)的Row Layout,還有一些比較不錯(cuò)的API,和可供響應(yīng)選擇Item的事件??梢詽M足你比較基礎(chǔ)的需求。如果你覺(jué)得只有一個(gè)ListView的界面太突兀,你可以為這個(gè)ListActivity指定一個(gè)Layout,需要注意的是,你需要提供一個(gè)id為@android:id/list的ListView控件,避免Activity在內(nèi)部偷偷尋找該控件的時(shí)候失敗。
除了這些要求,做好UI還有注意易用性和效率??旖萱I是一個(gè)比較不錯(cuò)的選擇,在 Activity中調(diào)用setDefaultkeyMode(SHORTCUT_DEFAULT_KEYS),可以開(kāi)啟快捷鍵模式,然后你可以將菜單綁定到指定快捷鍵上就OK了。個(gè)人覺(jué)得Tip也是一個(gè)比較重要的東西,但目前觀察看來(lái),這個(gè)東西只能夠自己提供了。界面的動(dòng)態(tài)性有時(shí)候是不可避免的,比如說(shuō)菜單就是一個(gè)需要經(jīng)常根據(jù)光標(biāo)位置提供不同的選項(xiàng)。這個(gè)東西Android很人道的考慮到了,你可以參看NodeList這個(gè)Sample。它采取的應(yīng)該是一個(gè)靜態(tài)模擬動(dòng)態(tài)的方式,這樣有助于提高速度。你也可以利用ViewInflate,動(dòng)態(tài)從一個(gè)XML創(chuàng)建一個(gè)控件。成本據(jù)Doc說(shuō)很大,不到萬(wàn)不得已不要使
第四篇:【java】使用X5Cloud云平臺(tái)開(kāi)發(fā)Android網(wǎng)絡(luò)游戲
隨著文明時(shí)代的進(jìn)步,信息逐漸邁向云端化,以前花費(fèi)很多時(shí)間開(kāi)發(fā)一套程序,如今輕輕松松就可以完成。即使一個(gè)人也可以在很短的時(shí)間內(nèi),完成一項(xiàng)很大的工程,這完全歸功于云計(jì)算的出現(xiàn),使程序員告別了繁瑣的的數(shù)據(jù)管理,專(zhuān)心于前臺(tái)和邏輯的研發(fā)。
在云端上開(kāi)發(fā),用戶只要注冊(cè)一個(gè)云賬號(hào),使用云端提供已經(jīng)優(yōu)化好的SDK包,就可以立即上手。
云端優(yōu)化提供了程序員夢(mèng)寐以求的功能實(shí)現(xiàn),像傳輸數(shù)據(jù)的高壓縮,以提高數(shù)據(jù)頁(yè)面的響應(yīng)速度。分布式數(shù)據(jù)庫(kù)陣列,帶來(lái)毫無(wú)壓力的強(qiáng)數(shù)據(jù)流訪問(wèn),用戶自己也可以采用多個(gè)云賬號(hào)模式,進(jìn)行數(shù)據(jù)庫(kù)的優(yōu)化部署,安全、簡(jiǎn)單、高效、快速,已成為云端化的信息時(shí)代標(biāo)簽!并且,它還實(shí)現(xiàn)了跨平臺(tái),web、平板、移動(dòng)三屏合一,如此開(kāi)發(fā)起來(lái)更加高效,接近完美。尤其是在android上面開(kāi)發(fā)網(wǎng)游,更是得心應(yīng)手!
僅需下載云端 SDK包,就可以完成對(duì)云端數(shù)據(jù)的高效訪問(wèn),沒(méi)有任何限制,和web應(yīng)用開(kāi)發(fā)類(lèi)似。優(yōu)勢(shì)就顯得非常明了化了,不會(huì)android開(kāi)發(fā)的程序員,想從事android的開(kāi)發(fā),在使用云端 SDK 包情況下,僅需兩到三周就可以進(jìn)行android程序開(kāi)發(fā)了。(作為筆者自己,僅用了不到兩周,就完成了一個(gè)云端商品管理的開(kāi)發(fā)。http://004km.cn)
第五篇:android 開(kāi)發(fā)心得
即 使你的應(yīng)用程序是快速且響應(yīng)靈敏的,但一些設(shè)計(jì)仍然會(huì)給用戶造成問(wèn)題——與其它應(yīng)用程序或?qū)υ捒蛭词孪扔?jì)劃的交互,意外的數(shù)據(jù)丟失,意料之外的阻塞等等。避免這些問(wèn)題,有助于理解應(yīng)用程序運(yùn)行的上下文和系統(tǒng)的交互過(guò)程,而這些又正影響著你的應(yīng)用程序。簡(jiǎn)而言之,你應(yīng)該竭盡全力去開(kāi)發(fā)一個(gè)與系統(tǒng)和其它應(yīng)用程 序流暢交互的應(yīng)用程序。
一 個(gè)常見(jiàn)的流暢問(wèn)題是,一個(gè)應(yīng)用程序的后臺(tái)處理——例如,一個(gè) Service或者
BroadcastReceiver——彈出一個(gè)對(duì)話框來(lái)響應(yīng)一些事件。這可能看起來(lái)沒(méi)啥大礙,尤其是你在模擬器上單獨(dú)地構(gòu)建和測(cè)試你 的應(yīng)用程序的時(shí)候。然而,當(dāng)你的應(yīng)用程序運(yùn)行在真機(jī)上時(shí),有可能你的應(yīng)用程序在沒(méi)有獲得用戶焦點(diǎn)時(shí)后臺(tái)處理顯示了一個(gè)對(duì)話框。因此,可能會(huì)出現(xiàn)在活躍的應(yīng) 用程序后方顯示了你的應(yīng)用程序的對(duì)話框,或者從當(dāng)前應(yīng)用程序奪取焦點(diǎn)顯示了一個(gè)對(duì)話框,而不管當(dāng)前用戶正在做什么(例如,正在打電話)。那種行為,對(duì)應(yīng)用 程序或用戶來(lái)說(shuō),就不應(yīng)該出現(xiàn)。
為了避免這些問(wèn)題,你的應(yīng)用程序應(yīng)該使用合適的系統(tǒng)資源來(lái)通知用戶——Notification類(lèi)。使用Notification,你的應(yīng)用程序可以在狀態(tài)欄顯示一個(gè) icon來(lái)通知用戶已經(jīng)發(fā)生的事情,而不是奪取焦點(diǎn)和打斷用戶。
另 一個(gè)流暢問(wèn)題的例子是未能正確實(shí)現(xiàn)Activity的 onPause()和其它生命周期方法而造成意外丟失了狀態(tài)或用戶數(shù)據(jù)。又或者,如果你的應(yīng)用程序想暴露數(shù)據(jù)給其它應(yīng)用程序使用,你應(yīng)該通過(guò) ContentProvider來(lái)暴露,而不是(舉例)通過(guò)一個(gè)可讀的原始文件或數(shù)據(jù)庫(kù)來(lái)實(shí)現(xiàn)。
這 些例子的共同點(diǎn)是它們都應(yīng)該與系統(tǒng)和其它應(yīng)用程序協(xié)作好。Android系統(tǒng)設(shè)計(jì)時(shí),就把應(yīng)用程序看作是一堆松散耦合的組件,而不是一堆黑盒代碼。作為開(kāi) 發(fā)者來(lái)說(shuō),允許我們把整個(gè)系統(tǒng)看作是更大的組件集合。這有益于我們可以與其它應(yīng)用程序進(jìn)行清晰無(wú)縫的集成,因此,作為回報(bào),我們應(yīng)該更好的設(shè)計(jì)我們的代 碼。
下面將討論常見(jiàn)的流暢問(wèn)題以及如何避免它們:
一 定要記住Android是一個(gè)移動(dòng)平臺(tái)??梢燥@而易見(jiàn)地說(shuō),其它Activity(例如,“Incoming Phone Call”應(yīng)用程序)可能會(huì)在任何時(shí)候彈出來(lái)遮蓋你的Activity,記住這個(gè)事實(shí)很重要。因?yàn)檫@個(gè)過(guò)程將觸發(fā) onSaveInstanceState()和 onPause()方法,并可能導(dǎo)致你的應(yīng)用程序
被殺死。
如 果用戶在你的應(yīng)用程序中正在編輯數(shù)據(jù)時(shí),其它 Activity出現(xiàn)了,這時(shí),你的應(yīng)用程序被殺死時(shí)可能丟失那些數(shù)據(jù)。當(dāng)然了,除非你事先保存了正在進(jìn)行的工作。“Android方式”是這樣做的:能 接收和編輯用戶輸入的 Android應(yīng)用程序應(yīng)該重寫(xiě) onSaveInstanceState()方法,并以恰當(dāng)?shù)姆绞奖4嫠鼈兊臓顟B(tài)。當(dāng)用戶重新訪問(wèn)應(yīng)用程序時(shí),她能得到她的數(shù)據(jù)。進(jìn)行這種處理方式最經(jīng)典的例子是 mail應(yīng)用程序。如果用戶正在輸入 email,這時(shí)其它 Activity啟動(dòng)了,mail應(yīng)用程序應(yīng)該把正在編輯的email以草稿的方式保存起來(lái)。
如果你不想穿著內(nèi)衣在大街上溜達(dá)的話,你的數(shù)據(jù)也不應(yīng)該這樣。盡管可能存在暴露應(yīng)用程序的某種形式給其它應(yīng)用程序,但這通常不是最好的主意。暴露原始數(shù)據(jù),要求其它應(yīng)用程序能夠理解你的數(shù)據(jù)的格式;如果你變更了格式,那么,你將破壞那些沒(méi)有進(jìn)行同步更新的應(yīng)用程序。
“Android 方式”是創(chuàng)建一個(gè) ContentProvider,以一種清晰的、深思熟慮的和可維護(hù)的API方式暴露你的數(shù)據(jù)給其它應(yīng)用程序。使用 ContentProvider,就好像是插入Java接口來(lái)分離和組裝兩片高耦合的代碼。這意味著你可以修改數(shù)據(jù)的內(nèi)部格式,而不用修改由 ContentProvider暴露的接口,這樣,也不會(huì)影響其它應(yīng)用程序。
如果用戶正在運(yùn)行一個(gè)應(yīng)用程序(例如,Phone程序),斷定對(duì)用戶操作的目的才是安全的。這也就是為什么必須避免創(chuàng)建Activity,而是直接在當(dāng)前的 Activity中響應(yīng)用戶的輸入。那 就是說(shuō),不要在 BroadcastReceiver或在后臺(tái)運(yùn)行的 Service中調(diào)用 callActivity()。這么做會(huì)中斷當(dāng)前運(yùn)行的應(yīng)用程序,并導(dǎo)致用戶惱怒。也許更糟糕的是,你的 Activity可能成為“按鍵強(qiáng)盜”,竊取了用戶要提供給前一個(gè) Activity的輸入。視乎你的應(yīng)用程序所做的事情,這可能是個(gè)壞消息。
不 選擇在后臺(tái)直接創(chuàng)建 Activity UI,取而代之的是,應(yīng)該使用NotificationManager來(lái)設(shè)置 Notification。它們會(huì)出現(xiàn)在狀態(tài)欄,并且用戶可以在他空閑的時(shí)候點(diǎn)擊它們,來(lái)查看你的應(yīng)用程序向他顯示了什么。(注意,如果你的 Activity已經(jīng)在前臺(tái)了,以上將不適用:這時(shí),對(duì)于用戶的輸入,用戶期望的是看到下一個(gè) Activity來(lái)響應(yīng))
如果你的應(yīng)用程序需要執(zhí)行一些昂貴或耗時(shí)的計(jì)算的話,你應(yīng)該盡可能地將它挪到線程里。這將阻止向用戶顯示可怕的“Application Not Responding”對(duì)話框,如果不這樣做,最終的結(jié)果會(huì)導(dǎo)致你的應(yīng)用程序完全終止。
一 般情況下,Activity中的所有代碼,包括它的 View,都運(yùn)行在相同的線程里。在這個(gè)線程里,還需要處理UI事件。例如,當(dāng)用戶按下一個(gè)按鍵,一個(gè) key-down事件就會(huì)添加到 Activity的主線程隊(duì)列里。事件處理系統(tǒng)需要很快讓這個(gè)事件出列并得到處理;如果沒(méi)有,系統(tǒng)數(shù)秒后會(huì)認(rèn)為應(yīng)用程序已經(jīng)掛起并為用戶提供殺死應(yīng)用程序 的機(jī)會(huì)。
如果有耗時(shí)的代碼,內(nèi)聯(lián)在Activity上運(yùn)行也就是運(yùn)行在事件處理線程里,這在很大程度上阻塞了事件處理。這會(huì)延遲輸入處理,并導(dǎo)致ANR對(duì)話框。為了避免這個(gè),把你的計(jì)算移到線程里。
任 何值得使用的應(yīng)用程序都可能有幾個(gè)不同的屏幕。當(dāng)設(shè)計(jì)UI屏幕時(shí),請(qǐng)一定要使用多個(gè)Activity對(duì)象實(shí)例。依賴于你的開(kāi)發(fā)背景,你可能理解 Activity類(lèi)似于 Java Applet,它是你應(yīng)用程序的入口點(diǎn)。然而,那并不精確:Applet子類(lèi)是一個(gè) Java Applet的單一入口點(diǎn),而一個(gè)Activity應(yīng)該看作是你的應(yīng)用程序多個(gè)潛在入口點(diǎn)之一。你的“main”Activity和其它之間的唯一不同點(diǎn) 是“main”Activity正巧是在AndroidManifest.xml文件中唯一對(duì)“android.intent.action.MAIN”動(dòng)作感興趣的Activity。因此,當(dāng)設(shè)計(jì)你的應(yīng)用程序的時(shí)候,把你的應(yīng)用程序看作是Activity對(duì)象的 集合。從長(zhǎng)遠(yuǎn)來(lái)看,這會(huì)使得你的代碼更加方便維護(hù)。
當(dāng) 談到 UI觀感時(shí),巧妙地交融非常重要。用戶在使用與自己期望相反的 UI的應(yīng)用程序時(shí),會(huì)產(chǎn)生不愉快的感覺(jué)。當(dāng)設(shè)計(jì)你的 UI時(shí),你應(yīng)該盡量避免太多自己的主題。相反的,使用同一個(gè)主題。你可以重寫(xiě)或擴(kuò)展你需要的主題部分,但至少在與其它應(yīng)用程序相同的 UI基礎(chǔ)上開(kāi)始。
不 同的 Android設(shè)備可能支持不同的屏幕分辨率。甚至一些可以自己變更分辨率,例如,切換到風(fēng)景模式。確保你的布局和圖片能足夠靈活地在不同的設(shè)備屏幕上正 常顯示。幸運(yùn)的是,這很容易做到。簡(jiǎn)而言之,你需要做的是為主要分辨率提供不同版本的作品,然后為不同的尺寸設(shè)計(jì)你的布局。(例如,避免使用硬編碼位置而 使用相對(duì)布局。)如果那樣做的話,系統(tǒng)會(huì)處理剩下的部分,而且你的應(yīng)用程序在任何設(shè)備上都看起來(lái)很棒。
Android設(shè)備會(huì)有多種網(wǎng)絡(luò)連接選項(xiàng)。所有的都提供數(shù)據(jù)訪問(wèn),但之間肯定有更快的。其中,速度最慢的是GPRS,GSM網(wǎng)絡(luò)的非 3G數(shù)據(jù)服務(wù)。即使具備 3G能力的設(shè)備在非3G的網(wǎng)絡(luò)上也會(huì)花費(fèi)很多的時(shí)間,所以,網(wǎng)絡(luò)很慢仍然是一個(gè)長(zhǎng)期存在的事實(shí)。
這 就是為什么你應(yīng)該按照最小化的網(wǎng)絡(luò)訪問(wèn)和帶寬來(lái)編寫(xiě)你的代碼。你不能假設(shè)網(wǎng)絡(luò)是快速的,所以,你應(yīng)該總是計(jì)劃它是慢的。如果你的用戶碰巧在一個(gè)快速的網(wǎng)絡(luò) 上,那很好——他們的用戶體驗(yàn)會(huì)提升。你要避免相反的情形:在不同的地點(diǎn)和不同時(shí)間,應(yīng)用程序有時(shí)可用,有時(shí)慢得令人抓狂,這樣的程序可能不會(huì)受歡迎。
還 有一個(gè)潛在的地方是,如果你正在使用模擬器,那么你很容易受它迷糊,因?yàn)槟M器使用電腦的網(wǎng)絡(luò)連接。這比手機(jī)網(wǎng)絡(luò)快很多,所以,你需要修改模擬器設(shè)定來(lái)模 擬較低的網(wǎng)絡(luò)速度。你可以在 Eclipse中做到這點(diǎn),在啟動(dòng)選項(xiàng)的模擬器設(shè)置頁(yè)里設(shè)置或者在啟動(dòng)模擬器時(shí)通過(guò)命令行選項(xiàng)設(shè)置。
Android 可以支持多種外觀形狀。也就是說(shuō),一些Android設(shè)備擁有全“QWERTY”鍵盤(pán),而其它可能會(huì)有40鍵、12鍵或其它鍵盤(pán)設(shè)置。同樣的,一些設(shè)備可 能有觸摸屏,但一些也會(huì)沒(méi)有。當(dāng)創(chuàng)建你的應(yīng)用程序的時(shí)候,記住這一點(diǎn)。不要假定特定的鍵盤(pán)布局——除非你真的想限定你的應(yīng)用程序只運(yùn)行在某些設(shè)備上。
如 果移動(dòng)設(shè)備經(jīng)常插在墻上,那么,它也就不是很“移動(dòng)”。移動(dòng)設(shè)備是電池供電的,如果我們能讓每次充電的電池使用得更持久一些,那么每個(gè)人都會(huì)更加開(kāi)心—— 尤其是用戶。
其中兩大耗電硬件是處理器和無(wú)線;這也就是我們?yōu)槭裁匆獙?xiě)盡可能少做工作、盡可能少去使用網(wǎng)絡(luò)的應(yīng)用程序的重要原因。
如 何讓你的應(yīng)用程序最小化的占用處理器,歸根結(jié)底還是要寫(xiě)高效代碼。為了減少無(wú)線的電量消耗,確保對(duì)錯(cuò)誤條件進(jìn)行正確的處理,并只獲取你要的東西。例如,如 果某一個(gè)網(wǎng)絡(luò)操作失敗了,不要不斷地進(jìn)行重試。如果失敗了一次,有可能是用戶不受歡迎,因此,如果你再以正確的方式操作,有可能還會(huì)失?。凰心阕龅亩际?在浪費(fèi)電池。
用戶是相當(dāng)聰明的:如果你的程序高耗電,他們是一定會(huì)發(fā)現(xiàn)的。到那個(gè)時(shí)點(diǎn),你唯一可以確定的是,你的程序?qū)⒑芸毂恍遁d掉。