精品伊人久久大香线蕉,开心久久婷婷综合中文字幕,杏田冲梨,人妻无码aⅴ不卡中文字幕

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
Android程序猿必看之《終端應用開發指南》

一、前言

4G移動網絡的商用為移動互聯網的蓬勃生長提供了肥沃的土壤,并協同國內外眾多互聯網廠商及終端廠商共同引領了中國移動互聯網翻天覆地的發展與創新。

2014年以來移動4G用戶數目顯著提升,拉動了全網用戶的流量增長,同時隨著流量資費的下降,運營商將與優秀APP互助互惠:更充足更寬帶寬的數據業務促進用戶對移動終端APP的使用,而優秀的APP則會拉動移動互聯網流量的進一步增長。

2016年中國智能手機用戶預計將達6億以上,智能手機已經并將進一步滲透至人們生活中的方方面面。根據2014年數據,中國移動終端用戶平均安裝34款應用,單臺終端平均每日下載應用3款以上,打開應用可達20款,用戶每日使用APP的時間也持續增加。作為移動互聯網的入口,APP的質量優秀與否已成為用戶對移動互聯網體驗的重要影響因素。

2014,GooglePlay商店的應用數量已達143萬,開發者數量已達38.8萬。如此規模巨大的市場吸引大量開發者及團隊的加入,帶來了空前的繁榮與競爭。如何在規模成百上千的競品當中脫穎而出,一方面需要優秀的運營團隊及策略,而更能起到決定性作用的是APP本身的品質。《終端應用開發指南》將從網絡、終端與APP協同工作的角度出發,基于Android平臺,對如何開發出優質的APP從而為用戶提供更卓越的互聯網使用體驗給出參考建議。

二、如何定義優秀的APP

對于一款優秀的APP,“可用”是基本前提,“好用”是脫穎而出的必要條件,安全則是保護用戶權益的根本保障。

“可用”:移動終端設備尤其是Android手機的高度碎片化給應用的兼容性帶來了巨大挑戰。這一碎片化既包括硬件配置如芯片平臺、顯示屏幕等,更涉及了極為豐富多樣的操作系統。完善的兼容性成為了保證用戶使用體驗、提升APP質量的重要因素。

“好用”:相比于PC等傳統終端設備,移動終端設備能力雖然已得到極大的提升,但內存、電量等資源依然格外寶貴。在各類APP層出不窮的當下,一款APP僅僅做到“可用”還遠遠不夠。

“安全”:移動應用迅速覆蓋了包括出行就餐、日常起居、甚至金融理財等各個領域。然而凡事有利有弊,Android漏洞、APP安全早已飽受詬病。應用安全已經成為用戶挑選應用產品甚至挑選應用商店的決定因素。如何保護用戶的數據安全及權限安全成為了開發者需要研究的重要課題。

移動終端產品與時俱進,已成為普羅大眾眼中高新科技的代言詞,也漸漸成為大眾日常使用的最具科技感的個人電子設備。在“可用”“好用”“安全”的基礎上,應用開發者們應不斷擴展視野,并充分整合已有的最新資源,在廣度上覆蓋更多的移動終端產品,在深度上不斷挖掘移動終端的各項能力,為用戶提供更多。

本文將主要圍繞著“可用”“好用”“安全”“新技術”四方面展開。第三章從操作系統版本、屏幕分辨率等方面對常見的問題進行了闡述,并拋磚引玉,給出了解決部分問題的參考建議。第四章將分別從系統資源、功耗、網絡性能以及APP的交互設計等幾個方面對已有的問題進行闡述并提供建議。第五章強調了安全的重要性以及如何去保證安全,將從數據安全、權限安全以及內容安全等方面對問題進行闡述并給出相應問題可供參考的解決辦法。第六章主要從終端新能力、網絡新技術以及終端新趨勢三個方向進行介紹。

三、讓APP能被每一個用戶使用

終端市場發展迅速,蓬勃的市場帶來了市面上千百款終端巨大的差異性。一方面,用戶需求變更及科技的快速發展推進終端的硬件及操作系統的迭代更新;另一方面,各終端廠商為打造自身品牌體現產品的差異化,對外觀及操作系統進行大量的、深度的個性化定制。顯著的差異化給APP開發者的適配工作帶來了巨大的挑戰,完善的兼容性成為了保證用戶使用體驗、提升APP質量的基本要素。

3.1 豐富多樣的操作系統

根據最新統計,2014年至2015年第三季度國內銷售智能終端各操作系統占比如下圖所示。

2015第三季度銷售的iOS及Android終端占比之和已超過95%。2015年Android占比雖有所下降,但依然占據主導地位,占比高達80%以上。

為了充分開發硬件能力、滿足用戶需求并提升用戶體驗,Google周期性推出新操作系統版本更新,并不定期進行小版本升級。相對而言,由于終端硬件的不支持或用戶基于自身喜好不傾向于更新系統,終端產品無法保證操作系統同步更新至最新版本,這導致了市面上同時存在多個操作系統版本的問題。相比于iOS,Android由于其開放特性,使越來越多的終端廠商加入其陣營當中,愈發加劇了Android系統的碎片化。2015年第三季度在網終端產品及國內銷售終端產品Android版本占比分別如下所示:

目前在網Android手機搭載的操作系統中小版本多達20個以上,其中大版本仍以4.X為主,但2015年第三季度銷售的Android手機搭載的操作系統中5.0版本已占較大比例,4.4及5.0二者占比共計76.74%。

Android陣營的碎片化不只體現在系統版本,更體現在了各終端廠商及互聯網公司定制化系統的多樣性。2015年以來國內銷售終端搭載的定制系統多達36款,如MIUI、EmotionUI、Flyme等,若考慮個人愛好者開發的相對小眾的產品,定制系統的種類將更是數不勝數。廠商因為各種各樣的原因修改了Android系統的API,帶來部分APP無法安裝、運行出錯、強制退出等問題,給APP的適配帶來了極大困難。

通過對海量測試數據深度的收集整理與分析,這里總結了最為常見的適配問題并提出了相應的解決方案:

1. 在低版本Android系統上調用高版本API導致應用Crash

