完整的開發一個android移動App須要通過從分解需求、架構設計到開發調試、測試、上線發佈等多個階段,在發佈後還會有產品功能上的迭代演進,此外還會面對性能、安全、無線網絡質量等多方面的問題。java
移動App的產品形態各不相同,有的是內容類,有的是工具類,有的是社交類,因此它們的業務邏輯所偏重的核心技術有些差異,但它們都會用到一些經常使用的技術方案。今天咱們就先來簡單介紹一下這些經常使用技術,之後會專門分專題來詳細介紹這些技術的原理和使用場景。android
1. Multidex編程
在Dalvik虛擬機所使用的dex文件格式中,用原生類型short來索引文件中的方法數,也就是最多隻能有4個字節65536個method,在打包apk的過程當中會把工程所須要的所有class文件都合併壓縮到一個dex文件中,也就是說本身開發的代碼加上外部引用的庫的方法總數不能超過65535。windows
隨着業務邏輯的不斷增加,很容易就會超過這個限制,在編譯期間就會遇到這樣一個錯誤:數組
還好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混合開發、注入框架等。
對於以上技術,本人會在後面慢慢鋪開,深刻分析,完整地展現給你們!敬請關注!
· 更多Android、Linux、嵌入式和物聯網原創技術分享敬請關注微信公衆號:嵌入式企鵝圈。