閱讀目錄java
1.如何對 Android 應用進行性能分析linux
2.什麼狀況下會致使內存泄露android
3.如何避免 OOM 異常git
4.Android 中如何捕獲未捕獲的異常github
5.ANR 是什麼?怎樣避免和解決 ANR(重要)面試
6.Android 線程間通訊有哪幾種方式數據庫
7.Devik 進程,linux 進程,線程的區別json
8.描述一下 android 的系統架構canvas
9.android 應用對內存是如何限制的?咱們應該如何合理使用內存?性能優化
10. 簡述 android 應用程序結構是哪些
11.請解釋下 Android 程序運行時權限與文件系統權限的區別
12.Framework 工做方式及原理,Activity 是如何生成一個 view 的,機制是什麼
13.多線程間通訊和多進程之間通訊有什麼不一樣,分別怎麼實現
14.Android 屏幕適配
15.什麼是 AIDL 以及如何使用
16.Handler 機制
17.事件分發機制
18.子線程發消息到主線程進行更新 UI,除了 handler 和 AsyncTask,還有什麼
19.子線程中能不能 new handler?爲何
20.Android 中的動畫有哪幾類,它們的特色和區別是什麼
21.如何修改 Activity 進入和退出動畫
22.SurfaceView & View 的區別
23.開發中都使用過哪些框架、平臺
24.使用過那些自定義View
25.自定義控件:繪製圓環的實現過程
26.自定義控件:摩天輪的實現過程
27.GridLayout的使用
28.流式佈局的實現過程
29.第三方登錄
30.第三方支付
31.進程保活
android 性能主要之響應速度 和UI刷新速度。
能夠參考博客:Android系統性能調優工具介紹
首先從函數的耗時來講,有一個工具TraceView 這是androidsdk自帶的工做,用於測量函數耗時的。
UI佈局的分析,能夠有2塊,一塊就是Hierarchy Viewer 能夠看到View的佈局層次,以及每一個View刷新加載的時間。
這樣能夠很快定位到那塊layout & View 耗時最長。
還有就是經過自定義View來減小view的層次。
Android性能優化 (1)—— 內存溢出和內存泄漏的介紹
內存泄露是個折騰的問題。
何時會發生內存泄露?內存泄露的根本緣由:長生命週期的對象持有短生命週期的對象。短週期對象就沒法及時釋放。
I. 靜態集合類引發內存泄露
主要是hashmap,Vector等,若是是靜態集合 這些集合沒有及時setnull的話,就會一直持有這些對象。
II.remove 方法沒法刪除set集 Objects.hash(firstName, lastName);
通過測試,hashcode修改後,就沒有辦法remove了。
III. observer 咱們在使用監聽器的時候,每每是addxxxlistener,可是當咱們不須要的時候,忘記removexxxlistener,就容易內存leak。
廣播沒有unregisterrecevier
IV.各類數據連接沒有關閉,數據庫contentprovider,io,sokect等。cursor
V.內部類:
java中的內部類(匿名內部類),會持有宿主類的強引用this。
因此若是是new Thread這種,後臺線程的操做,當線程沒有執行結束時,activity不會被回收。
Context的引用,當TextView 等等都會持有上下文的引用。若是有static drawable,就會致使該內存沒法釋放。
VI.單例
單例 是一個全局的靜態對象,當持有某個複製的類A是,A沒法被釋放,內存leak。
當程序須要申請一段「大」內存,可是虛擬機沒有辦法及時的給到,即便作了GC操做之後
這就會拋出 OutOfMemoryException 也就是OOM
爲了減小單個APP對整個系統的影響,android爲每一個app設置了一個內存上限。
public void getMemoryLimited(Activity context) { ActivityManager activityManager =(ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); System.out.println(activityManager.getMemoryClass()); System.out.println(activityManager.getLargeMemoryClass()); System.out.println(Runtime.getRuntime().maxMemory()/(1024*1024)); }
複製代碼
HTC M7實測,192M上限。512M 通常狀況下,192M就是上限,可是因爲某些特殊狀況,android容許使用一個更大的RAM。
I.ArrayMap/SparseArray代替hashmap
II.避免在android裏面使用Enum
III.減小bitmap的內存佔用
inSampleSize:縮放比例,在把圖片載入內存以前,咱們須要先計算出一個合適的縮放比例,避免沒必要要的大圖載入。
decode format:解碼格式,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差別。
IV.減小資源圖片的大小,過大的圖片能夠考慮分段加載
大多數對象的複用,都是利用對象池的技術。
I.listview/gridview/recycleview contentview的複用
II.inBitmap 屬性對於內存對象的複用ARGB_8888/RBG_565/ARGB_4444/ALPHA_8
這個方法在某些條件下很是有用,好比要加載上千張圖片的時候。
III.避免在ondraw方法裏面 new對象
IV.StringBuilder 代替+
CrashHandler
關鍵是實現Thread.UncaughtExceptionHandler
而後是在application的oncreate裏面註冊。
ANR->Application Not Responding
也就是在規定的時間內,沒有響應。
三種類型:
1). KeyDispatchTimeout(5 seconds) —主要類型按鍵或觸摸事件在特定時間內無響應
2). BroadcastTimeout(10 seconds) —BroadcastReceiver在特定時間內沒法處理完成
3). ServiceTimeout(20 seconds) —小几率類型 Service在特定的時間內沒法處理完成
爲何會超時:事件沒有機會處理 & 事件處理超時
ANR的關鍵
是處理超時,因此應該避免在UI線程,BroadcastReceiver 還有service主線程中,處理複雜的邏輯和計算
而交給work thread操做。
1)避免在activity裏面作耗時操做,oncreate & onresume
2)避免在onReceiver裏面作過多操做
3)避免在Intent Receiver裏啓動一個Activity,由於它會建立一個新的畫面,並從當前用戶正在運行的程序上搶奪焦點。
4)儘可能使用handler來處理UI thread & workthread的交互。
首先定位ANR發生的log:
04-01 13:12:11.572 I/InputDispatcher( 220): Application is not responding:Window{2b263310com.android.email/com.android.email.activity.SplitScreenActivitypaused=false}. 5009.8ms since event, 5009.5ms since waitstartedCPUusage from 4361ms to 699ms ago ----CPU在ANR發生前的使用狀況04-0113:12:15.872 E/ActivityManager( 220): 100%TOTAL: 4.8% user + 7.6% kernel + 87% iowait04-0113:12:15.872 E/ActivityManager( 220): CPUusage from 3697ms to 4223ms later:-- ANR後CPU的使用量
複製代碼
從log能夠看出,cpu在作大量的io操做。
因此能夠查看io操做的地方。
固然,也有可能cpu佔用不高,那就是 主線程被block住了。
1)共享變量(內存)
2)管道
3)handle機制
runOnUiThread(Runnable)
view.post(Runnable)
Dalvik進程。
每個android app都會獨立佔用一個dvm虛擬機,運行在linux系統中。
因此dalvik進程和linux進程是能夠理解爲一個概念。
你真正瞭解Java虛擬機嗎—高級開發必備《深刻了解Java虛擬機》
從小到上就是:
linux kernel,lib dalvik vm ,application framework, app
activitymanager.getMemoryClass() 獲取內存限制。
關於合理使用內存,其實就是避免OOM & 內存泄露中已經說明。
1)main code
3)mianifest
4)res->drawable,drawable-xxhdpi,layout,value,mipmap
mipmap 是一種很早就有的技術了,翻譯過來就是紋理映射技術.
google建議只把啓動圖片放入。
5)lib
6)color
文件的系統權限是由linux系統規定的,只讀,讀寫等。
運行時權限,是對於某個系統上的app的訪問權限,容許,拒絕,詢問。該功能能夠防止非法的程序訪問敏感的信息。
Framework是android 系統對 linux kernel,lib庫等封裝,提供WMS,AMS,bind機制,handler-message機制等方式,供app使用。
簡單來講framework就是提供app生存的環境。
1)Activity在attch方法的時候,會建立一個phonewindow(window的子類)
2)onCreate中的setContentView方法,會建立DecorView
3)DecorView 的addview方法,會把layout中的佈局加載進來。
線程間的通訊能夠參考第6點。
進程間的通訊:bind機制(IPC->AIDL),linux級共享內存,boradcast,
Activity 之間,activity & serview之間的通訊,不管他們是否在一個進程內。
屏幕適配的方式:xxxdpi, wrap_content,match_parent. 獲取屏幕大小,作處理。
dp來適配屏幕,sp來肯定字體大小
drawable-xxdpi, values-1280*1920等 這些就是資源的適配。
wrap_content,match_parent, 這些是view的自適應
weight,這是權重的適配。
Android Interface Definition Language
AIDL是使用bind機制來工做。
參數:
java原生參數
String
parcelable
list & map 元素 須要支持AIDL
參考:android 進程/線程管理(一)——消息機制的框架 這個系類。
android 事件分發機制
帶你一塊兒探究Android事件分發機制, 讓面試提問不在畏懼!
EventBus,廣播,view.post, runinUiThread
可是不管各類花樣,本質上就2種:handler機制 + 廣播
必須能夠。子線程 能夠new 一個mainHandler,而後發送消息到UI Thread。
Handler消息機制徹底解析(二)MessageQueue的隊列管理
Handler消息機制徹底解析(一)Message中obtain()與recycle()的前因後果
視圖動畫,或者說補間動畫。只是視覺上的一個效果,實際view屬性沒有變化,性能好,可是支持方式少。
屬性動畫,經過變化屬性來達到動畫的效果,性能略差,支持點擊等事件。android 3.0
幀動畫,經過drawable一幀幀畫出來。
Gif動畫,原理同上,canvas畫出來。
具體可參考:i.cnblogs.com/posts?categ…
overridePendingTransition
view的更新必須在UI thread中進行
surfaceview會單獨有一個線程作ui的更新。
surfaceview 支持open GL繪製。
I.EventBus 事件分發機制,由handler實現,線程間通訊
II.xUtils->DbUtils,ViewUtils,HttpUtils,BitmapUtils
III.百度地圖
IV.volley
V.fastjson
VI.picciso
VII.友盟
VIII.zxing
IX.Gson
pull2RefreshListView
public class CycleView extends View { Paint mPaint = new Paint(); public CycleView(Context context) { this(context, null); } public CycleView(Context context, AttributeSet attrs) { super(context, attrs); initView(); } private void initView() { mPaint.setAntiAlias(true); mPaint.setStyle(Paint.Style.STROKE); mPaint.setStrokeWidth(20); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); canvas.drawCircle(100,100,50,mPaint); }}
複製代碼
關鍵是canvas.drawCycle & paint.setsytle(stoken)
參考連接
參考連接
參考連接
參考連接
參考連接
參考連接
閱讀更多
美團面試題:Java-線程池 ThreadPool 專題詳解
在這裏得到的不只僅是技術!歡迎交流學習