在不斷升級的過程中,Android為支持新的功能和特性需增添新的API。開發者如果在應用內調用了此類API,同時沒有限定應用最低支持版本,則在低版本上運行時會出現崩潰異常。

當Android發布新版本,開發者一方面要重點關注Google新增的功能,另一方面要關注新增功能所使用的API是否為新增。如果應用在迭代升級的過程中使用了新增功能或函數,那么應用開發過程中一定要注意新增功能在低版本Android系統上實現的兼容性。

2. 使用Android官方廢棄函數導致應用不兼容新版本

在Android版本更新的過程中,不僅僅會增加新的函數,也會由于需求的變更或基于執行效率的考慮而刪除部分函數。開發者在APP開發過程中,如果未能及時跟進和更新應用中相應功能實現,應用在新版本系統上調用已經刪除的函數,運行時候就會出現崩潰異常。

3. 由于廠商定制系統導致的不兼容問題

Android系統的開放性吸引了大量的終端廠商加入其陣營當中。基于產品的差異化需求,直接使用Android原生系統的終端廠商寥寥無幾,很多廠商在定制系統中對應用程序框架層有或多或少的改動。

如部分廠商在定制系統時修改存儲卡的掛載點,如果APP開發代碼中使用硬編碼定義存儲卡路徑就會出現無法讀取和保存文件的情況。應盡量避免使用硬編碼定義存儲卡路徑,使用Environment.getExternalStorageDirectory()等對應API獲取。

3.2 千差萬別的屏幕

屏幕分辨率發展迅速,在2014年下半年2K屏幕已經成為了各廠商旗艦機的主流配置。更清晰的屏幕給用戶呈現更豐富的內容,也帶來了更驚艷的視覺享受。短短5年,手機屏幕分辨率從800×480驟增至2560×1440。當前主流的屏幕分辨率包括WVGA(800×480)、qHD(960×540)、HD(1280×720)、FHD(1920×1080)、WQHD(2560×1440)等。2014年至2015年第三季度銷售終端的屏幕分辨率的占比如下:

由上圖可以看出,在屏幕分辨率保持多樣性的同時,FHD、WQHD等高分辨率屏幕的占比正在提高,針對高分辨率屏幕開發高清APP已是目前趨勢。
- 為確保APP對不同分辨率屏幕的良好兼容,應著手于AndroidManifest.xml文件及res目錄下文件的配置。

1. AndroidManifest.xml設置

在AndroidManifest中添加子元素android:anyDensity=”true”后,應用程序安裝在不同密度的終端上時,程序會分別加載xxhdpi、xhdpi、hdpi、mdpi文件夾中的資源,其中dpi表示屏幕像素密度,指每英寸上的像素點數。之前還有ldpi,但是隨著移動設備配置的不斷升級,現在適配時不需考慮。mdpi、hdpi、xhdpi、xxhdpi用來修飾Android中的drawable文件夾及values文件夾,用來區分不同像素密度下的圖片和dimen值。

在開發過程中,應將合適大小的圖片放在合適的文件夾中,對于五種主流的像素密度(MDPI、HDPI、XHDPI、XXHDPI和XXXHDPI)應按照 1:1.5:2:3:4的比例進行縮放:

1. 橫屏豎屏目錄區分

在開發過程中,應分別對橫屏及豎屏建立不同的目錄,放置適用于橫屏及豎屏的圖片及布局文件,適應橫豎屏的切換。如在res目錄下建立layout-port和layout-land兩個目錄,里面分別放置豎屏和橫屏兩種布局文件。

2. 關于布局的適配建議

1) 盡量不使用絕對布局。
2) 盡量使用match_parent而不是fill_parent。
3) 使用layout_weight屬性按屏幕比例布局,這樣可以保證在屏幕上面展示的時候有合適的大小。不要使用像素單位的硬編碼,需要的話在dimens定義使用。
4) 設置android:layout_width和android:layout_height的值時,dp比px更好,文字大小應該使用sp來定義。
5) 為適應不同屏幕分辨率,在res目錄下創建不同的layout文件夾,比如:layout-1280x720、layout-1920x1080等,Android系統會根據屏幕的分辨率大小選擇合適的layout進行使用。

3.3 版本迭代的兼容

用戶的需求不斷革新,快速迭代已成為APP成功的因素之一。根據測試數據,移動應用平均每月會進行一次新版本的升級。如此頻繁的版本升級使得高低版本間的兼容性尤為重要。

若要保證高低版本間不出現兼容性問題,首先要設置好版本號(VersionCode)的值。VersionCode是一個Integer類型的值,在第一次發布應用到市場時,版本取值為1(VersionCode=1),這也是目前典型和普遍的做法。然后,發布更新版本時可以遞增VersionCode的值。

APP版本迭代時,新功能需求引起數據庫的變動,需要重寫SQLiteHelper的update方法對數據庫進行增量更新,避免刪除所有數據表再重新創建。

另外,在APP升級過程中要確保舊版本的可用性,保留服務端舊版本接口相關代碼支持。對于過于老舊的計劃不再支持的版本,要推送消息指引用戶主動進行版本更新。

四、讓手機更輕松,增強用戶體驗

相比于PC等傳統終端設備,移動終端設備的資源更加寶貴:系統及硬件資源決定了用戶使用體驗;續航已成為影響用戶挑選終端的重要指標;復雜的網絡環境也讓用戶對流量格外關注。

是否可以通過降低APP占用的系統及硬件資源有效延長終端使用時間?是否能夠在保證提供有效服務的同時降低流量的消耗?是否可以為用戶提供更順暢更快捷的操控體驗?以上已成為APP從“可用”到“好用”的分水嶺,也成為衡量開發者及團隊是否專業的重要標志。

4.1 良好的編程習慣

在資源使用方面,如果打開了資源,要記得關閉資源。要盡量晚地獲取,盡量早地釋放。如果使用了底層的設備服務時更應如此。當不再需要這些信息時要取消獲取最新信息的注冊。這將幫助避免不必要地耗費設備電池電量或占用系統資源。

另外,作為一名優秀的開發者,也要學會充分利用調優工具。

