Android開發(fā)常見的難題

經(jīng)過五年的Android開發(fā)生涯,我總結(jié)了Android實際項目開發(fā)中需要注意的難點如下

耗電.

一般在開發(fā)階段, 開發(fā)者自測階段都很難準(zhǔn)確, 周全的為省電處處做特殊優(yōu)化. 很多時候要著急出功能, 當(dāng)項目或產(chǎn)品已經(jīng)落成的時候, 當(dāng)然更多的時候直到用戶對比后反饋你說, 你的應(yīng)用耗電啦, 你這才會針對這個問題著手分析, 可這個時候就更難準(zhǔn)確把握是哪里耗電了. 有可能是網(wǎng)絡(luò), 有可能是屏幕常亮, 有可能是后臺服務(wù), 有可能是無用的死循環(huán), 也有可能是在很隱蔽的你沒找到的地方;

流暢.

你可能在做有大圖片處理相關(guān)的UI, 或者很多圖片的列表, 網(wǎng)格時遇到過卡頓的問題, 也可能在做復(fù)雜繪制, 比如實時陰影, 或者復(fù)雜動畫, 滑動, 漸變效果時發(fā)現(xiàn)不流暢. 這個問題有時是因為效果的實現(xiàn)思路不當(dāng), 比如本該用View卻使用了Window, 比如本該直接繪制位圖, 卻使用畫圖API; 而有些是編碼不當(dāng); 有些是因為頻繁的垃圾回收導(dǎo)致; 有時可能需要多線程處理以避免占用UI線程; 有時可能需要在fling的時候暫停刷新或加載. 如果你在開發(fā)階段遇到了卡頓, 那是不幸中的萬幸, 很多時候在你的測試機器上流暢的效果, 在很多你看不到的用戶的低端配置機器上卡頓無比;

網(wǎng)絡(luò).

移動設(shè)備有個特點就是可能網(wǎng)絡(luò)環(huán)境不穩(wěn)定, 舉個例子, 當(dāng)你上傳或下載到一半網(wǎng)絡(luò)斷了, 需要怎么處理才更人性化, 更使你的應(yīng)用站在高可用, 高健壯的行列? 再比如你的應(yīng)用被指出很費流量如何解決, 是不是你的同步網(wǎng)絡(luò)布局在架構(gòu)上存在著不合理的地方, 協(xié)議沒設(shè)計好? 比如應(yīng)該使用壓縮的精簡合理的json數(shù)據(jù)的地方, 卻用了冗余復(fù)雜而重復(fù)的xml還未做壓縮? 亦或者你的統(tǒng)計數(shù)據(jù)收集的太著急, 每次崩潰日志都要發(fā)送給開發(fā)者郵箱? 再比如怎么實現(xiàn)推送才能準(zhǔn)確, 盡可能及時而又省電. 加載一個界面慢是否因為網(wǎng)絡(luò)獲取數(shù)據(jù)慢? 能否緩存在本地? 應(yīng)用的服務(wù)端是否拖后腿, 服務(wù)器網(wǎng)絡(luò)是否存在著CDN? 如果你正在做視頻聊天或者在線視頻相關(guān)的功能, 可能更需要對網(wǎng)絡(luò)特點和用戶可能的網(wǎng)絡(luò)情況做更多的對策.

內(nèi)存.

移動設(shè)備中供一個應(yīng)用使用的內(nèi)存往往很少. 很占內(nèi)存的大圖片或者眾多需要顯示的圖片都會導(dǎo)致OOM. 亦或者圖片顯示沒問題, 但圖片很占內(nèi)存, 用完沒有及時釋放, 久而久之也可能導(dǎo)致OOM. 不當(dāng)?shù)膭?chuàng)建眾多實例, 繁多的單例有可能因為存在引用而不能被回收, 從而內(nèi)存溢出. 如果恰巧不當(dāng)引用了Activity或者相關(guān)的, 比如View, Drawable, Fragment, Window的實例都有可能導(dǎo)致內(nèi)存泄露. 這些需要耐心分析, 項目或產(chǎn)品落成后, 很麻煩, 很頭痛, 甚至無從下手. 另一個問題是操作系統(tǒng)說內(nèi)存不夠了, 指著你的應(yīng)用說你釋放點內(nèi)存吧(onLowMemory& onTrimMemory), 你做了什么處理? 還有的時候逼你做流式過程化編程, 比如內(nèi)存有限, 不能把所有DOM節(jié)點都加載進(jìn)去, 而要使用SAX或XmlPullParser解析字符串, 比如你本可以使用寫一個DAO將數(shù)據(jù)存入JavaBean重復(fù)利用, 卻不得不直接使用Cursor, 將它散布在項目代碼各處;

大小.

指APK的大小, 顯然作為客戶端使安裝包盡可能小是你義不容辭的責(zé)任, 從而帶來的問題是, 你的代碼布局, 類設(shè)計, 框架設(shè)計以及某些細(xì)節(jié)實現(xiàn)要盡可能合理; 另一個是不管你項目或產(chǎn)品多著急, 可能不允許你隨意使用第三方類庫, 盡管他們很方便更健壯, 即你可能要拋棄了大輪子, 還要打造小輪子, 重復(fù)發(fā)明輪子. 比如你為了做一個難度較大的動畫效果而引入游戲動畫引擎的可能性很低, 只能自己摸索實現(xiàn)動畫的每個細(xì)節(jié), 再比如你需要放棄使用好用的FastJson或Gson, 而用Android自帶的org.json庫, 除非有特殊需要或十分明確而又堂而皇之的理由, 否則不應(yīng)該包含自己編譯的sqlite或openssl庫, 另外你可能不能直接使用Apache Commons或者Guava之類的庫, Ioc框架的庫等, 要么需要裁切這些庫要么自己封裝, 然后你每換一份工作都重新熟悉他們獨有的封裝;

