移動辦公,是企業(yè)協(xié)同產(chǎn)品的大勢所趨。但在實際使用過程中,對于同一個產(chǎn)品,可能不同企業(yè)對于其定位都不太一樣;另一方面,一個產(chǎn)品也難以完全符合不同企業(yè)的需求,此時就需要根據(jù)其訴求進行產(chǎn)品定制化。面對企業(yè)不同的個性化需求,解決思路往往也是不同的,這要求產(chǎn)品擁有一定的擴展能力,例如,最初通過打包配置項+后臺參數(shù)配置+應(yīng)用跳轉(zhuǎn)的方式來進行自定義功能擴展;發(fā)展為支持通過內(nèi)嵌一個擴展應(yīng)用,如完成定制首頁的效果;后續(xù)發(fā)展為支持?jǐn)U展自定義輕應(yīng)用、小程序等插件,如為應(yīng)用實現(xiàn)某定制協(xié)議的NFC卡識別能力;再進一步發(fā)展為支持配置嵌入原生代碼,如配置一個定制的原生首頁或?qū)崿F(xiàn)一個統(tǒng)計步數(shù)的后臺服務(wù)等。聯(lián)系客服小表妹(VX:pingaoyunzzm)了解更多。
然而,擴展的靈活性,也會同時給產(chǎn)品帶來更多的不確定性因素,即每個擴展應(yīng)用都有讓程序崩潰的可能性,導(dǎo)致問題的定位變得更困難。例如,公安行業(yè)中使用的是定制安全系統(tǒng)的手機,并且面對的是復(fù)雜的內(nèi)網(wǎng)環(huán)境,一旦程序出現(xiàn)問題,其故障排查通常需要大費周章。在這種情況下,如果能對系統(tǒng)日志、網(wǎng)絡(luò)請求、使用內(nèi)存等各方面進行監(jiān)控,將有利于準(zhǔn)確尋找問題根源。
聆客企業(yè)協(xié)作平臺(BingoLink,下簡稱“聆客”)是一款面向企業(yè)生態(tài)系統(tǒng)的云端協(xié)作與開放平臺,可為企業(yè)開發(fā)者提供一站式的應(yīng)用開發(fā)環(huán)境擴展和定制標(biāo)準(zhǔn)功能、集成和聯(lián)通第三方應(yīng)用并構(gòu)建全新業(yè)務(wù)單元,通過敏捷開發(fā)和快速迭代幫助企業(yè)實現(xiàn)全面信息化。本文將主要從技術(shù)的角度對聆客Android端開發(fā)的擴展能力和監(jiān)控能力進行介紹。
本期大咖 >>
譚智慧
品高云應(yīng)用產(chǎn)品研發(fā)工程師,擁有多年豐富的移動化產(chǎn)品構(gòu)建經(jīng)驗。目前主要負(fù)責(zé)聆客企業(yè)協(xié)作平臺(BingoLink)的Android端研發(fā)工作,包括:操作系統(tǒng)新特性與兼容性的研究、產(chǎn)品體驗和性能的優(yōu)化、產(chǎn)品功能的持續(xù)迭代(如:消息點對點加密、語音視頻聊天)等。
一、擴展能力
1. 聆客能利用打包平臺的能力達到擴展的效果,為企業(yè)自由組合不同的個性化版本。首先,需要在代碼中預(yù)留替換參數(shù)文件和資源文件夾,然后打包平臺并依據(jù)不同企業(yè)的設(shè)置按照預(yù)設(shè)規(guī)則進行參數(shù)和資源替換,最后執(zhí)行編譯命令生成APK文件。這里用簡單的流程圖介紹一下打包平臺中對于Android程序的執(zhí)行流程:
• 界面配置:聆客的UI支持顏色、圖片、語言包以及界面的自由搭配。在Android的編譯過程中,AAPT對于資源的生成會遵循項目的依賴關(guān)系,我們可以利用生成的這個規(guī)則對于資源重復(fù)的情況做一個優(yōu)先級處理,使打包最終效果為:所有的資源項都將優(yōu)先使用打包配置的資源,其次再使用內(nèi)置的代碼。
• 功能配置:在功能配置方面,聆客使用INI格式進行定義,該格式的優(yōu)點在于定義簡單,便于打包人員或管理人員進行配置,降低人為造成的出錯概率。參數(shù)除了支持自定義以外,還包含當(dāng)前界面的變量,例如群組名片擴展的功能會傳入當(dāng)前群名片的ID,個人聊天擴展的功能菜單會傳入當(dāng)前聊天對象的ID。
2. 通過自定義開發(fā)的方式達到擴展的效果,結(jié)合上述的功能配置,可以在聆客預(yù)留的擴展點嵌入自定義功能開發(fā)。
• 聆客為開發(fā)者提供了H5、輕應(yīng)用、小程序、原生應(yīng)用多種不同APP類型的接入和擴展,除了管理應(yīng)用的安裝、更新和卸載外,還為接入應(yīng)用提供了便捷的SSO單點登錄集成以及大量的原生API調(diào)用。
• 支持Native的擴展,開發(fā)者除了可以用內(nèi)置的API以外,還能對Native層進行自定義擴展,比如對輕應(yīng)用自定義Plugin、對小程序自定義Module和Component,甚至在首頁Tab內(nèi)嵌一個自定義原生的Fragment。通過APP+Native的擴展,開發(fā)者可以實現(xiàn)各種不同需求的定制開發(fā)。
二、監(jiān)控能力
1、監(jiān)控接口請求
對主流的HTTP請求庫關(guān)鍵函數(shù)進行Hook操作,可以對整個APP使用這些庫發(fā)起的HTTP請求進行統(tǒng)一監(jiān)控。這樣做的優(yōu)點是,除了能監(jiān)控平臺內(nèi)發(fā)起的請求外,還能監(jiān)控第三方開發(fā)者自己擴展的插件。
該能力主要是通過ASM修改字節(jié)碼的方式實現(xiàn)的,通過自定義Gradle方式修改Dex生成的過程,在這個過程里找到需要替換的Class類,再找關(guān)鍵函數(shù)并對其注入監(jiān)控的代碼。
小技巧:注入代碼里如果需要用到未公開的類,可以用Object代替。
2、監(jiān)控全局日志
很多Android開發(fā)者都知道手機直接通過數(shù)據(jù)線連接就可以通過ADB查看Logcat日志,但在某些屏蔽了USB連接的操作系統(tǒng),例如公安行業(yè)定制的安全系統(tǒng)里,是無法進行數(shù)據(jù)線操作的,這時如果程序出現(xiàn)Bug,即便拿到手機也難以排查問題,該如何解決?辦法還是有的,在這個場景下我們就要繞過ADB能力,通過程序直接調(diào)用系統(tǒng)內(nèi)置的Logcat命令工具收集日志,自己實現(xiàn)對日志的輸出控制臺和日志的收集。
小技巧:Logcat執(zhí)行會包括其他APP產(chǎn)生的日志,而且該命令也沒有過濾參數(shù),不過我們可以發(fā)現(xiàn)每行日志都會包含進程ID這一規(guī)律,所以這里調(diào)用命令時可以通過使用Grep Pid進行過濾,只保留該應(yīng)用的日志。
3、崩潰日志收集
有時,出現(xiàn)一些偶現(xiàn)或出現(xiàn)概率低的崩潰會很難定位,加上平臺支持自定義的代碼擴展也會增加崩潰的可能性,而且出現(xiàn)崩潰時上述的全局日志監(jiān)控已經(jīng)無法生效,因為Logcat的輸出是異步的,出現(xiàn)崩潰意味著進程將停止運行。不過幸好系統(tǒng)的API為開發(fā)者提供了這個時機的擴展:通過Thread提供的能力,捕獲所有線程中崩潰時出現(xiàn)的異常信息,平臺可以在崩潰時保存當(dāng)前時間、手機型號、堆棧信息等信息,只要程序下次啟動時把崩潰日志再發(fā)回來,Bug就原形畢露了。
4、內(nèi)存異常監(jiān)控
相信不少開發(fā)者都碰到過OutOfMemory的情況,平臺會增加內(nèi)存溢出的可能性,但不僅平臺自身面臨著這種風(fēng)險,上架的每一個應(yīng)用都有內(nèi)存泄露的風(fēng)險,并且長時間打開應(yīng)用不關(guān)閉還會有內(nèi)存溢出的可能。當(dāng)這種情況出現(xiàn)時,說明程序里所有代碼都已經(jīng)極為不穩(wěn)定,每個對象的創(chuàng)建都有引起OutOfMemory崩潰的可能,此時上文提及的崩潰日志已經(jīng)基本沒什么作用。因為堆棧里顯示的是最后一次申請空間達到上限拋出的,但這往往不是引起內(nèi)存溢出的罪魁禍?zhǔn)祝苍S甚至還令人疑惑:這點小操作怎么可能就引起內(nèi)存溢出呢?
那么,遇到這種情況該怎么辦?
面對這種情況,聆客的解決辦法是,基于上面的記錄崩潰時機判斷如果出現(xiàn)OutOfMemory異常,把這一刻的內(nèi)存情況Dump保存下來,剩下的就是通過工具分析內(nèi)存情況和享受解決Bug的過程了。
5、界面卡頓監(jiān)控
偶然出現(xiàn)的操作卡頓現(xiàn)象,這種體驗的優(yōu)化是比較頭疼的——因為沒有錯誤日志,讓人有種無從下手的感覺。聆客利用MainLoop類提供的能力,該類提供了一個日志回調(diào)的方法讓開發(fā)者可以清楚知道主線程的調(diào)用過程,程序里通過把每次調(diào)用的開始時間和結(jié)束時間作比較,耗時大的即為卡頓,把本次主線程的堆棧信息記錄下來,最后就可以根據(jù)卡頓時的堆棧信息來解決Bug了。
三、總結(jié)
綜上,聆客企業(yè)協(xié)作平臺的擴展能力能滿足企業(yè)的定制化需求,讓開發(fā)者實現(xiàn)更敏捷全能的開發(fā);而監(jiān)控能力則可以解決因集成應(yīng)用多或擴展多樣性所導(dǎo)致的程序不穩(wěn)定引發(fā)的問題排查困難,有利于開發(fā)者解決應(yīng)用故障。
隨著聆客產(chǎn)品的持續(xù)發(fā)展,我們將不斷對各種各樣的用戶痛點進行分析與解決,例如安全性方面的應(yīng)用加固、本地數(shù)據(jù)安全、應(yīng)用防篡改和網(wǎng)絡(luò)防劫持等,還包括性能方面的消息數(shù)據(jù)量膨脹的優(yōu)化、復(fù)雜布局結(jié)構(gòu)的優(yōu)化、應(yīng)用啟動速度優(yōu)化以及節(jié)省流量和電量消耗等問題,敬請期待后續(xù)的專題技術(shù)分享。