Android SDK隨帶了許多工具,可用來對應用程序進行分析,比如:Android Lint:Android Lint是SDK Tools 16 (ADT 16)之后才引入的工具,通過它對Android工程源代碼進行掃描和檢查,可發現潛在的問題,以便程序員及早修正。由于Android Lint在最初設計時就考慮到了獨立于IDE,所以它可以很方便的與項目中的其他自動系統(配置/Build/測試等)集成。

TraceView:這款圖形化工具可以幫助調試和找到應用程序中的性能瓶頸。

學會使用這些SDK提供的調優工具可以在開發工作中起到事半功倍的作用。

4.2 更低的系統資源占用

CPU與內存是決定終端性能的最重要的兩部分硬件。手機芯片的處理能力飛速提升,從2012年到2014年兩年的時間內走完了PC從1999年到2006年的歷程。雖然移動終端的性能提升顯著,但終端的硬件資源依然有限。隨著高CPU及內存占用率的APP層出不窮,給終端帶來了更大的負擔,容易造成手機運行卡頓等現象,因此用戶越發重視APP對CPU及內存的占用率。降低Android系統及單個APP的資源占用以獲取更充裕的空閑資源,可以給用戶提供更豐富的功能與服務并帶來更流暢的操控體驗。

2015年,移動終端芯片產品開始進入64位時代,核心數目越發集中于四核及八核。相比于芯片的性能,廠商越發重視能效,即在性能平穩提升的同時更重視能耗的降低。

市場銷售終端CPU主頻變化趨勢如下圖所示:

由上圖可以看出,CPU主頻提高的趨勢依然存在,但變化已漸平緩。芯片廠商將更多的精力用于架構與工藝的提升。市場主流銷售終端的CPU核心數目變化趨勢如下:

8核處理器的市場占比逐月提升,部分8核處理器采用big.LITTLE架構模式,通過兩種架構雙四核的合理調度有效降低功耗。

2014至2015年第三季度,國內市場銷售終端內存占比如下:

目前市場主流內存大小從14年的1GB及2GB增長至2015年的2GB及3GB。由于手機產品的精品化趨勢,2GB及2GB以上的內存大小已在2015年成為主流,各大終端廠商的旗艦機型則相繼使用3GB甚至更大的內存。

RAM在任何軟件開發環境中都是很寶貴的資源。開發者以及普通用戶們越發認識到降低APP資源占用的必要性。在Android系統中,每個程序都會有可使用的內存上限,即堆大小(Heap Size)。隨著硬件設備的升級,堆大小也隨之提高。在開發應用程序時所使用的內存不能超出限制,否則會出現OutOfMemoryError。

雖然Android系統具有GC操作且在絕大多數情況下我們并不需要主動通知系統進行GC,但這并不意味著可以忽視內存分配與釋放的時機與地點。

為了降低終端硬件資源的占用,以下建議可供參考:

1. 珍惜Services資源

如果應用需要在后臺使用Service,除非它被觸發并執行一個任務,否則Service都應該是停止狀態。另外需要注意當Service完成任務之后,因為停止Service失敗而引起的內存泄漏。當啟動一個Service,系統會傾向為了保留這個Service而一直保留Service所在的進程,系統無法把Service所占用的RAM空間騰出來讓給其他組件。另外,Service不能被paged out,這減少了系統能夠存放到LRU緩存當中的進程數量,它會影響APP之間的切換效率,甚至會導致系統內存使用不穩定。

限制Service的最好辦法是使用IntentService,它會在處理完交代給它的intent任務之后盡快結束自己。

2. 當UI隱藏時釋放內存

當用戶切換到其它應用并且原應用 UI不再可見時,應該釋放原應用UI上所占用的所有內存資源。在這個時候釋放UI資源可以顯著的增加系統緩存進程的能力,它會對用戶體驗有著很直接的影響。

3. 當內存緊張時釋放部分內存

在APP生命周期的任何階段,通過onTrimMemory的回調方法同樣可以得知整個設備的內存資源已經開始緊張。應該根據onTrimMemory回調中的內存級別來進一步決定釋放哪些資源。

4. 使用優化的數據容器

利用AndroidFramework里優化的容器類,如SparseArray、SparseBooleanArray與LongSparseArray。通常的HashMap的實現方式更加消耗內存,因為它需要一個額外的實例對象來記錄Mapping操作。另外,SparseArray更加高效,這在于他們避免了對key與value的autobox自動裝箱,并且避免了裝箱后的解箱。

5. 為序列化的數據使用nanoprotobufs

Protocol buffers是由Google為序列化結構數據而設計的,一種語言無關、平臺無關、具有良好擴展性的協議,類似XML卻比XML更加輕量、快速、簡單。如果需要為數據實現協議化,應該在客戶端的代碼中使用nanoprotobufs。

6. 謹慎使用第三方Library

很多開源的library代碼都不是為移動網絡環境而編寫的,如果運用在移動設備上效率并不高。當使用一個第三方library的時候,應該針對移動網絡做繁瑣的遷移與維護。即使是針對Android而設計的library,也可能是很危險的,因為每一個library所做的事情都不同。

7. 使用ProGuard來精簡代碼

ProGuard能夠通過移除不需要的代碼,重命名類、域與方法等對代碼進行壓縮、優化與混淆。

8. 對最終的apk使用zipalign

在編寫完所有代碼,并通過編譯生成apk之后,需要使用zipalign對apk進行重新校準。

9. 合理使用多進程

通過把APP組件切分成多個組件,運行在不同的進程中,可以有效提高內存管理的靈活度及效率。這個技術必須謹慎使用,因為如果使用不當,它會顯著增加內存的使用,而不是減少。

4.3 更低的耗電量

終端的性能經歷了翻天覆地的提升,移動互聯網的發展也讓終端承載了越來越多的任務,然而隨著終端各項業務對能耗需求的增加,移動終端限于體積卻無法大量地提升電池的容量。電池容量雖有所提升,但在日常使用中依然捉襟見肘,手機續航問題長久以來困擾著終端廠商與用戶。下圖為2014年至2015年第三季度國內市場銷售終端的電池容量占比變化情況:

