當前位置:編程學習大全網 - 編程語言 - Android無線開發的幾種常用技術

Android無線開發的幾種常用技術

?1. Multidex

在Dalvik虛擬機所使用的dex文件格式中,用原生類型short來索引文件中的方法數,也就是最多只能有4個字節65536個method,在打包apk的過程中會把工程所需要的全部class文件都合並壓縮到壹個dex文件中,也就是說自己開發的代碼加上外部引用的庫的方法總數不能超過65535。

隨著業務邏輯的不斷增長,很容易就會超過這個限制,在編譯期間就會遇到這樣壹個錯誤:

還好google官方給出了壹個解決方案Multidex,它會把dex文件拆成兩個或多個,第二個dex文件叫classes2.dex,在Application實例化後會從apk中解壓出classes2.dex並將其拷貝到應用的目錄下,通過反射將其註入到當前的ClassLoader中。但是這個方案非但不能解決壹切問題也不能直接拿來用,而要加入自己的壹些改造,來解決NoClassDefFoundError、INSTALL_FAILED_DEXOPT等問題,以保證自己的dex被順利的加載流暢的執行。

2. Plugin

Multidex雖然可以解決方法數的限制,但隨著業務邏輯越來越多,apk的大小也變得越來越多,而且有壹些功能並非全部用戶都想用的,所以會把壹些功能模塊獨立出來做成插件,讓用戶可以按需下載更新,這樣既減小了包大小,又改善了用戶體驗。

插件類似於windows的dll文件,放在某個特定目錄,應用程序主框架會用LoadLibrary加載各dll文件,按插件接口去訪問插件。Android的插件技術也是這樣,利用壹個進程可以運行多個apk的機制,用ClassLoader將宿主apk之外的類加載進來,插件的context可以通過createPackageContext方法創建。因為插件中的activity,service等組件如果沒有在AndroidManifest.xml中聲明將不能運行,所以需要預先在AndroidManifest.xml中聲明壹個代理類(ProxyActivity),將這個ProxyActivity傳給插件,讓插件的activity也有訪問資源的能力。

3. Hot Patch

有時壹些嚴重的crash bug或漏洞需要緊急修復,但有些用戶不會或不願意立即升級,而且頻繁升級,沒有特別的功能更新只是修復bug的升級,對活躍用戶是壹種傷害。熱補丁就可以解決這樣的窘境,它是壹種可以線上修復的技術方案,有動態改變方法的能力,壹般大型的移動應用都會使用熱補丁來處理緊急事件。

Hot Patch可以通過hook來修改java的method,註入自己的代碼,實現非侵入式的runtime修改,或者采用正向編程,通過工具生成patch文件,通過jni bridge指向補丁文件中的方法。還有就是利用ClassLoader,在dex中查找class時,如果找到類則返回,找不到就從下壹個dex文件中繼續查找,由此可以想到,在把問題修復後,可以單獨生成壹個dex,通過反射插入到dexElements數組的最前面,這樣就能讓dalvik加載補丁裏的類了。

4. Push通道

Push是移動App常用的壹種無線技術,基礎是基於TCP的心跳機制,和客戶端維持壹個長連接。用處是向客戶端推送消息,或者代替客戶端定時去從服務器pull的策略,改為客戶端接收到push消息後再去pull。

如果每個應用都自己實現push通道的話,cpu就會不定時地經常被喚醒,耗電量達到難以容忍的程度,而且自己搭建push平臺的成本也很大,實時性和效率也存在問題,壹般都直接使用壹些服務商提供的push方案,這些push平臺壹般都經過了優化設計,在跨平臺和網絡穿透性、長連接心跳包、多客戶端App鏈路復用、服務和連接保活等技術上做了優化。比如Agoo最初是淘寶無線事業部開發的push服務,在逐漸完善和支撐淘系其他app後,通過服務端容量、通訊協議優化、業務和開放能力的拓展改進後,與友盟等合作,開始向第三方提供推送服務。

5. 應用加固

壹款熱門的移動app或遊戲發布後會受到很多的關註,經常會遇到二次打包的盜版行為,破解者要麽修改遊戲的資源文件、道具、分值甚至直接把訪問的站點指向自己架設的服務器,損害了開發者的利益;要麽偷偷植入自己的惡意代碼,表面上看起來跟正版的app完全壹樣,在後臺卻盜取用戶隱私,植入木馬;要麽通過反向工程學習原app的核心技術,打破技術上的競爭壁壘。

為了防止被破解只通過混淆是遠遠不夠的,即使是在native層混淆也還是會被人熟練的反編譯,所以需要壹套對apk的保護方案來反調試、防逆向和防篡改。壹般的加固方法都是對原apk先進行加密,然後和殼合並生成新的apk。殼是用來解密apk的dex文件。當應用啟動時,殼先解密原apk,準備好自己定義的ClassLoader,然後獲取源程序中的Application名稱,通過反射找到正確的Application對象,運行它的onCreate方法,這樣原apk才能被真正運行。其他壹些反調試的方法有針對反編譯工具,在源程序中加入壹些無效的指令或無效的指針,引發反編譯工具的崩潰,還有就是加花指令,利用壹些跳轉,堆棧操作等指令,讓破解者無法清楚地理解反匯編後的內容。

6. 其他

除了上述幾點外,在服務端還會涉及灰度策略、鏈路流量優化、動態更新配置、防DNS劫持等技術,在客戶端會涉及用戶埋點上報、在線監控、進程保活、H5和native混合開發、註入框架等。

  • 上一篇:北大青鳥java培訓:程序員需要了解的10個面向對象設計?
  • 下一篇:大眾寶來和朗逸誰更值得選?
  • copyright 2024編程學習大全網