安全.

包括sqlite數(shù)據(jù)庫的加解密方案, 是加密數(shù)據(jù)庫管理系統(tǒng)呢還是加密關(guān)鍵字段? 包括網(wǎng)絡(luò)通信安全, 你可能需要使用SSL; 包括代碼安全, 你可能不希望你的勞動成果, 尤其是門檻很高的關(guān)鍵技術(shù), 隨意的被任何人看到或使用; 你可能不希望你的應(yīng)用被加了很多廣告或瑕疵又重新發(fā)布到應(yīng)用市場擾亂你的信譽, 剝削你的收益; 如果你的應(yīng)用涉及電子商務(wù), 安全支付或者虛擬貨幣, 你需要設(shè)計良好的業(yè)務(wù)流程和邏輯, 并且這些核心不容別人查看或?qū)ふ衣┒? 為此, 你可能會做代碼混淆, 而很多類不允許你混淆, 這樣App跑起來后因為NotFound而抱怨; 你可能將很多實現(xiàn)移入so, 因為是用c/c++寫代碼, 如果你不熟悉, 很可能錯誤百出, 而且經(jīng)常引起其他問題, 比如因平臺相關(guān)而導(dǎo)致的兼容問題; 即便這些你都花時間學(xué)了, 也努力做了, 還有一個揮之不去的問題, 就是安全領(lǐng)域是對抗性的工作. 你的應(yīng)用現(xiàn)在安全不代表以后也安全, 如果應(yīng)用受歡迎, 會有大把的人來研究破解你的程序; 不僅如此, 你可能還需要謹(jǐn)慎的使用四大組件, Android設(shè)置App, 這些可能無形中幫了不法分子去損害你用戶的權(quán)益;

生存.

這個問題其實可以并入其他問題中. 這里所謂的生存不是指App火多久, 這可能不在程序員的考慮之中. 這里的生存就像人的生存, 人要生存離不開社會環(huán)境, 應(yīng)用要生存離不開操作系統(tǒng)和其他應(yīng)用的配合. 比如操作系統(tǒng)或者安全軟件可能無故, 有意, 有理由殺死用戶手機上你的進(jìn)程, 而不發(fā)給你任何郵件. 比如你需要輸入法的某種配合卻找不到接口或入口, 比如輸入法窗口或者其他應(yīng)用因為你的某段代碼的執(zhí)行或者用戶的操作, 無情的遮擋了你需要實時通知給用戶的信息, 再比如你在通知欄上做的信息顯示, 其效果在某些機型上讓你感到費解, 再比如小米不允許未經(jīng)同意就顯示懸浮窗;

兼容.

這個問題的范圍最廣, 很多問題都可以歸入這個問題. 它包括了很多方面, 比如Android手機廠商眾多, 有些開發(fā)者可能還要面對平板, PC, 手表, 電視等. 而且?guī)缀跛袕S商都是拿Android源碼改造加上自己的硬件方案, 導(dǎo)致屏幕大小不同, 硬件配置不同, 操作系統(tǒng)實現(xiàn)水平參差不齊, 這帶來了屏幕適配問題, 還有如果你的App需要NFC, 用戶的機型沒有相關(guān)設(shè)施, 不能就弱弱的崩潰了結(jié)吧? 另外, 如果你需要在native app和unify app(web app和ndk app)中做出選擇, 都會有兼容問題(手機中native app的特點是Android實現(xiàn)一套, IOS實現(xiàn)一套, 而unify app是借助html4/html5或者c/c++僅實現(xiàn)一套, 然后在Android和IOS上做個殼子, 如此也就意味著開發(fā)者受眾不同). 如果是native app需要面對Android API的變化, 比如是否兼容2.3還是兼容4.0以上, 因為Android API版本的遷移過程中有些實現(xiàn)改了, 有些廢棄方法刪了, 有些好方法添加了, 還有是否使用android-support庫; 如果是web app, 可能需要在不同手機瀏覽器上做兼容, 也可能加載在自己的webview上, 但你是否知道不同機型webview的實現(xiàn)都不一樣? 有些操作實現(xiàn)無效果或受限, 有些機型加載網(wǎng)頁慢, 這些你遇到過嗎? ndk app的問題經(jīng)常是so引起的崩潰和少的可憐的崩潰信息, 而且很多測試時跑的好好的程序, 在某些機器上說找不到so庫或者來個段錯誤. 上面說的輸入法, 及其他應(yīng)用也會有兼容問題, 搜狗輸入法和其他輸入法對某些操作的反應(yīng)都不一樣. 最后要提的兼容問題是升級設(shè)置, 即是否允許不同老版本在用戶市場上并存, 此時不同版本的協(xié)議變遷如何設(shè)計兼容? 亦或者強制升級到最新的一個或兩個版本上, 是做增量升級還是整體下載升級, 升級失敗如何處理?
這么多棘手的問題, 隱患和風(fēng)險, 你是否評估好了, 準(zhǔn)備好了, 設(shè)計做足了, 有好對策了?


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容