由4.2節對芯片發展趨勢的分析可以看出,為了降低終端的耗電量,硬件廠商已經做出了切實的努力。與此同時,目前市面大多數的移動終端產品所搭載的操作系統也都帶有省電模式:通過降低屏幕亮度、CPU限頻、關閉后臺等方式降低電量消耗。

硬件及操作系統都已為移動終端的能耗降低做出了貢獻,在應用層級也應采取必要的方式節省能耗。

1. 合理安排任務

可以通過BatteryHistorian Tool查看詳細的電量消耗,如果發現APP有電量消耗過多的問題,可以使用JobScheduler API來對一些任務進行定時處理,如把任務重的操作等到手機處于充電狀態,或是連接到WiFi的時候來處理。

2. 匯集零散的網絡請求統一進行操作

觸發網絡請求的操作,每次都會保持無線信號持續一段時間,可以把零散的網絡請求打包進行一次操作,避免過多的無線信號引起的電量消耗。

3. 減少網絡傳輸的數據量

在沒有必要的情況下不要聯網進行操作,合理使用ImageLoader,使用增量更新,或者在滿足質量的情況下,對數據進行一定的壓縮 (和緩存合并)。

4. 優化APP心跳機制

APP應通過自適應等方式優化心跳機制,減少不必要的心跳。這將有利于終端電量的節省。關于心跳機制的具體內容將在4.4節做更詳細的闡述。

4.4 更優的網絡性能

2014年以來4G的網絡建設和商用為用戶帶來更高速的數據通訊體驗,而絕大多數用戶限于費用而對應用產生的流量較為敏感,尤其是對于后臺流量更是謹而慎之。

2015年9月在網用戶月均使用流量243.37MB,逾75%的用戶每月使用流量在200MB以下。相對而言,為了保證用戶使用體驗,一些APP開發者以耗費不必要的網絡流量為代價,頻繁交互信息或過度強化心跳機制,導致用戶的流量費用和電量均損耗較大。如何在消耗較少流量的同時提供有效服務并對后臺流量進行有效控制成為了開發者、終端廠商以及運營商共同關注的重要課題。

為了降低流量并提高網絡性能,可以從優化心跳機制及數據獲取過程兩方面著手:

1. 優化心跳機制

不同類別應用的心跳周期存在差別,而同一類別下不同應用的心跳周期也不盡相同。

根據測試,某終端待機底電流為4.9mA,后臺同時運行微信、QQ、飛信這三個典型即時通信應用,55分鐘待機時間內有47次心跳包,心跳間隔不均勻,平均心跳包間隔70s,平均待機電流22mA,接近待機底電流的5倍。

智能終端普遍會同時運行多個應用,由于各應用獨立發送心跳包,導致心跳包非常密集,從而帶來終端電量和流量的大量消耗。

心跳一方面影響終端的功耗,更對運營商的網絡存在影響。下圖是一次業務心跳導致的信令交互過程,空閑狀態時的業務心跳包觸發終端發起服務器請求過程,引起隨機接入→安全模式→無線資源重配→無線鏈路釋放等過程。

單用戶同時有多應用程序在后臺運行時,每個應用業務都各自維護心跳包,導致心跳包間隔相對單應用來說大大縮短。假設應用業務心跳包間隔60s,則每60s單用戶發送8條RRC信令,占用12-16次物理下行鏈路控制信道(PDCCH),占用5-8次物理混合ARQ指示信道(PHICH),至少占用一次隨機接入信道(PRACH)。以下是關于信道承載能力的分析:

計算基于如下現網常用配置:20M系統帶寬,上下行配比3DL:1UL,特殊時隙配比10:2:2,PCFICH取值3,PHICHNg參數取值1/6,PRACH配置為10ms一個PRACH資源,公共preamble個數配置為52。

1) PDCCH:以平均聚合等級為4估算,10ms內可用PDCCH個數為6(常規子幀)*21+2(特殊子幀)*13=152個,則每秒能夠承載的PDCCH個數為15200次,每60秒能夠承載的PDCCH個數為912000次。

2) PRACH:每10ms共有1次PRACH資源,每PRACH資源可復用52個用戶,不考慮沖突,則每秒支持用戶數為5200,每60s支持用戶數為312000。

3) PHICH:PHICH組復用用戶數按最大值8估算,則每子幀支持PHICH用戶數為24,則每秒支持用戶數為4800,每60s支持用戶數為288000。

此外頻繁的心跳包還可能導致終端一直處于RRC連接態,耗費系統的PUCCH(CQI、SR)、SRS等資源,導致系統容量下降,同時也會導致終端耗電增加。

智能終端各類軟件所引發的無線信令流量是傳統非智能終端的10倍以上,這進一步增加了智能手機產生的信令。同時,必然會影響終端與網絡之間的空中接口的信令處理能力,那么一旦信令信道發生擁塞,就會導致空口資源的調度失控。這時即便空口資源是空閑的,終端也無法使用。也很容易引發雪崩效應,當終端申請不到空口資源或鏈接不上網絡就會不斷重試,導致信令信道更加擁塞。對用戶來說,這將會導致用戶掉話率提高、發送消息延遲、甚至無法接聽撥打電話。

絕大多數移動應用都是通過TCP長連接來進行Push消息的,TCP長連接存活,消息Push就及時。

為了保證接收消息的及時性,當APP處于前臺活躍狀態時,建議使用統一的固定心跳。而當應用進入后臺時,建議使用不同于前臺運行時的周期更長的心跳策略。通常情況下,建議在后臺自適應計算心跳周期,根據自身產品的特點和當前的網絡環境選擇合適的心跳范圍。

1) 統一心跳包的發送

理論上即時通訊類應用所需的心跳周期是最短的,當前即時通訊類應用心跳周期在4min左右。

建議將最小需求4min作為基礎周期,各應用心跳包發送周期設置為基礎周期的整數倍,如8min、12min,如此基本滿足大多應用需求。以終端上的時鐘為參考系,當分針指向0、4、8、…56時,需要發送心跳的應用將心跳包統一發送。

2) 優化心跳包發送周期

