深入Android应用开发_核心技术解析与最佳实践
生活随笔
收集整理的這篇文章主要介紹了
深入Android应用开发_核心技术解析与最佳实践
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
感謝作者的奉獻,以下是我讀了這本書的筆記,也只是摘錄對我有用的片段,分享之:
一.深入解析android核心組件和應用框架 1.listView下空列表的顯示問題.重寫適配器的isEmpty(),或HoneyComb中主要是通過ListFragment的setEmptyText(); 2.InputMethodService ,一種輸入法在界面上由3部分構成,即軟輸入視圖(Soft InputView)、候選視圖(Candidates View)和全屏模式(Fullscreen Mode). 3.IntentService,在gallery3d應用中,CacheService即是IntentService的一個示例. 4.綁定服務的Android組件在銷毀前應解除綁定,否則會造成內存泄漏. 5.pendingIntent, 6.(應用框架解析,service框架)基于AIDL的遠程服務(在J2EE中,采用RMI的方式, 可以通過序列化傳遞對象. 在Android中, 則采用AIDL的方式.?) 7.(應用框架解析,service框架)基于Messenger的遠程服務(http://blog.csdn.net/luoshengyang/article/details/6817933); 8.(應用框架解析,activity管理機制),acitivity棧和Task的定義和區別,以及android:taskAffinity屬性 9.對話框框架,按照Android的規則,每個對話框對應一個對話框ID. 二.Android資源框架詳解 1.sp和dip有相似的含義,與屏幕上每平方英寸含多少像素無關. 2.特殊標簽:viewStub/requestFocus/merge/include 3.android支持 XLIFF(XML Localization Interchange File Format)和通配符(在一個字符串標簽中android僅支持一個通配符). 4.切換語言的實現: Resources resources = getResources(); Configuration config = resources.getConfiguration(); DisplayMetrics dm = resources.getDisplayMetrics(); config.?locale?= Locale. SIMPLIFIED_CHINESE; resources.updateConfiguration(config, dm); 通過類似的設置,開發者也可以切換屏幕密度、MCC、MNC、屏幕方向等,當然部分設置可能需要高級別的權限。 5.string資源文件中,如果該字符串資源不必本地化,則需要設置其translatable屬性為fasle; 6.系統資源在frameworks\base\core\res\res\values\目錄下的public.xml中定義. 7.android允許屬性支持多種屬性格式。 8.MenuInflater在加載XML資源文件時采用的解析器為XmlPullParser.處于性能方面的考慮,目前MenuInflater尚不支持加載未經處理的XML資源文件. 9.如果希望顯示菜單的內容,onPrepareOptionsMenu()方法必須返回true,否則返回false. 10.子菜單不支持圖標和二級子菜單. 11.PopupMenu.當菜單被銷毀時,通過PopupMenu.OnDismissListener可以監聽到菜單被銷毀的消息. 12.asset,斷言中限制文件大小為1MB.同樣在res和raw下的資源文件也有這樣的限制.在android中,斷言的管理是通過AssetManager進行的. 13.在啟動其他應用嵌,需要在zygote進程中獎先加載的圖片資源定義在arrays.xml中的preloaded_drawables數組中,將顏色資源定義在arrays.xml中的preloaded_color_state_lists數組匯總,狀態欄加載的順序定義在arrays.xml中的status_bar_icon_order數組中. 第三章:Android UI控件精要- Intent通信
-
- Intent通信實際上是對open-Binder通信機制的封裝。在linux中,存在D-Bus和open-Binder兩種進程間通信機制,其中D-Bus應用的更加廣泛.但在Android中,采用的是open-Binder通信機制,D-Bus旨在開源BT協議棧BlueZ中得到了應用.
- Parcelable接口:是android特定的序列化接口,他比Serializable接口更有效,還可以避免Serializable接口存在的一些問題.Parcelable接口通常用于Binder和AIDL場景中.
- UI事件處理
-
- 在框架層,WindowManagerService是事件處理的神經中樞,它控制著事件如何進一步向UI層派發.
- 在android中,手勢識別是通過GestureDetector實現的.
- android 的多點觸控在本質上需要LCD驅動和程序本身設計商的支持.模擬器無法實現多點觸控的測試.
- 當案件事件發生后,Linux驅動會將補貨到的輸入時間傳遞給EventHub.cpp.EventHub是Linux驅動和android框架層的接口.
- TimerTask會阻塞主線程,對資源的消耗比另起一個線程要好.對于比較耗時的計算,不建議放在TimerTask中運行.
- Handler的removeCallbacks()方法可以移除代運行的線程,通過postAtTime()方法可以在特定時間將線程放入消息隊列.
- android線程優先級是依據Linux設置的,其優先級是用數字表示的,范圍是-20~19,其中-20為最高優先級,19為最低優先級.優先級的設置通常用處處理冰法線程產生的阻塞,防止重要性較低的線程占用大量的CPU資源.方法:Process.setThreadPriority(priority);priority參數在Thread有一些靜態屬性可以用.
- 在android中,從activity,View和Ui主線程3個層次提供了4中方式來接入UI線程.
-
- acitivity的runOnUiThread(Runnable);
- View的post(Runnable);
- View的postDelayed(Runnable,long);
- Handler
- 相比Thread加Handler的封裝,AsyncTask更為可靠,更易于維護.AsyncTask的缺點是,一單線程開啟即dobackground方法執行后無法向線程發送消息,僅能通過預先設置i好的標記來控制邏輯,當然可以通過掛起線程并等待標志位的改變來進行通信.
- android目前提供了兩種消息類型,一種是post消息,一種是send消息.其中post消息會在未來某一時間加入消息隊列,而send消息則會立即加入到消息隊列.
- synchronized關鍵字并不能繼承,對于父類的同步方法,在子類中必須再次顯示生命才能成為同步方法.synchronized關鍵字的局限在于在試圖獲得鎖時無法設定超時和中斷,每個鎖只有一個條件,在某些場景下可能不夠用.
- android提供了類似于Asynctask的AsyncQueryHandler方法來解決這一問題(對于SQLite的調用,可能會存在多處同事執行讀寫操作的場景,這種場景也需要考慮線程的安全性)
- 在android4.0中,開始支持流量的監控,對企業應用也增強了支持,通過VpnService允許應用構建自己的VPN.
- 在android中,采用的藍牙協議棧是Bluez,作為一個開源的藍牙協議棧,Bluez提供了BT所有的常用功能.
- SSL:在android.net.http包中,提供了SslCertificate和SslError來描述X509數字證書信息.在javax.net.ssl包中,通過HttpsURLConnection可以管理HTTP連接,通過SSLServer-Socket可以創建SSL套接字.org.apache.http.conn.ssl包中還提供了SSLSocketFactory等類來執行SSL套接字的創建等.
- 在android中,ConnectivityManager提供對網絡如WIFI,BT,WIMAX,GPRS,UMTS的連接性管理.
- 對于HTTPS協議,可通過HttpsURLConnection建立HTTPS鏈接.系統會現場時TSL和SSL2,當鏈接建立失敗時,再嘗試SSL3.
- 在J2SE 1.4中,Sun引入了NIO,在進行Java應用向android移植時,會出現一些Java NIO的兼容性問題,通常是NIO對IPv6的支持存在問題,會拋出java.net.SocketException:Bad address family異常.目前解決的方法是,通過setProperty(propObj,put,"java.net.preferIPv6Addresses","false")來禁止IPv6,然后進行Selector.open()等操作.
- 在Linux中,Java NIO是基于管道實現的.NIO主要使用了Channel和Selector來實現,其基于時間驅動的單線程處理可以有效地節省系統開銷,并降低線程死鎖的概率.在實際的開發中,NIO通常用于本地數據復制和網絡傳輸中.
- android網絡編程接口
-
- RTP協議,實時傳輸協議RTP主要用于VOIP,push-to-talk,電話會議等場景中.android.net.rtp包
- Web服務是基于XML和HTTPS的一種分布式計算服務,其通信協議主要基于SOAP,服務通過WSDL描述,發現和獲得服務的元數據則通過UDDI來描述.調用Web服務的方式包括RPC,SOA,REST等.Web服務的安全可以通過Web-Security,SSL,數字證書等3中方法來實現,通過Web-Reliability可進行可信賴的Web服務間消息傳遞.目前Web服務的框架有Ajax2,metro,cxf等.
- KSOAP2是一個針對Android平臺的輕量級的SOAP庫,適用于資源受限的環境,不支持Web-Security.
- 在Honeycomb中,getElementsByTagname()方法無法獲得NodeList,即DOM解析器在Honeycomb中會因嚴重的bug而無法使用.
- 基于UDP協議的套接字
-
- 基于UDP協議的套接字主要是通過DatagramSocket進行的,DatagramSocket在通信的兩端均適用.DatagramSocket對象通過send()方法發送消息,通過receive()方法接收消息,通過connect()方法建立和服務器的連接.
- 在Android中,Cookie的管理是通過CookieSyncManager來實現的,通常為了獲得優異的性能,在RAM中保存Cookie,但是由于某種需要,通過CookieSyncManager可以將Cookie保存到永久存儲空間中.CookieSyncManager在運行期間以單子模式出現,一旦創建了CookieSyncManager,系統將單獨啟動一個線程來執行Cookie在RAM和永久存儲空間之間的同步,系統會通過一個定時器每5min執行一次同步操作.CookieManager對Cookie的管理本職上是對CookieSyncManager的封裝,因此在管理Cookie時,必須先創建CookieSyncManager實例.
- SIP協議支持TCP和UDP兩種傳輸協議,由于SIP本身具有握手機制,因此首選UDP.
- NFC支持的數據格式為Ndef.注意,在Android2.3中,僅支持基于android.nfc,action.TAG_DISCOVERED的intent過濾器.
- RIL層是對底層蜂窩接入技術的封裝,是Android和協議棧通信的接口.它提供了語音,數據,短信,SIM卡管理已經STK應用等功能,其實現的接口遵循無線協議規范.在android中,RIL層的代碼主要位于hardware\ril中.從某種意義上講,RIL層是通話服務(Telephony Service)和基帶硬件中間的抽象層.
- RIL移植:在android源代碼中,給出了一個VENDOR RIL 的參考實現,即reference-ril.c,并最終將其編譯成librefrence.so共享庫.reference-ril.c負責與硬件的通信,將來自上層的命令轉換為AT指令,然后傳遞給應經.根據硬件廠商的不同OEM廠商需要修改reference-ril.c.需要注意的是,如果定義了RIL_SHLIB,那么VENDOR RIL會被編譯為共享庫,或直接被編入RIL守護進程.
- 報文分析:開源的抓包工具,Wireshark(以前稱為Ethereal).是一個網絡抓包分析工具.
- android的渲染分為2D渲染和3D渲染兩種,其中2D渲染的引擎為Skia,3D渲染的引擎為OpenGL ES.
- 在存儲數據時,對BMP圖像的掃描方式按從左到右,從下到上的順序進行.
- Drawable與視圖的區別在于,Drawable無法接收事件.
- 在android中進行圖像變換需要使用Matrix類,該類中包含了一個3*3的矩陣,專門用于進行圖像變換匹配.Matrix沒有結構體,必須對其進行初始化.通過氣reset()方法,可以得到一個單位矩陣.
- 縮略圖:多種方式
-
- 通過BitmapFactory的Options來設置采樣大小,按照比例取得縮放圖像.
- 如果希望取得固定大小的縮放圖像,以上方法不合適.
- 在android 2.2中,引入了ThumbnailUtils類,利用它可以針對圖像生縮略圖,針對視頻生成首幀的縮略圖.目前android提供了兩種縮略圖模式,一種為MINI_KIND(512像素*384像素)模式,一種為MICRO_KIND(96像素*96像素)模式.
- 圖像瀏覽:
-
- 倒影效果的實現
- 縮放效果的實現:除了可通過ScaleDrawable實現外,還可通過Matrix的方式實現.
- 圓角圖像的顯示
- 人臉檢測
-
- 人臉檢測主要是FaceDetector類中進行.在android4.0中,人臉檢測用來實現解鎖功能,非常有特色.
- 在執行具體的人臉檢測室,所采用的算法對圖像也有要求,其利用的元數據必須為RGB565格式的Bitmap,圖像不能太小,否則會檢測不到,圖像也不能太大,否則易造成加載異常.
- 在android4.0中,為了進行人臉檢測,可以通過Camera的setFaceDetectionListener()來設置Camera.FaceDetectionListener監聽器.
- 3D圖像處理
-
- 在android3.0中,google引入了RenderScript,這樣在進行3D處理時,開發者有OpenGL,RenderScript兩種工具可供選擇.就具體的場景而言,google提供的建議如下:如果開發者只開發簡單的應用,且性能不是關鍵,或者希望有更好的靈活性和調試支持,則需要考慮OpenGL;如果考慮移植性且不會用到OpenGL的全部功能,則RenderScript是個不錯的選擇.
- RenderScript在原生代碼層為開發者提供了一組能進行高性能3D圖形渲染和計算的API,使開發者可以利用C語言(C99標準)以更底層,更搞笑的方式實現3D效果.不同于已有的NDK,為了實現跨平臺,RenderScript在編譯過程中會被編譯為中間字節碼(LLVM),在執行時才通過JIT技術轉化為機器碼,這樣可以避免開發階段需要面對某種特定機器架構而帶來的各種問題.RenderScript總體上采用的是主從架構.
- android允許使用硬件加速來渲染應用,但出于系統負載的考慮,android推薦針對activity進行硬件加速,以避免系統負載過重,方法如下:myActivity.requestWindowFeature(Window.FEATURE_OPENGL);并不是所有的2D基本圖形都支持硬件加速,如PathEffect目前就不支持.
- 在圖形處理上,android支持基于Shader的多種渲染特效.
- 更底層的渲染是通過android渲染管理器Surface Flinger進行管理的.
- Surface:android圖形系統中一個最重要的概念是Surface.每個Surface都會創建一個畫布(Canvas)對象,每個畫布對象都對應于一個位圖(Bitmap)對象,該位圖對象中存儲著視圖(View)及其子類等UI控件在Surface上的內容.框架層通過Window傳遞的標志位(flags)來決定創建的Surface的類型.
- 通常情況下,每個Surface對應兩個緩沖:前端緩沖(Front Buffer)和后端緩沖(Back Buffer).后端緩沖即在畫布對象上渲染信息時畫布對象對應訂單那個位圖對象.
- 每個Surface對應一個Layer對象,Surface Flinger負責將各個Layer對象的前端換重組合并渲染到屏幕上.Layer共有4種模式:Layer,LayerDim,LayerBlur,LayerBuffer.這4種模式分別與4種類型的Surface對應.
- 動畫處理:目前android支持3種動畫,補間動畫(Tween Animation用于實現android控件本身的動畫效果),幀動畫(用于實現類似GIF格式動畫的效果),屬性動畫(屬性動畫是在android3.0中引入的).
-
- 確實需要在android環境下支持GIF格式動畫,變通的方法是通過WebView來加載,只需要URI設為本地GIF資源文件即可.但這樣要消耗大量的資源,創建一個WebView對象至少需要8MB的RAM.
- 補間動畫Tween Animation:補間動畫并不只針對圖像,它還支持TextView等視圖對象.android的控件動畫效果軍事基于補間動畫實現的.最常用的控件動畫是基于ViewAnimator類進行的.
- 動畫的進度是通過插補器(Interpolator)來控制的.如果默認的插補器還無法滿足開發者的需求,那么開發者可以通過實現TimeInterpolator接口自定義一個插補器.
- 幀動畫:為了連續顯示一組圖像,產生動畫效果android需要利用XML資源文件和AnimationDrawable協同工作.AnimationDrawable的start()方法不能再activity的onCreate()方法中調用,這是因為此時圖像資源尚未完全加載.如果希望能在Activity啟動后立即開始動畫,那么可以在Activity的onWindowFocusChanged()方法中執行start()方法的調用.
- 屬性動畫:在android3.0中引入,為開發者提供了更強的自定義動畫的能力.屬性動畫在游戲開發中比較常見.
- 布局動畫:android3.0中,還引入了布局動畫,其作用域ViewGroup及其子類.,需要為其設置LayoutTransition屬性.
- 音頻本身的播放涉及的多媒體引擎是OpenCore和Stagefright.在默認情況下,OpenCore在android2.2及以前版本中應用,而在交心的android版本中,Stagefright則成了默認的多媒體引擎.
- 對于背景音樂,將MediaPlayer封裝在Serviece中即可實現.
- 音頻處理
- 視頻處理
-
- 視頻狀態機
- 兩種方案:一種是基于VideoView,一種是基于SurfaceView.
- android4.0中提供了與SurfaceView想死的TextureView來支持視頻或OpenGL場景,但TextureView的用法更類似于普通的視圖.另外,在android4.0中,開發者還可以顯式的設置Surface,方法為setSurface().
- MediaRecorder的許多方法間存在依賴關系,如setVideoSource()方法和setAudioSource()方法必須在setOutFormat()方法前設置:通過setOrientationHint()方法設置角度,必須在prepare()方法前調用;通過setMaxDuration()方法設置持續時間,則必須在setOutFormat()方法后并在prepare()方法前進行.在開發視頻錄制的應用嵌,必須了解這些依賴關系.
- 在android4.0中,當完成了一段視頻的錄制后,系統會廣播android.hardware.action.NEW_VIDEO消息.
- Camera服務
- TTS的實現
-
- android1.6及以后版本中,android開始通過支持語音合成的Svox語音引擎,即TTS(Text To Speech).
- 在C語言中調用會變語言只需通過關鍵_asm_將會變代碼封裝即可.會變代碼在C語言中的實現形式因編譯環境不同而有所不同,在Android中采用的是GCC編譯器.
- 匯編語言對C語言的調用需要通過關鍵字BL進行,如果涉及參數傳遞,則實現比較復雜.
- 在C++與C語言的相互調用中,注意關鍵字_cplusplus和extern"C"的用法即可,其中_cplusplus為C++的關鍵字,表示作用域內的代碼為C++代碼,而extern"C"是為了保證C++和C是互通的.這是因為在編譯生成匯編碼時,兩者的處理有所不同,在C++中,為了支持重載機制,在編譯生成匯編碼時,要對函數的名稱進行一些處理,而在C語言中,則不需要如此.
- 在C語言調用C++時,由于C語言不能直接飲用聲明了extern"C"的C++頭文件,因此在調用C++頭文件中庸extern"C"聲明的函數時,需聲明其為外部函數.
- Java對C/C++的調用
-
- 定義JNI原生接口
-
- 根據管用的場景不同,JNI接口的定義方式有兩種,分別為普通調用和定向調用.在Android中,普通調用的JNI定義通常用于框架層,而定向調用的JNI蒂尼通常用于應用層.
- 普通調用的步驟:JNI接口定義->JNI接口映射->注冊JNI接口映射->設置在共享庫加載時JNI接口映射.
- 定向調用:接口名的定義由3部分組成:Java聲明、Java包名、函數名。在加載共享庫時,如果無法找到對應原生方法的JNI接口,會拋出UnsatisfiedLinkError異常。
- 在C/C++中,要得到特定環境變量所致的路徑,利用getenv()函數即可.const char* root = getenv("ANDROID_ROOT");
- JNI的編譯,只需要設置LOCAL_PATH,LOCAL_MODULE,LOCAL_SRC_FILES等環境變量,然后根據需要知名是編譯成共享庫還是靜態庫即可.
- JNI調用Java方法得當原生接口在結構體JNINativeInterface中定義,JNI調用Java方法的過程如下:FindClass(查詢Java類)->GetMethodID(獲取Java方法句柄)->Call*Method(調用Java方法)
- 在JNI里直接創建Java對象,在操作結束后,應釋放對Java類的引用.
- 由于C和C++在可執行文件布局上的不同,JNI接口的調用方式在JNIEnv指針的操作上也略有不同
- android的主要安全機制包括Java混淆器,接入權限,數字證書,SSL,數據庫安全,虛擬機(安全沙箱),文件訪問控制等.
- android自帶的java混淆器為著名的proguard.
- 接入權限
-
- 框架層額接入權限定義在frameworks\base\core\res\androidManifest.xml中.
- 創建接入權限
-
- 和常規的理解不同,高級別權限并不兼容低級別權限.對于signatureOrSystem級別的權限,在基于SDK開發的環境中,在調試應用時無法接入這個級別權限的服務.這點在進行源代碼級別開發時需要注意.
- 設置應用權限的方式有兩種方式:
-
- 一種是設置共享用戶ID:android在權限管理上應用了Linux的ACL權限機制.通過在每個應用中使用sharedUserId屬性可共享系統賬戶權限.android源代碼樹攜帶的系統證書位于build\target\product\security目錄下.目前采用的簽名算法為RSA算法.
- 一種是直接設置應用或組建額接入權限.
-
- 直接設置應用的接入權限
- 設置activity的接入權限
- 數據庫的接入權限:主要分為3個層次,讀,寫,搜索
- 驗證權限
-
- 如果調用方用友相應的權限,則權限驗證的返回值為PackageManager.PERMISSION_GRANTED,否則返回PackageManager.PERMISSION_DENIED.
- 框架層接入限制,在框架層,為了隱藏某些方法或實現類,避免被第三方開發者開發的應用程序調用,提供了hide限制的方法.當框架層的API發生變化是,需要先通過make update-api來更新current.xml,否則會因為一致性問題導致系統遍以上的失敗.在基于源代碼開發時,hide限制無效.
- 數字證書
-
- android允許用友相同數字簽名的應用運行在同一個進程中,這同樣有利于在多個應用中共享數據.Android Markets強制要求所有應用程序的數字證書的有效期要持續到2033年10月22日以后.
- 在進行數字簽名后,可用zipalign工具來優化應用.
- 當發生android ANR錯誤時,錯誤信息會保存在\data\anr\traces.txt中,這有助于在無法實施查看日志的情況下分析Bug.
- Android調試
- 在Eclipse中集成的DMSS并沒有呈現出全部的DMSS能力,如果希望觀察系統更詳細的信息,可以直接啟動SDK\tools\ddms
- android測試
- Monkey壓力測試的過程中,
- Android性能優化
- zipalign提供了4字節的便捷對其來映射內存,通過空間換時間的方式來提高APK加載的執行效率.
- 源代碼編譯
-
- 映像文件
-
- 在android中,默認的文件系統為YAFFS2,當然,OEM廠商可以根據自己的需要,選擇其他的文件系統.
- 在源代碼中,YAFFS2文件系統的實現位于external\yaffs2\yaffs2目錄下,它針對大容量的NAND Flash進行了優化,具有掛載時間段等優點.
- 在當前的只能終端中,另一個比較常用的文件系統是UBIFS,它是由IBM和Nokia公司的工程師于2006年開發的一款高效的嵌入式文件系統.
- 映像格式默認支持yaffs2,ext4,vfat等.
- 映像文件的生成配置位于build\core\Makefile中.
- 編譯方法
-
- 除了基本的全系統編譯外,android還提供了集中快捷方式供編譯和查找使用
- 編譯環境
-
- 在Froyo版本后,Android對Java的要求從Java5提升到Java6,同時對駐留的操作系統的要求從32位升級到64位,另外要求具備Python2.4,Git1.5.4或更高版本.
- 對于Gingerbread或更高的版本,Android要求支持Java6,采用Sun java6或者Open JDK6均可.對于Froyo及更低的版本,android要求支持Java5,這主要與當時android無法兼容Java6的overide屬性有關.
- 如果希望進行原生代碼的內存泄漏方面的檢測,那么還需要包裝Valgrind包.
- 為了獲取android的源代碼,必須安裝repo,repo是Google對git的封裝,使對git的操作更加方便.(repo也是不斷升級的,并對駐留的操作系統的配置有依賴性,比如對Python就有要求,偶爾會繁盛更新后無法操作repo的情況.)
- 如果基于源代碼的方式進行開發,內核的代碼是必須的,通常可以從硬件廠商那里獲得最新的代碼.當前android源代碼樹中已經包含了Qualcomm,TI,Qemu(模擬器),Sansung,NVIDIA等廠商的代碼.
- 基本編譯過程
-
- 過程主要包括3部分,設置環境變量,設置編譯屬性配置,執行編譯.
- android還支持多CPU的編譯,例如執行make -j4,意味著編譯工作可以同時在最多4個CPU上同時進行,這在CPU普遍為多喝架構的今天,是個不錯的設計.遺憾的是,android沒有發布官方的基于分布式編譯的工具,無法有效地利用局域網內部的空閑計算能力.
- 快捷方式
-
- croot:用于改變當前路徑到android根目錄.
- m:用于從android根目錄開始編譯.
- mm:用于編譯當前目錄下的所有模塊.
- mmm:用于編譯特定目錄下的所有模塊
- cgrep:用于在C/C++文件中查找
- jgrep:用于在Java文件中查找
- resgrep:用于在資源文件中查找
- godir:用于跳轉到某個目錄.
- 主要腳本
-
- android中的腳本類文件主要用來配置產品,目標板,以及根據開發者的Host和Target來選擇相應的工具并設定相應的編譯選項.
- SDK編譯
-
- windows下的sdk的生成以來與Linux,Mac下的SDK,這以為著為了編譯windows下的sdk,必須先編譯Linux或Mac下的SDK.生成windows下的SDK以為著將Linux或Mac下的SDK中與操作系統相關的UNIX二進制文件替換為windows下的二進制文件.?Cygwin仿真環境
- NDK編譯
-
- NDK提供的原生方法只是Android原地阿媽能力的一個子集.
- NDK要求為GNU Make3.81及以上版本.
- NDK的配置腳本主要有android.mk和Application.mk兩種
- 雖然android NDK提供了STLport庫供加載,但是在少數場景中,依然需要重新編譯STLport庫.
- GDB調試
-
- 為了進行原生代碼的調試,NDK提供了遠程GDB調試手段,其主要調試腳本為ndk-gdb.ndk-gdb僅在Foryo及以上版本中受到支持.為了進行GDB調試,要求你工程處于debug模式下,這需要在AndroidManifest.xml文件中生命android:debuggable屬性為true,同時在進行NDK編譯時生成的動態庫也是debug模式的.
- NativieACtivity實現
-
- 在android SDK中,提供了一個NativeActivity類,可以與android框架和原生代碼進行通信.實現NativeActivity有兩種方法,一是通過native_activity.h頭文件,而是通過android_native_app_glue.h頭文件.從本質上講,NativeActivity的實現仍是基于JNI進行的.
-
- 應用程序編譯
-
- 應用程序的編譯主要基于Android.mk文件進行,為了在編譯前清楚遺留的中間文件,需要實現CleanSpec.mk.Android的應用層代碼主要遵循APACHE2許可文件.
- 文件系統的配置
-
- 在System\core\rootdir\目錄下的Android.mk中會加載外部文件系統的掛在信息,相關信息定在vold.fstad文件中.
- 編譯工具:
-
- 整個編譯系統都是基于make進行的.
- 在android中,C庫采用的是Google優化自BSD的Bionic,而非標注你的blibc.
- 在android中,原生代碼采用的交叉編譯工具鏈為arm-eabi-4.4.3,其能夠將原生代碼編譯為ARM架構的二進制文件.
- 在通過NDK編譯一些移植過來的嗲嗎時需要注意,arm-eabi-4.4.3對代碼的要求更加嚴格,在低版本編譯器下編譯通過的代碼在arm-eabi-4.4.3下并不一定能順利編譯通過.arm-eabi-4.4.3下并不一定能順利編譯通過.下并不一定能順利編譯通過.
- 當然在編譯模擬器部分的原生代碼時,并不需要進行交叉編譯,采用的編譯器為i686-unknown-linux-gnu-4.2.1
- 在ARM架構下,編譯出的可執行文件的格式為ELF.如果希望構建自己的交叉編譯環境,則需要用到Crosstool工具,如果希望檢測實現的原生代碼是否存在內存泄漏,則會用到Valgrind工具.
- fastboot模式
-
- 在android中,在BootLoader加載系統映像后,會通過system\core\rootdir目錄下的init.rc腳本年進行初始化配置.在init.rc中可以配置系統是去,設置日志登記,設置全局環境變量,掛載文件系統,初始化網絡配置,配置系統屬性,啟動守護京城等,具體:配置系統時區->設置日志等級->設置全局變量->創建掛載點并設置權限->->掛載文件系統->初始化網絡配置->配置系統屬性->啟動守護進程.啟動過程中的配置是系統正常運行的基本保證.
- vold(volume daemon)和Linux標注你的eudev類似,均通過sysfs為內核和用戶層提供通信.
- 應用的啟動過程
-
- AAPT允許開發者查看,創建,更新與ZIP兼容的壓縮文件(ZIP JAR APK),同時還將資源編譯到斷言asset中.
- resource.arsc為資源文件,在android 2.3前,采用的是UTF-16編碼,在android 2.3 及以后版本中,采用的是UTF-8編碼.
- 在android中,采用的java混淆器為開源的ProGuard 4.4.
- DEX字節碼借鑒了Linux的BusyBox和Qt中的SingleBuild編譯模式采用的最大限度服用信息的設計思想,能夠有效的減小生成文件的大小.
- 如果不希望應用在系統低內存時被系統銷毀,需將Application變遷的android:persistent屬性設置為true.
- 在啟動Activity的過程中,為了進行JUnit測試,具體Activity的onCreate()方法的調用時通過Instrumentation的callActivityOnCreate()方法進行的,在應用的啟動過程中會不斷調用Instrumentation.
- ? ? 內存管理
-
- 虛引用一般沒有實際意義,僅觀察GC的活動狀態,對于測試比較實用,同時必須和應用隊列ReferenceQueue一起實用.
- 垃圾回收策略
-
- 在android中通常每個應用占據一個虛擬機,所以android的垃圾回收是基于應用進行的.
- 事實上,在android的原生代碼層,通過引入應用技術機制,android同樣實現了自動垃圾回收,相關的實現位于\frameworks\base\include\utils\RefBase.h中.幾乎所有的原生類均繼承了RefBase類,RefBase類會維護對象的強引用和弱應用計數,一單強引用計數為0,對象自動釋放自己.
- 應用管理
-
- 應用的啟動
-
- 分為兩種,一種是通過啟動器啟動,另一種是通過Intent消息啟動.
- 如果在通過Intent消息啟動前,希望判斷欲啟動的應用是否已經安裝,目前有兩種方法可以檢測相關的信息,一種是檢測相關的UI組件是否存在,另一種是檢測安裝包是否存在.
- 電源管理
-
- 在移動終端中,耗電大的3個方面主要是觸摸屏,CUP和WiFi.android的整個電源管理也主要集中在這3個方面.
- android的電源管理主要是通過喚醒鎖和定時器來切換系統狀態的.
- 在android的電源管理框架中PowerManagerService是核心部分,它和Linux內核的交互是通過power.c來實現的.power.c和內核的交互是通過SYS文件來實現的.
- 喚醒鎖策略:android中,上層應用可以利用的一個電源管理策略是喚醒鎖WakeLock,通過設置標志位可以控制屏幕的背光,鍵盤燈和CPU.除非確實需要,否則不建議獲取喚醒鎖.另外喚醒鎖必須成對使用,如果申請后沒有釋放會造成系統故障,是系統永遠無法進入休眠模式.
- 下載管理
-
- 有時可能需要關注下載過程,這可以通過監控數據庫來實現.extends contentObserver
- 系統配置
-
- 系統數據庫
-
- 數據主要存儲在settings.db數據庫中.數據條目以<key,value>的形式存在,所有的值均以字符串形式存儲.
- 系統屬性:
-
- 配置系統屬性是配置android系統信息的一個方面,部分信息在編譯時配置,部分信息在運行時調用接口來配置.系統屬性存儲在\tmp\目錄下的android-sysprop文件中.
- 數據管理
-
- 數據備份
-
- 在Foryo及以上版本中,android支持應用數據的備份,數據備份功能主要是通過bmgr工具來實現的.為了申請響應應用的數據備份密鑰,每個密鑰僅對應一個包名.在默認情況下,android僅提供對應用的私有文件和配置文件的備份.
- 剪切板管理
-
- 剪切板管理是在Gingerbread中引入的,在Honeycomb中完善的.簡單類型的數據直接存儲于剪切板上,復雜的數據存儲于SQLite中.
- 使用剪切板時,對數據的操作時通過剪切對象(Clip Obejct)進行的,叫企鵝對象有3種:文本,URI,Intent.需要注意,剪切板管理是可以跨應用進行的,而且剪切板只能維護一個剪切對象,新內容會覆蓋舊內容.
- 設備管理
-
- 驅動調試工具:
-
- dmesg顯示開機信息
- insmod掛載驅動
- 網絡管理工具
-
- android并不支持ifconfig.
- netstat
- netcfg:是android自定義的用于查看網卡信息的工具.
- 應用調試工具
-
- am工具:其可以在命令行下啟動應用,服務,廣播,回歸測試,profiling,GDB調試監控(monitoring)等,在一些環境受限的場合非常有用.其位于system/bin目錄下.
- dumpsys工具
-
- 其可以觀察到當前運行的廣播,Activity棧,服務,進程,安裝包,內存信息,鬧鐘,省電配置,窗體信息,渲染信息,電池信息等.
- pm工具
-
- 其可以列出安裝包的信息,比如權限,也可以配置應用的安裝位置.
- 屬性配置工具
-
- 獲取屬性:查看屬性時通過getprop進行的: #adb shell getprop
- 設置屬性:setprop ,setprop <key> <value>
- 觀察屬性:watchprops,如:#watchprops
- getevent/sendevent工具:是android系統下的工具,可以模擬多種按鍵和觸屏操作,產生的是原始事件(raw event),原始事件經過處理產生最終的事件.(sendevent命令中數字格式為十進制,getevent命令中數字格式為十六進制,getevent用來監控按鍵,拖動,滑動事件.)
- 系統管理工具
-
- df:用來查看文件系統的磁盤占用情況,#adb shell df
- mount顯示文件系統:可以用來掛載文件系統和顯示當前文件系統的掛在情況,但是要注意,android不支持unmount工具
- 傳感器管理
-
- 在框架層,傳感器的管理是通過SensorManager進行的.和其他系統服務一樣,通過getSystemService()方法可以獲取SensorManager的句柄.
- USB管理
-
- 在android3.1中,google將底層的USB管理框架上移并由開發者開發,這就是android.hardware.usb包的由來.android.hardware.usb包并不僅用于adb調試,還用于插拔以及狀態模式的廣播.
- 在android.hardware.usb包中,UsbManager提供了最上層的USB管理.可以對USB設備進行權限判斷和獲取臨時權限.
- 應用發布
-
- 語言環境:在Froyo版本中,支持26種語言,在Gingerbread中,支持包括阿拉伯語在內的57種語言.在android中,其語言和國家的代碼遵循ISO 639和ISO 3199標準.
- 語言環境主要涉及3個方面的內容:字符集,排列方向,用語長度
-
- 字符集
-
- 注意的是:UTF-8為了保持和ASCII兼容,在支持ASCII字符集中的字符時執行8位編碼,在支持中文等字符時執行24位編碼,而UTF-16則對所有字符執行16位編碼.當然對于機器編碼,還存在big-endian和little-endian的問題.
- 用語長度:目前解決用語長度兼容性的辦法不是很多.
- 屏幕布局:對于第三方開發者開發的應用,需要特別注意resizeable屬性,應將其值設為true,這樣才能自適應新的屏幕大小.
- 發布應用:步驟
-
- 設置版本信息
- 設置應用圖標和應用名
- 關閉調試信息
- 添加各種許可文件
- 為應用程序進行數字證書簽名
- 進行發布測試
- 發布應用程序
- ? ? ?QEMU仿真器,跨平臺模擬器,能夠進行芯片級別的模擬和各種外圍設備的模擬.在GPL許可下發布,在android中,QEMU的代碼位于external\qemu目錄中.效率然不如xen,單模擬愛移動終端還是可以輕松勝任的.
- 對于Linux環境下的缺陷管理工具,作者推薦Bugzilla3,Bugfree,Jira等.這些缺陷管理工具的數據一般是基于MySQL進行的管理.
- 在Linux世界匯總,軟件管理有三大工具即APT,YUM,YAST可供使用.Ubuntu采用的是APT軟件管理工具.
- 源代碼閱讀與分析
-
- Kscope作為Cscope的前端,為大規模C/C++工程(如Linux Kernel)提供了一個優秀的源代碼編譯和分析環境.需要說明的是,Kscope無意代替當前Linux/KDE下的集成開發環境,如KDevelop等,Kscope并不提供源代碼的編譯,調試等功能.
- 源代碼查看
-
- VI
- GEdit
- KWrite
- 開發工具
-
- 代碼比較與合并(Linux下)
-
- Beyond Compare
- Meld:對于開發者常用的subversion,其自身攜帶的合并工具相對比較簡單,為了更方便的在進行SVN操作時進行比較,可以將subversion的合并工具設置為Meld.
- 作者的建議是:為工程維護兩個路徑:一個是和版本管理系統同步的目錄,一個是開發的目錄.當開發完成一個功能時,及時地將其同步到版本管理系統目錄上.當開發需要回滾時,通過版本管理系統目錄同步即可.
- KDiff3:易用性方面不如Meld.
- 版本管理與控制
-
- SVN
-
- SVN服務器有兩種運行模式:獨立服務器運行模式和借助Apache運行模式.在Linux下,最常使用的SVN服務器端工具為subversion.SVN存儲版本數據也有兩種方法:BDB和FSFS.因為BDB方式在服務器中斷時,有可能鎖住數據,所以FSFS方式更安全一點.
- KEESVN
-
- 是Ubuntu下最常用的SVN客戶端工具,但由于android源代碼過于龐大,KDESVN在數據同步過程中會存在操作上的延遲.在默認情況下KDESVN不支持將so共享庫導入到倉庫中.對于這種情況,可以在Windows下通過TortoiseSVN導入共享庫.
- git
-
- Git是LInux Kernel源代碼的控制工具,由Linux的創始人Linus Torvalds開發,是Google在Git基礎上改進的REPO,是android的版本控制工具.
- ClearCase
- 查看SQLite3數據庫
-
- Ubuntu上可以使用sqliteman
- 命名規范?
轉載于:https://www.cnblogs.com/enyusmile/p/4442045.html
總結
以上是生活随笔為你收集整理的深入Android应用开发_核心技术解析与最佳实践的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端获取当前服务器时间,不使用客户端电脑
- 下一篇: 计算机音乐本质上,电脑音乐系统的本质特点