移動app的產品形態各不相同,有的是內容,有的是工具,有的是社交,所以它們的商業邏輯側重於壹些不同的核心技術,但都使用了壹些通用的技術解決方案。今天,我們將簡要介紹這些常用技術,然後我們將通過專題詳細介紹這些技術的原理和使用場景。
1.多指數
在Dalvik虛擬機使用的dex文件格式中,原生類型short用於索引文件中方法的數量,即最多只能有4個字節的65536個方法。在打包apk的過程中,項目需要的所有類文件都會合並壓縮成壹個dex文件,也就是說自研代碼加上外部引用庫的方法總數不能超過65535個。
隨著業務邏輯的不斷增長,很容易超過這個限制,在編譯時您會遇到這樣壹個錯誤:
幸運的是,谷歌官方給出了壹個解決方案Multidex,它將把dex文件拆分為兩個或更多。第二個dex文件稱為classes2.dex .應用程序實例化後,它將從apk中提取Classes2.dex並將其復制到應用程序目錄中,並通過反射將其註入當前的類加載器中。但是這種方案不能解決所有問題,不能直接使用。相反,它需要添加壹些自己的修改來解決NoClassDefFoundError、INSTALL_FAILED_DEXOPT等問題,以確保自己的dex順利加載並順利執行。
2.插件
雖然Multidex可以解決方法數量的限制,但隨著業務邏輯越來越多,apk的規模變得越來越大,有些功能並不是所有用戶都想使用的,因此會將壹些功能模塊獨立制作成插件,以便用戶按需下載更新,這不僅減少了包的大小,還提高了用戶體驗。
插件類似於windows dll文件,放在特定的目錄中。應用程序的主框架將使用LoadLibrary加載所有dll文件並根據插件接口訪問插件。Android的插件技術也是如此,它使用壹個進程可以運行多個apk的機制,用ClassLoader加載除主機apk之外的類,插件的上下文可以通過createPackageContext方法創建。因為插件中的活動、服務和其他組件如果沒有在AndroidManifest.xml中聲明就不會運行,所以有必要提前在AndroidManifest.xml中聲明壹個ProxyActivity並將此ProxyActivity傳遞給插件,以便插件的活動也可以訪問資源。
3.熱補
有時壹些嚴重的崩潰錯誤或漏洞需要緊急修復,但壹些用戶不會或不願意立即升級,他們經常升級。無特殊功能更新只是修復bug的升級,對活躍用戶是壹種傷害。熱補丁可以解決這壹困境。它是壹種可以在線修復的技術方案,具有動態改變方法的能力。通常,大型移動應用程序會使用熱補丁來應對緊急情況。
熱補丁可以通過hook修改java方法,註入自己的代碼,並實現無創的運行時修改,或者采用正向編程,通過工具生成補丁文件,通過jni bridge指向補丁文件中的方法。還可以使用ClassLoader在dex中搜索類。如果妳找到壹門課,妳就會回來。如果找不到,將從下壹個dex文件繼續搜索。可以認為在修復問題後,可以單獨生成壹個dex並通過反射將其插入到dexElements數組的前面,這樣dalvik就可以加載補丁中的類。
4.推送通道
Push是手機App中常用的壹種無線技術,基於TCP的心跳機制,與客戶端保持長時間連接。目的是將消息推送到客戶端,或者替換客戶端定期從服務器拉取的策略,取而代之的是客戶端在收到推送消息後將進行拉取。
如果每個應用程序都實現自己的推送通道,則cpu會不時醒來,功耗將達到無法忍受的程度。而且自建推送平臺的成本也很高,實時性和效率都存在問題。壹般直接使用壹些服務商提供的推送方案。這些推送平臺通常在跨平臺和網絡滲透、長連接心跳包、多客戶端App鏈接重用以及服務和連接保活等方面進行了優化。例如,Agoo最初是淘寶無線事業部開發的推送服務。在逐步完善和支持其他app後,它與友盟等合作,通過服務器容量、通信協議優化、業務和開放性的擴展和改進,向第三方提供推送服務。
使用強化材料
壹款熱門手機app或遊戲發布後會獲得大量關註,往往會遭遇二次包裝的盜版行為。黑客要麽修改遊戲的資源文件、道具和分數,甚至直接將訪問的網站指向他設置的服務器,這將損害開發者的利益。要麽偷偷植入自己的惡意代碼,表面看起來和正版app壹模壹樣,但在後臺竊取用戶隱私並植入木馬;要麽通過逆向工程學習原app的核心技術,打破競爭的技術壁壘。
為了防止被破解,僅僅混淆是不夠的,即使在原生層混淆,仍然會被巧妙地反編譯,因此需要壹套針對apk的保護方案來防止調試、逆向和篡改。壹般的加固方法是先加密原始apk,然後與shell合並生成新的apk。shell用於解密apk的dex文件。當應用程序啟動時,shell解密原始apk,準備自己定義的類加載器,然後在源程序中獲取應用程序的名稱,通過反射找到正確的應用程序對象,並運行其onCreate方法,這樣原始apk就可以真正運行了。其他反調試方法包括在源程序中添加壹些無效指令或無效指針,從而導致反調試工具崩潰,以及添加指令,使用壹些跳轉,堆棧操作等指令,使破解者無法清楚地了解反匯編的內容。
6.其他人
除了以上幾點,還有灰度策略、鏈路流量優化、動態更新配置、DNS防劫持等技術。在服務器端會涉及到,在客戶端會涉及到用戶埋點報告、在線監控、進程保活、H5和原生混合開發以及註入框架。