用戶可根據需求自主選擇心跳發送周期,允許用戶在省電、及時等多個場景間切換。根據網絡環境、用戶使用情況試探性地動態調整發送周期,如從4分鐘試探調整至8分鐘、12分鐘、16分鐘。終端休眠時應用的心跳發送周期應延長,如調整至亮屏狀態時的二倍。

2. 優化數據獲取

在獲取數據的過程中,建議的優化策略包括:

1) 連接復用。通過如開啟keep-alive的方式節省建立時間。對于Android來說默認情況下HttpURLConnection和HttpClient都開啟了keep-alive。

2) 請求合并。即將多個請求合并為一個進行請求。

3) 減小請求數據大小。為了減小請求數據的大小,可以嘗試使用對請求頭進行壓縮的方式。而對于POST請求,Body也可以做Gzip壓縮。

4) CDN緩存靜態資源。緩存常見的圖片、JS、CSS等靜態資源。

5) 減小返回數據大小。為了減小返回數據的大小,一般可以采用對返回數據進行壓縮的方式。另外使用JSON代替XML、WebP代替其他圖片格式等精簡數據格式的方式也可以減小返回數據的大小。對于不同的設備及不同的網絡環境要有區別地返回內容:如不同分辨率的圖片。需要數據更新時,可以考慮增量更新,如常見的服務端進行bsdiff,客戶端進行bspatch。

6) 數據緩存。緩存獲取的數據在一定的有效時間內再次請求可以直接從緩存讀取。

4.5 更優的交互設計

APP內容的加載時間往往是影響用戶滿意度的重要因素。內容加載時間主要取決于用戶所在的網絡環境,而通過良好的交互設計尤其是加載頁面的設計,可以有效降低用戶的等待感,讓用戶“不煩躁”地等待。

1. 用非模態的加載方式

盡量使用非模態的加載方式,就是加載的過程是不打斷用戶,不需要等待加載完就可以進行其他操作,如下示意:

用非模態的加載方式,用戶可以利用做其他事情來打發等待的時間,而不用一直等待數據加載完成,大大降低了等待的焦躁感。即便是模態的加載,也要給一個取消的選項,當用戶不耐煩的情況下可以取消。

2. 情趣化的加載動畫

加載的過程如此枯燥乏味,有創意的設計師們可以設計了各種有創意的加載動畫。這些加載動畫讓等待的過程變成了一種享受,用戶能感受到設計師的情懷,體會新鮮有趣的等待過程。提升了產品情趣化的設計語言,讓等待的焦躁感一掃而空。

3. 漫長加載告知進度

如果是時間較長的加載過程,最好能清晰的告知過程進度,這時候就需要采用有進度的加載設計。瀏覽器的進度條是一種較為常見的進度告知設計,通過這個進度告知,讓用戶有了更加明確的知情權,也能更好的預期到加載完成的時間。

4. 盡量提前加載

盡可能的利用預加載或有WiFi的情況下離線緩存的方式,把內容提前加載下來,這樣能做到最大限度的降低加載給用戶帶來的卡頓感。如果能判斷出來用戶下一步要做的事情,提前幫用戶加載相應的內容,肯定是最符合需求場景的事情。

4.6 其他注意點

1. 注意避免發生ANR問題

ANR: Application Not Responding,即應用無響應。為了盡量避免ANR錯誤,在編碼上有以下三點建議:

1) UI線程盡量只做跟UI相關的工作,避免在主線程(UI線程)上進行復雜耗時的操作,比如說進行大量的計算/操作數據庫/讀寫文件等。這類復雜耗時的操作可以通過使用AsyncTask或者使用多線程來實現。

2) BroadCastReceiver要進行復雜操作時,可以在onReceive()方法中啟動Service來處理。

3) 在設計及代碼編寫階段避免出現同步/死鎖或者錯誤處理不恰當等情況。

2. 避免過度繪制

1) 太多重疊的背景:檢查在布局和代碼中設置的背景,有些背景是被隱藏在底下而永遠不可能顯示。這種沒必要的背景一定要移除,因為它很可能會嚴重影響到APP的性能。

2) 太多重疊的view:必要的時候盡可能動態地加載布局,只有用到重疊的view的時候才進行加載,推遲加載的時間,而不是所有的都通過SetVisiblity函數來控制。

3) 復雜的Layout層級:添加到應用中的每一個控件和布局文件都需要經過初始化、排列位置和繪制三個過程,因此使用嵌套的線性布局可能導致布局層級變得十分冗余。復雜的布局,既會提高我們的設計難度,也會降低代碼效率,因此,不妨多使用一下相對布局。建議使用HierarchyViewer工具來分析和優化布局,要盡量減少布局中的枝葉,減少父母層級,避免過深的布局層級。

3. 避免空指針

空指針引起的原因主要有調用空對象的方法、訪問或更新空對象的變量、獲取空集合的長度、訪問或更新空集合中的內容、拋出空的Throwable對象、同步空對象等。為避免空指針,應當在使用之前確保對其做了適當的初始化。

五、千萬別忽視安全

2015年,中國移動互聯網用戶數已突破9億。隨著移動互聯網的高速發展,智能手機、平板電腦以及智能穿戴設備等已經充斥了人們的生活,移動應用迅速覆蓋了包括出行就餐、日常起居、金融理財等各個領域。

然而凡事有利有弊,Android漏洞、APP安全早已飽受詬病。2015年第二季度,工業和信息化部組織對40余家手機應用商店的應用軟件進行技術檢測,發現存在問題的應用軟件達80款,涉及違規收集用戶個人信息、惡意扣費、強行捆綁推廣其他無關應用軟件等問題。安全性成為了用戶選擇APP的重要參考條件。

5.1 保護用戶的數據

與iOS相比,Android提供了一種開放的環境,在獲得了靈活性、可以滿足各種定制需求的同時,也損失了部分安全性。APP開發團隊通常將精力集中在產品設計、功能實現、用戶體驗和系統效率等,而忽略了安全問題,導致數據存儲以及通信過程中存在漏洞,給惡意攻擊者們留下了可乘之機。

1. 數據存儲安全

