㈠ android 4.3的主要變化
果凍豆(Jelly Bean)系列系統在黃油項目(Project butter)的幫助下,已引入「垂直同步定時」(vsync timing)、「三重緩沖」(triple buffering)、「減少的觸摸延時」(reced touchlatency),「CPU輸入提振」(CPU input boost)和「硬體加速的2D渲染」(hardware-accelerated 2D rendering)等技術,令安卓設備特別是Nexus系列運行起來達到了前所未有的順滑。
而作為Android 4.X系列的作品之一,Android 4.3系統再次增加了新的優化:對於圖形性能,硬體加速2D渲染優化了流繪圖命令;對於多線程處理,渲染也可以使用多個CPU內核的多線程執行某些任務;此外,新系統還對形狀和文本的渲染進行了提升,並改進了窗口緩沖區的分配。所有這一切,都將會為用戶帶來一個全新的安卓體驗,快速、流暢而靈敏。 多用戶切換:在上一版本系統(Android 4.2)中,平板系統加入了多用戶(multi-user)的功能,它允許同一台設備擁有最多8個獨立的用戶空間,並且可以保持3個賬戶的活躍狀態;而新版系統優化了鎖屏界面的用戶切換速度,再多用戶也無壓力。
受限賬戶:Android 4.3系統在此基礎上引入「保密文檔」( Restricted profiles)功能,根據不同的受限賬戶情況(兒童、訪客和零售商店等),設備所有者可以進一步指派哪些應用有權使用所有者的身份和設置,更能夠簡單地禁用或隱藏他們;此外,單獨應用的特定功能還能夠在API級別上進行限制,比如定位或應用內購。 支持「智能藍牙」(Bluetooth Smart):Android 4.3系統正式支持低能耗藍牙4.0技術(Bluetooth 4.0 Low Energy)。相較於3.0版本,藍牙4.0擁有低功耗、3毫秒低延遲、AES-128加密等特點,它將三種規格集一體,包括傳統藍牙技術、高速技術和低耗能技術。根據官方的數據,藍牙4.0的峰值能耗約為3.0的一半,極低的運行和待機功耗使得一粒紐扣電池甚至可連續工作一年之久。考慮到安卓設備的全球佔有率情況,低能耗的連接方式,將會促進可穿戴設備的普及,並加速互聯網的建設。
支持「Bluetooth AVRCP 1.3」: 將幫助用戶更好地完成外放設備與安卓設備間的音頻互動,包括停止、播放、音量調整和上下首曲目切換等操作;此外,用戶的車載音響還可以顯示曲目名稱。 企業用戶:Android4.3為企業用戶帶來了豐富的新功能:單獨的應用能夠在WPA2網路上配置WiFi憑證,並通過可擴展身份驗證協議(EAP)與網路交換認證;Keychain API為應用程序密匙加入了一種新的處理方式,即使系統被入侵,也無法從設備上導出;系統加入了新的密鑰庫提供程序,用於創建無法被其他應用所查看的安全密匙,私人密鑰庫密匙同樣無法被導出;/System分區會組織應用執行setuid程序(從而關掉一些漏洞);最後,Android4.3系統還使用了SELinux強制訪問控制系統。
普通用戶:Android4.3隱藏了一個名曰「AppOps」的許可權控制器,可以讓我們自定義應用所能獲取的許可權,而不再是之前非此即彼的「全部允許」或「取消安裝」。開啟這項彩蛋功能的方法是調取「活動」(Activity)>「設置」>「應用操作」,並且已有現成的封裝調取程序可供下載。盡管我們可以藉助LBE、SRT、PDroid、XPrivacy和CM Guard等應用來管理程序的許可權,但原生安卓自帶該功能,畢竟是一種突破,相信谷歌會進一步完善安卓系統的安全保障機制。 在Android 4.3系統中,所有使用「前台服務介面」實現運行的的應用程序都會被強制顯示在通知欄和拓展通知窗的「正在運行」(Ongoing)中,而不受「顯示通知」選項的控制。
根據谷歌安卓工程師在Google+上的解釋,這種做法是谷歌有意為之的,目的是讓無法殺掉進程且在後台靜默運行的應用程序在通知欄上「顯形」,讓用戶得以關注「行為不端」的應用程序。
他們發現,有相當多的應用程序濫用「前台服務介面「(Service.startForeground() API )來使自己常駐後台,不被殺死;又通過製作一個異常的通知對象,來躲過系統的通知管理器(Notification Manager),不為用戶所察覺,威脅著機主的隱私安全。
起初,谷歌嘗試更好地檢測此類通知並令這些程序運行崩潰,但寡不敵眾,也治標不治本;為此,在Android 4.3系統中,谷歌保障了用戶對正在運行的應用程序的知情權和處置權,也勢必有效遏制針對此API的濫用行為。 全景照片: 我們知道在JellyBean系列系統中,「全景拍攝」包含兩種模式:「橫軸全景」(Panorama)和「360度全景」(Photosphere)。其中,後者逼真的「街景瀏覽」效果和「魚眼瀏覽」效果著實驚艷了許多用戶;不過,拍攝過程中產生的圖片銜接與校準問題,又令不少人郁悶。好消息是,谷歌地圖項目經理Evan Rapoport宣布已大大提升了Android 4.3的全景拍照功能,通過優化對准和拼接顏色,照片將更加明亮,過度將更加自然。接下來,藉助HTML5和java技術,我們可以將自己得意的街景照片分享到論壇和社交網站。
設置界面:由Android 4.2系統的「圓形菜單」改進為Android 4.3系統的「弧形菜單」,避免手指遮擋現象,降低誤點擊可能,更加適合單手操作;同時,進一步利用圖標代替文字說明,直觀而時尚。
定時器:Android4.3系統的相機增加了定時拍攝的功能。
快門鍵:拍照狀態時,新版系統支持利用音量鍵拍照。無論點擊音量增大還是音量減小,相機都會在按下按鈕起進行對焦測光,松開按鈕即釋放快門拍下照片。 「禁用應用」標簽:在Android 4.3系統中,用戶可以通過「設置」>「應用」里最右側的「禁用應用」標簽(Disabled tab),直接瀏覽所有被凍結的自帶應用,而不必再通過「所有應用」標簽(Alltab)苦苦找尋了。
「白日夢」屏保:新版系統的 Photo Daydream功能能夠在Android 4.3系統的相冊以及文件夾當中進行導航。 工具:開發者們能夠使用到增強的Systrace工具,它能夠從硬體模組、內核功能、Dalvik虛擬機和資源載入當中引入數據。追蹤API能夠對代碼段進行標記,節約部分系統資源。
選項:系統隱藏的開發者選項也補充了新的功能,幫助開發者更好地掌握GPU情況。 Android除了保持以往的系統版本升級外,還逐漸引入模塊化升級。即便用戶無法及時將設備系統更新到最新版本,仍然可以通過谷歌商店替換部分符合條件的內置應用,體驗到更為人性化的操作。
(1) 谷歌音樂播放器(Google PlayMusic)得到改進,融入了卡片式設計靈感,用色更明亮,交互更流暢。
(2) 谷歌雲筆記(Google Keep)早在3月份就正式推出,而今整合到新版系統中,方便用戶隨時隨地記錄感悟。
(3) 環聊(Hangouts)於2013年穀歌I/O大會上正式推出,脫胎於Google Plus,整合了多項谷歌聊天工具,用以替代Google Talk應用。
㈡ 每個Android 都應必須了解的多線程知識點~
進程是系統調度和資源分配的一個獨立單位。
在Android中,一個應用程序就是一個獨立的集成,應用運行在一個獨立的環境中,可以避免其他應用程序/進程的干擾。當我們啟動一個應用程序時,系統就會創建一個進程(該進程是從Zygote中fork出來的,有獨立的ID),接著為這個進程創建一個主線程,然後就可以運行MainActivity了,應用程序的組件默認都是運行在其進程中。開發者可以通過設置應用的組件的運行進程,在清單文件中給組件設置:android:process = "進程名";可以達到讓組件運行在不同進程中的目的。讓組件運行在不同的進程中,既有好處,也有壞處。我們依次的說明下。
好處:每一個應用程序(也就是每一個進程)都會有一個內存預算,所有運行在這個進程中的程序使用的總內存不能超過這個值,讓組件運行不同的進程中,可以讓主進程可以擁有更多的空間資源。當我們的應用程序比較大,需要的內存資源比較多時(也就是用戶會抱怨應用經常出現OutOfMemory時),可以考慮使用多進程。
壞處:每個進程都會有自己的虛擬機實例,因此讓在進程間共享一些數據變得相對困難,需要採用進程間的通信來實現數據的共享。
線程是進程的一個實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。
在Android中,線程會有那麼幾種狀態:創建、就緒、運行、阻塞、結束。當應用程序有組件在運行時,UI線程是處於運行狀態的。默認情況下,應用的所有組件的操作都是在UI線程里完成的,包括響應用戶的操作(觸摸,點擊等),組件生命周期方法的調用,UI的更新等。因此如果UI線程處理阻塞狀態時(在線程里做一些耗時的操作,如網路連接等),就會不能響應各種操作,如果阻塞時間達到5秒,就會讓程序處於ANR(application not response)狀態。
1.線程作用
減少程序在並發執行時所付出的時空開銷,提高操作系統的並發性能。
2.線程分類
守護線程、非守護線程(用戶線程)
2.1 守護線程
定義:守護用戶線程的線程,即在程序運行時為其他線程提供一種通用服務
常見:如垃圾回收線程
設置方式:thread.setDaemon(true);//設置該線程為守護線程
2.2 非守護線程(用戶線程)
主線程 & 子線程。
2.2.1 主線程(UI線程)
定義:Android系統在程序啟動時會自動啟動一條主線程
作用:處理四大組件與用戶進行交互的事情(如UI、界面交互相關)
因為用戶隨時會與界面發生交互,因此主線程任何時候都必須保持很高的響應速度,所以主線程不允許進行耗時操作,否則會出現ANR。
2.2.2 子線程(工作線程)
定義:手動創建的線程
作用:耗時的操作(網路請求、I/O操作等)
2.3 守護線程與非守護線程的區別和聯系
區別:虛擬機是否已退出,即
a. 當所有用戶線程結束時,因為沒有守護的必要,所以守護線程也會終止,虛擬機也同樣退出
b. 反過來,只要任何用戶線程還在運行,守護線程就不會終止,虛擬機就不會退出
3.線程優先順序
3.1 表示
線程優先順序分為10個級別,分別用Thread類常量表示。
3.2 設置
通過方法setPriority(int grade)進行優先順序設置,默認線程優先順序是5,即 Thread.NORM_PRIORITY。
4.線程狀態
創建狀態:當用 new 操作符創建一個線程的時候
就緒狀態:調用 start 方法,處於就緒狀態的線程並不一定馬上就會執行 run 方法,還需要等待CPU的調度
運行狀態:CPU 開始調度線程,並開始執行 run 方法
阻塞(掛起)狀態:線程的執行過程中由於一些原因進入阻塞狀態,比如:調用 sleep/wait 方法、嘗試去得到一個鎖等
結束(消亡)狀態:run 方法執行完 或者 執行過程中遇到了一個異常
(1)start()和run()的區別
通過調用Thread類的start()方法來啟動一個線程,這時此線程是處於就緒狀態,並沒有運行。調用Thread類調用run()方法來完成其運行操作的,方法run()稱為線程體,它包含了要執行的這個線程的內容,run()運行結束,此線程終止,然後CPU再調度其它線程。
(2)sleep()、wait()、yield()的區別
sleep()方法屬於Thread類,wait()方法屬於Object類。
調用sleep()方法,線程不會釋放對象鎖,只是暫停執行指定的時間,會自動恢復運行狀態;調用wait()方法,線程會放棄對象鎖,進入等待此對象的等待鎖定池,不調用notify()方法,線程永遠處於就緒(掛起)狀態。
yield()直接由運行狀態跳回就緒狀態,表示退讓線程,讓出CPU,讓CPU調度器重新調度。禮讓可能成功,也可能不成功,也就是說,回到調度器和其他線程進行公平競爭。
1.Android線程的原則
(1)為什麼不能再主線程中做耗時操作
防止ANR, 不能在UI主線程中做耗時的操作,因此我們可以把耗時的操作放在另一個工作線程中去做。操作完成後,再通知UI主線程做出相應的響應。這就需要掌握線程間通信的方式了。 在Android中提供了兩種線程間的通信方式:一種是AsyncTask機制,另一種是Handler機制。
(2)為什麼不能在非UI線程中更新UI 因為Android的UI線程是非線程安全的,應用更新UI,是調用invalidate()方法來實現界面的重繪,而invalidate()方法是非線程安全的,也就是說當我們在非UI線程來更新UI時,可能會有其他的線程或UI線程也在更新UI,這就會導致界面更新的不同步。因此我們不能在非UI主線程中做更新UI的操作。
2.Android實現多線程的幾種方式
3.為何需要多線程
多線程的本質就是非同步處理,直觀一點說就是不要讓用戶感覺到「很卡」。
4.多線程機制的核心是啥
多線程核心機制是Handler
推薦Handler講解視頻: 面試總被問到Handler?帶你從源碼的角度解讀Handler核心機制
根據上方提到的 多進程、多線程、Handler 問題,我整理了一套 Binder與Handler 機制解析的學習文檔,提供給大家進行學習參考,有需要的可以 點擊這里直接獲取!!! 裡面記錄許多Android 相關學習知識點。
㈢ 針對Android的性能優化集中哪些方面
一、概要:
本文主要以Android的渲染機制、UI優化、多線程的處理、緩存處理、電量優化以及代碼規范等幾方面來簡述Android的性能優化
二、渲染機制的優化:
大多數用戶感知到的卡頓等性能問題的最主要根源都是因為渲染性能。
Android系統每隔16ms發出VSYNC信號,觸發對UI進行渲染, 如果每次渲染都成功,這樣就能夠達到流暢的畫面所需要的60fps,為了能夠實現60fps,這意味著程序的大多數操作都必須在16ms內完成。
*關於JobScheler的更多知識可以參考http://hukai.me/android-training-course-in-chinese/background-jobs/scheling/index.html
七、代碼規范
1)for loop中不要聲明臨時變數,不到萬不得已不要在裡面寫try catch。
2)明白垃圾回收機制,避免頻繁GC,內存泄漏,OOM(有機會專門說)
3)合理使用數據類型,StringBuilder代替String,少用枚舉enum,少用父類聲明(List,Map)
4)如果你有頻繁的new線程,那最好通過線程池去execute它們,減少線程創建開銷。
5)你要知道單例的好處,並正確的使用它。
6)多用常量,少用顯式的"action_key",並維護一個常量類,別重復聲明這些常量。
7)如果可以,至少要弄懂設計模式中的策略模式,組合模式,裝飾模式,工廠模式,觀察者模式,這些能幫助你合理的解耦,即使需求頻繁變更,你也不用害怕牽一發而動全身。需求變更不可怕,可怕的是沒有在寫代碼之前做合理的設計。
8)View中設置緩存屬性.setDrawingCache為true.
9)cursor的使用。不過要注意管理好cursor,不要每次打開關閉cursor.因為打開關閉Cursor非常耗時。Cursor.require用於刷cursor.
10)採用SurfaceView在子線程刷新UI,避免手勢的處理和繪制在同一UI線程(普通View都這樣做)
11)採用JNI,將耗時間的處理放到c/c++層來處理
12)有些能用文件操作的,盡量採用文件操作,文件操作的速度比資料庫的操作要快10倍左右
13)懶載入和緩存機制。訪問網路的耗時操作啟動一個新線程來做,而不要再UI線程來做
14)如果方法用不到成員變數,可以把方法申明為static,性能會提高到15%到20%
15)避免使用getter/setter存取field,可以把field申明為public,直接訪問
16)私有內部類要訪問外部類的field或方法時,其成員變數不要用private,因為在編譯時會生成setter/getter,影響性能。可以把外部類的field或方法聲明為包訪問許可權
17)合理利用浮點數,浮點數比整型慢兩倍
18)針對ListView的性能優化,ListView的背景色與cacheColorHint設置相同顏色,可以提高滑動時的渲染性能。ListView中getView是性能是關鍵,這里要盡可能的優化。
getView方法中要重用view;getView方法中不能做復雜的邏輯計算,特別是資料庫操作,否則會嚴重影響滑動時的性能
19)不用new關鍵詞創建類的實例,用new關鍵詞創建類的實例時,構造函數鏈中的所有構造函數都會被自動調用。但如果一個對象實現了Cloneable介面,我們可以調用它的clone()方法。
clone()方法不會調用任何類構造函數。在使用設計模式(Design Pattern)的場合,如果用Factory模式創建對象,則改用clone()方法創建新的對象實例非常簡單。例如,下面是Factory模式的一個典型實現:
20)public static Credit getNewCredit() {
return new Credit();
}
改進後的代碼使用clone()方法,如下所示:
private static Credit BaseCredit = new Credit();
public static Credit getNewCredit() {
return (Credit) BaseCredit.clone();
}
上面的思路對於數組處理同樣很有用。
21)乘法和除法
考慮下面的代碼:
for (val = 0; val < 100000; val +=5) { alterX = val * 8; myResult = val * 2; }
用移位操作替代乘法操作可以極大地提高性能。下面是修改後的代碼:
for (val = 0; val < 100000; val += 5) { alterX = val << 3; myResult = val << 1; }
22)ViewPager同時緩存page數最好為最小值3,如果過多,那麼第一次顯示時,ViewPager所初始化的pager就會很多,這樣pager累積渲染耗時就會增多,看起來就卡。
23)每個pager應該只在顯示時才載入網路或資料庫(UserVisibleHint=true),最好不要預載入數據,以免造成浪費
24)提高下載速度:要控制好同時下載的最大任務數,同時給InputStream再包一層緩沖流會更快(如BufferedInputStream)
25)提供載入速度:讓服務端提供不同解析度的圖片才是最好的解決方案。還有合理使用內存緩存,使用開源的框架
引用:Android性能優化的淺談
㈣ android 性能優化有哪些辦法
性能優化的常用方法
主要內容包括布局優化,繪制優化,內存泄露優化,相應速度優化,ListView優化,Bitmap優化,線程優化等,下面主要給你舉了其中的幾個例子:
(1)布局優化
布局優化的思想很簡單,就是盡量減少布局文件的層級。
如何進行優化呢?首先刪除布局中無用的控制項和層級,其次有選擇地使用性能較低的ViewGroup,比如LinearLayout。如果布局中有的布局既可以用LinearLayout也可以用RelativeLayout,那就用LinearLayout,這是因為RelativeLayout比較復雜,他的布局過程花費更多的CPU時間。FrameLayout和LinearLayout一樣都是一種簡單高效的ViewGroup,因此可以考慮使用他們,但是很多時候,單純的通過一個LinearLayout或者FrameLayout無法實現產品的效果,需要通過嵌套的方式來完成,這種情況建議採用RelativeLayout,因為ViewGroup的嵌套就相當於增加了布局的層級,同樣會降低程序的性能。
布局優化的另一種手段是採用<include>標槍,<merge>標簽和ViewStub。<include>標簽主要用於布局重用,<merge>標簽一般和<include>配合使用,它可以減少布局的層級。而ViewStub則提供了按需載入功能,當需要時才將ViewStub中的布局載入到內存,這提高了程序的初始化效率。
(2)繪制方法
繪制優化是指View的onDraw方法避免執行大量的操作,這主要有兩方面。
首先,onDraw中不要創建新的布局對象,這是因為onDraw方法可能會被頻繁調用,這樣就會在一瞬間產生大量的臨時對象,這不僅佔用了過多的內存而且還會導致系統更加頻繁的gc,降低了程序的執行效率。
另一方面,onDraw方法中不要做耗時的任務,也不能執行成千上萬次循環操作,盡管每次循環都很輕量級,但是大量的循環仍然十分搶佔CPU的時間片,這會造成View的繪制過程不流暢。
(3)內存泄露優化
內存泄露在開發過程中是一個需要重視的問題,但是由於內存泄露問題對開發人員的經驗和開發意識要求比較高,因此這是開發人員最容易犯的錯誤之一。內存泄露的優化分為兩個方面,一方面是在開發過程中避免寫出內存泄露的代碼,另一方面通過一些分析工具比如MAT來找出潛在的內存泄露繼而解決。
關於性能優化的建議
1.避免黃健過多對象;
2.不要過多使用枚舉,枚舉佔用的內存空間比整型大一些。
3.常量使用staticfinal來修飾。
4.使用一些Android特有的數據結構,比如SpareArray和Pair等,他們都具有更好的性能。
5.適當使用軟引用和弱引用。
6.採用內存緩存和磁碟緩存
7.盡量採用靜態內部類,這樣可以避免潛在的內部類而導致的內存泄漏。
㈤ android怎麼提高線程的優先順序
線程調度 計算機通常只有一個CPU,在任意時刻只能執行一條機器指令,每個線程只有獲得CPU的使用權才能執行指令.所謂多線程的並發運行,其實是指從宏觀上看,各個線程輪流獲得CPU的使用權,分別執行各自的任務.在運行池中,會有多個處於就緒狀態的線程在等待CPU,JAVA虛擬機的一項任務就是負責線程的調度,線程調度是指按照特定機制為多個線程分配CPU的使用權. 有兩種調度模型:分時調度模型和搶占式調度模型。 分時調度模型是指讓所有的線程輪流獲得cpu的使用權,並且平均分配每個線程佔用的CPU的時間片這個也比較好理解。 java虛擬機採用搶占式調度模型,是指優先讓可運行池中優先順序高的線程佔用CPU,如果可運行池中的線程優先順序相同,那麼就隨機選擇一個線程,使其佔用CPU。處於運行狀態的線程會一直運行,直至它不得不放棄CPU。 一個線程會因為以下原因而放棄CPU。 1 java虛擬機讓當前線程暫時放棄CPU,轉到就緒狀態,使其它線程或者運行機會。 2 當前線程因為某些原因而進入阻塞狀態 3 線程結束運行 需要注意的是,線程的調度不是跨平台的,它 不僅僅取決於java虛擬機,還依賴於操作系統。在某些操作系統中,只要運行中的線程沒有遇到阻塞,就不會放棄CPU;在某些操作系統中,即使線程沒有遇到阻塞,也會運行一段時間後放棄CPU,給其它線程運行的機會。 java的線程調度是不分時的,同時啟動多個線程後,不能保證各個線程輪流獲得均等的CPU時間片。 如果希望明確地讓一個線程給另外一個線程運行的機會,可以採取以下辦法之一。 調整各個線程的優先順序 讓處於運行狀態的線程調用Thread.sleep()方法 讓處於運行狀態的線程調用Thread.yield()方法 讓處於運行狀態的線程調用另一個線程的join()方法
㈥ android 開發之app都可以進行哪些優化
1.在後台取消一些線程中的動作
我們知道App運行過程中所有的操作都默認在主線程(UI線程)中進行的,這樣App的響應速度就會受到影響。會導致程序陷入卡頓、死掉甚至會發生系統錯誤。
為 了加快響應速度,需要把費時的操作(比如網路請求、資料庫操作或者復雜的計算)從主線程移動到一個單獨的線程中。最高效的方式就是在類這一級完成 這項操作,可以使用AsyncTask或者IntentService來創建後台操作。如果選擇使用IntentService,它會在需要的時候啟動起 來,然後通過一個工作線程來處理請求(Intent)。
使用IntentService時需要注意以下幾點限制:
這個類不要給UI傳遞信息,如果要向用戶展示處理結果信息請用Activity;
每次只能處理一個請求;
每一個處理請求過程都不能中斷;
2.保持響應不發生ANR
從UI線程中移除費時操作這個方式還可以防止用戶操作出現系統不響應(ANR)對話框。需要做的就是繼承AsyncTask來創建一個後台工作線程,並實現doInBackground()方法。
還有一種方式就是自己創建一個Thread類或者HandlerThread類。需要注意這樣也會使App變慢,因為默認的線程優先順序和主線程的優先順序是一樣的,除非你明確設定線程的優先順序。
3.在線程中初始化查詢操作
當查詢操作正在後台處理時,展示數據也不是即時的,但是你可以使用CursorLoader對象來加快速度,這個操作可以使Activity和用戶之間的互動不受影響。
使用這個對象後,你的App會為ContentProvider初始化一個獨立的後台線程進行查詢,當查詢結束後就會給調用查詢的Activity返回結果。
4.其它需要注意的方面
使用StrictMode來檢查UI線程中可能潛在的費時操作;
使用一些特殊的工具如Safe.ijiami、Systrace或者Traceview來尋找在你的應用中的瓶頸;
用進度條向用戶展示操作進度;
如果初始化操作很費時,請展示一個歡迎界面。
優化設備的電池壽命
如果應用很費電,請不要責怪用戶卸載了你的應用。對於電池使用來說,主要費電情況如下:
更新數據時經常喚醒程序;
用EDGE或者3G來傳遞數據;
文本數據轉換,進行非JIT正則表達式操作。
5.優化網路
如果沒有網路連接,請讓你的應用跳過網路操作;只在有網路連接並且無漫遊的情況下更新數據;
選擇兼容的數據格式,把含有文本數據和二進制數據的請求全部轉化成二進制數據格式請求;
使用高效的轉換工具,多考慮使用流式轉換工具,少用樹形的轉換工具;
為了更快的用戶體驗,請減少重復訪問伺服器的操作;
如果可以的話,請使用framework的GZIP庫來壓縮文本數據以高效使用CPU資源。
6.優化應用在前端的工作
如果考慮使用wakelocks,盡量設置為最小的級別;
為了防止潛在的bug導致的電量消耗,請明確指定超時時間;
啟用 android:keepScreenOn屬性;
除了系統的GC操作,多考慮手動回收Java對象,比如XmlPullParserFactory和BitmapFactory。還有正則表達式的Matcher.reset(newString)操作、StringBuilder.setLength(0)操作;
要注意同步的問題,盡管在主線程中是安全的;
在Listview中要多採用重復利用策略;
如果允許的話多使用粗略的網路定位而不用GPS,對比一下GPS需要1mAh(25s * 140 mA),而一般網路只用0.1mAh(2s * 180mA);
確保注銷GPS的位置更新操作,因為這個更新操作在onPause()中也是會繼續的。當所有的應用都注銷了這個操作,用戶可以在系統設置中重新啟用GPS而不浪費電量;
請考慮在大量數理運算中使用低精度變數並在用DisplayMetrics進行DPI任務時緩存變數值;
7.優化工作在前台的應用
請確保service生命周期都是短暫的,因為每個進程都需要2MB的內存,而在前台程序需要內存時也會重新啟動;
保持內存的使用量不要太大;
如果要應用每30分鍾更新一次,請在設備處於喚醒狀態下進行;
Service在pull或者sleep狀態都是不好的,這就是為什麼在服務結束時要使用AlarmManager或者配置屬性stopSelf()的原因。
8.其它注意事項
在進行整體更新之前檢查電池的狀態和網路狀態,等待最好的狀態在進行大幅度裝換操作;
讓用戶看到用電情況,比如更新周期,後台操作的時候;
實現低內存佔用UI
9.找到布局顯示問題
當 我們為布局單獨創建UI的時候,就是在創建濫用內存的App,它在UI中會出現可惡的延時。要實現一個流暢的、低內存佔用的UI,第一步就是搜索 你的應用找出潛在的瓶頸布局。使用Safe.ijiami和Android SDK/tools/中自帶的Hierarchy Viewer Tool工具。
還有一個很好的工具就是Lint,它會掃描應用的源碼去尋找可能存在的bug,並為控制項結果進行優化。
10.解決問題
如果布局顯示結果發現了問題,你可以考慮簡化布局結構。可以把LinearLayout類型轉化成RelativeLayout類型,降低布局的層級結構
㈦ Android性能優化總結
常用的Android性能優化方法:
一、布局優化:
1)盡量減少布局文件的層級。
層級少了,繪制的工作量也就少了,性能自然提高。
2)布局重用 <include標簽>
3)按需載入:使用ViewStub,它繼承自View,一種輕量級控制項,本身不參與任何的布局和繪制過程。他的layout參數里添加一個替換的布局文件,當它通過setVisibility或者inflate方法載入後,它就會被內部布局替換掉。
二、繪制優化:
基於onDraw會被調用多次,該方法內要避免兩類操作:
1)創建新的局部對象,導致大量垃圾對象的產生,從而導致頻繁的gc,降低程序的執行效率。
2)不要做耗時操作,搶CPU時間片,造成繪制很卡不流暢。
三、內存泄漏優化:
1)靜態變數導致內存泄漏 比較明顯
2)單例模式導致的內存泄漏 單例無法被垃圾回收,它持有的任何對象的引用都會導致該對象不會被gc。
3)屬性動畫導致內存泄漏 無限循環動畫,在activity中播放,但是onDestroy時沒有停止的話,動畫會一直播放下去,view被動畫持有,activity又被view持有,導致activity無法被回收。
四、響應速度優化:
1)避免在主線程做耗時操作 包括四大組件,因為四大組件都是運行在主線程的。
2)把一些創建大量對象等的初始化工作放在頁面回到前台之後,而不應該放到創建的時候。
五、ListView的優化:
1)使用convertView,走listView子View回收的一套:RecycleBin 機制
主要是維護了兩個數組,一個是mActiveViews,當前可見的view,一個是mScrapViews,當前不可見的view。當觸摸ListView並向上滑動時,ListView上部的一些OnScreen的View位置上移,並移除了ListView的屏幕范圍,此時這些OnScreen的View就變得不可見了,不可見的View叫做OffScreen的View,即這些View已經不在屏幕可見范圍內了,也可以叫做ScrapView,Scrap表示廢棄的意思,ScrapView的意思是這些OffScreen的View不再處於可以交互的Active狀態了。ListView會把那些ScrapView(即OffScreen的View)刪除,這樣就不用繪制這些本來就不可見的View了,同時,ListView會把這些刪除的ScrapView放入到RecycleBin中存起來,就像把暫時無用的資源放到回收站一樣。
當ListView的底部需要顯示新的View的時候,會從RecycleBin中取出一個ScrapView,將其作為convertView參數傳遞給Adapter的getView方法,從而達到View復用的目的,這樣就不必在Adapter的getView方法中執行LayoutInflater.inflate()方法了。
RecycleBin中有兩個重要的View數組,分別是mActiveViews和mScrapViews。這兩個數組中所存儲的View都是用來復用的,只不過mActiveViews中存儲的是OnScreen的View,這些View很有可能被直接復用;而mScrapViews中存儲的是OffScreen的View,這些View主要是用來間接復用的。
2)使用ViewHolder避免重復地findViewById
3)快速滑動不適合做大量非同步任務,結合滑動監聽,等滑動結束之後載入當前顯示在屏幕范圍的內容。
4)getView中避免做耗時操作,主要針對圖片:ImageLoader來處理(原理:三級緩存)
5)對於一個列表,如果刷新數據只是某一個item的數據,可以使用局部刷新,在列表數據量比較大的情況下,節省不少性能開銷。
六、Bitmap優化:
1)減少內存開支:圖片過大,超過控制項需要的大小的情況下,不要直接載入原圖,而是對圖片進行尺寸壓縮,方式是BitmapFactroy.Options 采樣,inSampleSize 轉成需要的尺寸的圖片。
2)減少流量開銷:對圖片進行質量壓縮,再上傳伺服器。圖片有三種存在形式:硬碟上時是file,網路傳輸時是stream,內存中是stream或bitmap,所謂的質量壓縮,它其實只能實現對file的影響,你可以把一個file轉成bitmap再轉成file,或者直接將一個bitmap轉成file時,這個最終的file是被壓縮過的,但是中間的bitmap並沒有被壓縮。bitmap.compress(Bitmap.CompressFormat.PNG,100,bos);
七、線程優化:
使用線程池。為什麼要用線程池?
1、從「為每個任務分配一個線程」轉換到「在線程池中執行任務」
2、通過重用現有的線程而不是創建新線程,可以處理多個請求在創建銷毀過程中產生的巨大開銷
3、當使用線程池時,在請求到來時間 ,不用等待系統重新創建新的線程,而是直接復用線程池中的線程,這樣可以提高響應性。
4、通過和適當調整線程池的大小 ,可以創建足夠多的線程以使處理器能夠保持忙碌狀態,同時還可以防止過多線程相互競爭資源而使應用程序耗盡內存或者失敗。
5、一個App裡面所有的任務都放在線程池中執行後,可以統一管理 ,當應用退出時,可以把程序中所有的線程統一關閉,避免了內存和CPU的消耗。
6、如果這個任務是一個循環調度任務,你則必須在這個界面onDetach方法把這個任務給cancel掉,如果是一個普通任務則可cancel,可不cancel,但是最好cancel
7、整個APP的總開關會在應用退出的時間把整個線程池全部關閉。
八、一些性能優化建議:
1)避免創建過多對象,造成頻繁的gc
2)不要過多使用枚舉,枚舉佔用的空間比整型大很多
3)字元串的拼接使用StringBuffer、StringBuilder來替代直接使用String,因為使用String會創建多個String對象,參考第一條。
4)適當使用軟引用,(弱引用就不太推薦了)
5)使用內存緩存和磁碟緩存。
㈧ 如何加快Android Studio 編譯app 的速度
以下幾個方法可以提高Android Studio的編譯速度:
使用Gradle 2.4。
Gradle 2.4對執行性能有很大的優化,要手動讓Android Studio使用Gradle 2.4,在項目根目錄下的 build.grade中加入。