APP的存儲區域分為外部(SD卡)和內部(NAND閃存)兩種。除了大小和位置不同之外,兩者在安全權限上也有很大的區別。外部存儲的文件沒有讀寫權限的管理,所有應用軟件都可以隨意創建、讀取、修改、刪除位于外部存儲中的文件,僅僅需要申明READ_EXTERNAL_STORAGE和WRITE_EXTERNAL_STORAGE權限。內部存儲則為每個軟件分配了私有區域,并有基于Linux的文件權限控制,其中每個文件的所有者ID均為Android為該軟件設立的一個用戶ID。通常情況下,其他軟件無權讀寫這些文件。

為了保護用戶存儲數據的安全,有以下建議可供參考:
1) 避免將數據明文保存在外部存儲
APP可能將系統數據及用戶數據存儲在外部存儲(SD卡)上。當這些數據是直接明文保存的,攻擊者可以對這些數據進行讀取,造成隱私信息泄露。若惡意軟件讀取了系統數據則可能會展開進一步的攻擊。

更好的處理方法是對這些數據進行加密,相對敏感的信息如密碼保存在內部存儲,由系統托管或者由用戶使用時輸入。

2) 將軟件運行時依賴的數據保存在內部存儲
若軟件將配置文件存儲在SD卡上,然后在運行期間讀取配置文件,根據其中數據進行工作,攻擊者編寫的軟件可以修改這些配置文件,從而控制軟件的運行。

對于此類配置文件,更為安全的方法是保存到內部存儲;如果必須存儲到SD卡,則應在每次使用前判斷它是否被篡改,如與保存在內部的文件哈希值進行匹配。

3) 將軟件安裝包或者二進制代碼保存在內部存儲或使用前進行校驗
部分軟件會推薦用戶下載并安裝其他軟件:用戶點擊后,會下載另一個軟件的apk,保存到SD卡然后安裝。有一些軟件為了實現功能擴展,選擇動態加載并執行二進制代碼。如果在安裝或加載前,該部分數據被篡改或偽造,就會出現安全問題。攻擊者可以使用“重打包”(re-packaging)方法加入惡意代碼、改變軟件的數據或指令,而軟件原有功能和界面基本不會受到影響,用戶難以察覺。

為了避免此類問題,軟件應該在安裝或加載位于SD卡的任何文件之前,對其完整性做驗證,判斷其與實現保存在內部存儲中的(或從服務器下載來的)哈希值是否一致。

4) 內部文件避免全局可讀寫
使用openFileOutput(Stringname,int mode)方法創建內部文件時,若第二個參數設為Context.MODE_WORLD_READABLE或Context.MODE_WORLD_WRITEABLE,就會讓這個文件變為全局可讀或全局可寫的。攻擊者編寫的惡意軟件也將擁有這一權限。

如果要跨應用共享數據,一種較好的方法是實現一個Content Provider組件,提供數據的讀寫接口,并為讀寫操作分別設置一個自定義權限。5) 避免內部敏感文件被root權限軟件讀寫

在引進SEAndroid安全機制之前,一旦手機被root,用戶獲得了su權限,就可以對系統文件和其他應用進行操作。Android 5.0版本全面啟用了Android系統安全強化套件,SEAndroid (Security-EnhancedAndroid),將Linux上的MAC強制訪問控制套件SELinux移植并增加安全功能到Android平臺上。在SEAndroid中,每一個進程和文件都會關聯一個安全上下文,由用戶、角色、類型、安全級別四個部分組成。系統管理員基于安全上下文制定安全訪問策略,用來規定什么樣的進程可以訪問什么樣的文件。在這種體系的限制下,進程只能訪問那些在其任務中所需文件,惡意APP即使篡得了較高的Root權限,仍然被安全訪問策略有限的控制著而不能為所欲為。

6) 在配置文件中android:allowBackup配置為false
Android系統提供了為APP數據的備份恢復功能,其開關決定于AndroidManifest.xml文件中的allowBackup屬性的值,默認為true。當allowBackup標志為true時,用戶即可通過adbbackup和adb restore來進行對應用數據的備份和恢復,這可能會帶來一定的安全風險:adb backup容許任何一個能夠打開USB調試開關的用戶從Android手機中復制應用數據到外設,一旦應用數據被備份之后,所有應用數據都可被用戶讀取;adb restore容許用戶指定一個恢復的數據來源(即備份的應用數據)來恢復應用程序數據的創建。攻擊者可通過adb backup和adb restore進行恢復新安裝的同一個應用來查看聊天記錄等敏感信息。

因此,除非非常有必要,開發者應將allowBackup屬性值設置為false,從而關閉應用程序的備份和恢復功能,以免造成信息泄露和財產損失。

2. 組件通信安全

Android系統包含四類組件:Activity、Service、Broadcast receiver和Content provider。前三種組件使用intent相互調用.

下面是組件間通信時應注意的安全事項:
1) 最小化組件暴露
不參與跨應用調用的組件添加android:exported=”false”屬性,這個屬性說明它是私有的,只有同一個應用程序的組件或帶有相同用戶ID的應用程序才能啟動或綁定該服務。

2) 設置組件訪問權限
參與跨應用調用的組件或者公開的廣播、服務設置權限,設置權限時,組件添加android:permission屬性并且聲明屬性,調用組件者聲明。

3) 運行時權限檢測
Android提供各種 API 來在運行時檢查、執行、授予和撤銷權限。這些API是android.content.Context類的一部分,這個類提供有關應用程序環境的全局信息。可以調用Context類的checkCallingOrSelfPermission方法在運行時驗證權限是否獲取成功。

3. 網絡通信安全

1) 加密傳輸敏感數據

最危險的是直接使用HTTP協議登錄賬戶或交換數據。如攻擊者在自己設置的釣魚網絡中配置DNS服務器,將軟件要連接的服務器域名解析至攻擊者的另一臺服務器;這臺服務器就可以獲得用戶登錄信息,或者充當客戶端與原服務器的中間人,轉發雙方數據。

這類問題的解決方法是對敏感數據采用基于SSL/TLS的HTTPS進行傳輸

2) SSL通信檢查證書有效性
移動軟件大多只和固定的服務器通信,因此可以在代碼中更精確地直接驗證是否某張特定的證書,這種方法稱為“證書鎖定”(certificatepinning)。實現證書鎖定的方法有兩種:一種是實現X509TrustManager接口,另一種則是使用KeyStore。

3) 安全使用WebView
如果程序不需要直接調用JavaScript,不應調用setJavaScriptEnabled(),使用addJavaScriptInterface()時應特別小心,推薦只暴露給自己apk內部的JavaScript。

4. 服務器數據安全

如今網絡安全環境異常嚴峻,幾乎每年都有知名互聯網廠商服務器端暴露出安全性問題,造成了大量用戶信息的泄露,甚至直接影響了用戶的經濟利益。為了保護服務器端的數據安全,通常可采取以下辦法:

1) 定時檢查服務器工作狀態

定時檢查服務器的網絡連接狀況、定時檢查服務器操作系統運行狀況、定時檢查服務器系統日志、定時檢查磁盤剩余空間以確保有充足的空間存儲數據。

2) 合理設計備份

通過合理設計備份工作為數據帶來較高的安全性保障,一旦其中一個硬盤發生故障,仍可通過備份硬盤讀出有效數據。數據備份記錄也要做好,以便恢復時使用。記錄里面應包含:備份時間點、備份保存、備份方法、備份工具、操作人員、備份完成時間、備份檢測、備份開始時間等。

3) 刪除不必要的軟件并停止不必要的服務

刪除在服務器上的不需要的軟件并停止不必要的服務,從而減少黑客攻擊的機會。

4) 開啟強密碼保護

要盡量以最小的權限來執行管理任務。同樣,具有管理員權限的其他所有賬戶,即是使用密碼策略也仍需強制執行強密碼保護。

5) 應用防火墻

由于大多數服務器都是需要連接到整個互聯網的,所以應使用防火墻限制外部訪問服務器所在的局域網。

6) 及時更新補丁

即使服務器沒有連接到互聯網,仍然要保證軟件系統的更新。可以通過網絡上的另一個服務器運行服務器更新策略服務來完成。

5.2 代碼安全

對于需要保護代碼的Android客戶端應特別注意代碼安全,如保護技術難點、核心代碼等。目前代碼安全主要依靠代碼混淆、Dex加殼、so加固等技術。

1. 代碼混淆

Android上的APP絕大部分是使用Java語言開發,編譯時會編譯成Dalvik字節碼(即dex文件),運行時由Android自帶的Dalvik虛擬機解釋執行。由于Java開發的APP很容易被逆向破解,目前市面上已有的Java程序反編譯工具有baksmali、jd-gui、apktool等。為防止APP被逆向破解,最常見方法是代碼混淆。

2. 注意開發工具的安全

開發者應使用正版的開發工具并通過正規渠道獲取SDK,防止所開發的APP被人為加入后門,給用戶和開發者帶來較大的風險。

3. 正規的證書

開發者應使用正規的、帶有開發者身份信息的證書對APP進行簽名。

4. 自校驗加固

為APP添加運行時的校驗機制,在用戶首次打開APP時進行自校驗,判斷apk是否已被攻擊者篡改。若存在被篡改的情況,則主動提示用戶卸載軟件。

5.3 權限安全

當手機用戶在對某APP進行下載、更新甚至使用時,常常會遇到要求用戶向APP開放各類手機權限的情形,而其中經常包括用戶通訊錄、短信、相冊、地理位置等涉及用戶隱私的權限。關于用戶手機涉及的隱私權限眾多,Android平臺所涉及的隱私權限達30多項,而每個應用廠商對于權限的定義都不同。

應用在開發之時應聲明其將會調用的最少必要功能組,對于沒有聲明過的調用,應用軟件不得調用,對于不需使用的功能,應用軟件不得聲明。

客戶端應向用戶清晰明確地對需調用的基礎權限進行提示。

1. 提示框標題要求

使用積極和熱情的提示語對話框標題,“溫馨提示”或“歡迎使用XX客戶端”。

2. 權限使用提示內容要求

每項權限要求作為一條單列,并在向用戶要求某項權限前,說明能給用戶帶來的作用、影響等。提示語應清晰、明確,不能出現“可能”等模糊詞語。

3. 隱私保護申明要求

申明清晰明了,推薦使用“沒有經過用戶的允許,本軟件絕對不會收集用戶的各種隱私數據,也不會泄漏用戶的個人信息。”方式。

4. 用戶確認操作要求

用戶可見區域設置不再提醒選項。

涉及用戶隱私的特殊權限(通訊錄、短信、位置信息等)在用戶使用到具體功能時再進行提示授權,用戶確認后可使用,不確認則不再使用該功能。

對于可能造成費用或有大量流量產生情況,應主動對用戶進行“二次確認”。

六、用新技術給用戶提供更多

移動終端產品與時俱進,已成為普羅大眾眼中高新科技的代言詞,也漸漸成為大眾日常使用的最具科技感的個人電子設備。寄托著用戶的期待,移動終端產品有義務、有能力也有需要將時下的新技術與新概念帶給廣大群眾,并充分整合已有的最新資源,為用戶提供更多。

6.1充分發揮終端的各項能力

每次Android新版本升級,除了增加新的特性,還會伴隨著一件事,就是將原來只有系統有的能力開放給了開發者,開發者可以用這些新特性/能力來建設不一樣的應用。

以Android5.0為例:

1. Material Design

在Android 5.0的宣傳中強調最多的一個亮點就是Material Design,從設計語言來講,這個特點是能在將整個素材鋪平的同時還遵循一定的物理材質的需求。這樣的設計可以讓應用感覺更活潑、具有更豐富的顏色,有無處不在的陰影,以及動畫效果更真實等等。

2. Fingerprint Support

這項功能允許用戶進行指紋解鎖設備或進行購買支付操作,所有開發者都可以通過API把指紋識別功能接入到自己的APP中。這對Android Pay的安全性提供了十分重要的支持。

6.2混合式應用

對于快速更迭的移動互聯網來說,應用模塊的持續更迭、致命問題的修復,無疑都需要重新進行應用的發布及審核。此時,開發一個基于原生應用+web網頁方式的混合式移動應用無疑是個不錯的選擇。

1. Web與原生系統交互

使用Android瀏覽器對象LoadUrl,addJavaScriptInterface等方法實現WebView與原生類的綁定時,實現前端JS與后端Java類的數據交互。可以將功能簡單但會頻繁更新的一部分業務考慮使用網頁來實現,最后在Android應用中嵌入網頁。

2. 挖掘HTML5的潛力

目前HTML5規范已集成了打電話、發短信、拍照、通信、緩存、webSql等一系列新的本地功能調用API,使用此類API,將會大大降低開發難度,提升開發效率,并從用戶角度上感覺與原生應用并無差距。

3. 使用聯調測試

采用混合應用進行產品開發的另一個好處是可以分開進行開發測試,最終進行聯調測試。Web網頁測試調試時的consle.log同樣也會輸出在Android調試窗口LogCat中,對于CSS樣式的測試,建議使用chrome手機版,配合終端上的遠程調試工具,如Weinre,可以在PC上實時更改手機上對應網頁的元素、樣式表,或是查看JavaScript變量,同時還可以看到手機上頁面的錯誤和警告信息。

同時建議開發者在開發時使用響應式布局框架,避免在PC上開發完成后運行在終端的效果大相徑庭。

6.3多形態終端與智能穿戴

工業和信息化部發布報告,截至2015年3月底,中國移動電話用戶總數達到12.9億。截至2015年底,智能手機用戶數有望突破6億大關。智能穿戴產品的廣闊市場將使其成為智能終端發展的另一個重要方向,也將成為各大終端廠商以及互聯網廠商熱血廝殺的新的主戰場。根據第三方市場報告分析,2015年及2016年智能穿戴產品發展趨勢如下圖所示:

隨后兩年,智能穿戴產品的銷量將成指數增長,2016年全年銷量預計可達6000萬以上,且基于中國這一廣闊市場基礎,將持續其迅猛的發展勢頭。層出不窮的可穿戴產品在中國以及全世界范圍內引領了消費者對可穿戴設備的認知程度。

對智能穿戴產品的認知度在隨著時間提高的同時也伴隨著年輕化與高端化,25到39歲的消費者鑒于其對新技術良好的接受能力及樂于嘗新的生活態度,成為了智能穿戴產品最主要的消費人群。

相比于手機,智能穿戴產品在信息輸入輸出過程中顯得更加不便。目前主流的解決方式有兩種:一、配合手機等產品使用,將輸入及信息展示功能交給手機客戶端,智能穿戴產品利用其集成的各類傳感器主要負責信息收集功能,通過藍牙等通信技術將所收集的信息傳輸至智能手機,智能手機對數據進行處理后,以友好全面的方式呈現給用戶;二、如Apple Watch,其為穿戴產品設計了更為簡單的操作模式,通過設置簡單的按鈕及手勢降低了操作難度并減少誤操作。在文字輸入過程中采用語音輸入等方式極大提高了信息輸入的便捷性。

另外,由于智能手環及智能手表等產品的尺寸較小,無法裝載較大的電池,其較短的待機時間也是亟待解決的問題。目前解決該問題一方面要依賴穿戴產品本身的優秀的電源管理,另一方面要依賴特殊設計的產品架構,將采集的原始數據或簡單加工的數據在需要時傳輸至智能手機或云端服務器,由智能手機或服務器端完成相關運算。

廣大用戶群體對于智能穿戴產品各項功能的著重點存在不同,各個不同的年齡段更是涇渭分明,如圖6.3:年輕人更加注重穿戴產品與智能手機產品的協同功能,而中老年則更偏好于健康。如16到24歲的年輕人相對更在意藍牙通話功能以及來電/短信提醒功能,并不在意監測體溫/血壓/血糖,而該項正是30歲以上人群更在意的功能點。以上都是智能穿戴產品及其APP開發過程中所需要考量的重要因素。

智能穿戴產品及各種多形態終端承載著用戶的需求,將在不遠的將來全方位地覆蓋人們生活的健康、醫療、交通、飲食等各個領域,協同物聯網及云技術的成熟發展,形成無處不在、無所不能的智能生態體系。APP作為其生態體系中的重要一環,承擔著舉足輕重的責任,也必然會為用戶帶來生活各方面的便捷與革命。

七、結束語

移動互聯網的用戶是網絡運營商的用戶,是終端廠商的用戶,也是移動應用的用戶。終端、應用與網絡平臺形成一個閉環,相互配合共同為用戶提供優秀的移動互聯網使用體驗。中國移動通信集團終端有限公司持續以來致力于成為聯接三者的紐帶,加強運營商、終端廠商與應用廠商的互助與信息互通,攜手為用戶創造更加豐富多彩的移動生活。

原文鏈接:手機程序猿必看之《終端應用開發指南》  

本站僅提供存儲服務,所有內容均由用戶發布,如發現有害或侵權內容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Android 10 設備唯一標識
求你別在手機上裝安全管家了
為了讓你看廣告,開屏廣告都用上了“搖一搖”
別再為 315 曝光的探針盒子憂傷了,根本不是這么回事
華為HMS臨危受命,到底能不能打造“第三極”?
分享-體系優化消息推送,輕松召回你們的用戶!
更多類似文章 >>
生活服務
分享 收藏 導長圖 關注 下載文章
綁定賬號成功
后續可登錄賬號暢享VIP特權!
如果VIP功能使用有故障,
可點擊這里聯系客服!

聯系客服

主站蜘蛛池模板: 彝良县| 城口县| 南江县| 青龙| 富川| 新密市| 上饶市| 陵川县| 常宁市| 谢通门县| 南平市| 九寨沟县| 平谷区| 溧阳市| 清远市| 镇原县| 安平县| 三河市| 江陵县| 贵州省| 丰顺县| 当雄县| 阿图什市| 辽宁省| 枣强县| 宣武区| 琼中| 山阳县| 石嘴山市| 兴隆县| 游戏| 临西县| 博客| 西贡区| 东莞市| 偃师市| 清水县| 卓尼县| 察雅县| 鄂州市| 临沂市|