您好,登錄后才能下訂單哦!
1.如何對 Android 應用進行性能分析
2.什么情況下會導致內(nèi)存泄露
3.如何避免 OOM 異常
4.Android 中如何捕獲未捕獲的異常
5.ANR 是什么?怎樣避免和解決 ANR(重要)
6.Android 線程間通信有哪幾種方式
7.Devik 進程,linux 進程,線程的區(qū)別
8.描述一下 android 的系統(tǒng)架構(gòu)
9.android 應用對內(nèi)存是如何限制的?我們應該如何合理使用內(nèi)存?
10. 簡述 android 應用程序結(jié)構(gòu)是哪些
11.請解釋下 Android 程序運行時權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別
12.Framework 工作方式及原理,Activity 是如何生成一個 view 的,機制是什么
13.多線程間通信和多進程之間通信有什么不同,分別怎么實現(xiàn)
14.Android 屏幕適配
15.什么是 AIDL 以及如何使用
16.Handler 機制
17.事件分發(fā)機制
18.子線程發(fā)消息到主線程進行更新 UI,除了 handler 和 AsyncTask,還有什么
19.子線程中能不能 new handler?為什么
20.Android 中的動畫有哪幾類,它們的特點和區(qū)別是什么
21.如何修改 Activity 進入和退出動畫
22.SurfaceView & View 的區(qū)別
23.開發(fā)中都使用過哪些框架、平臺
24.使用過那些自定義View
25.自定義控件:繪制圓環(huán)的實現(xiàn)過程
26.自定義控件:摩天輪的實現(xiàn)過程
27.GridLayout的使用
28.流式布局的實現(xiàn)過程
29.第三方登陸
30.第三方支付
31.進程?;?/p>
android 性能主要之響應速度 和UI刷新速度。
可以參考博客:Android系統(tǒng)性能調(diào)優(yōu)工具介紹
首先從函數(shù)的耗時來說,有一個工具TraceView 這是androidsdk自帶的工作,用于測量函數(shù)耗時的。
UI布局的分析,可以有2塊,一塊就是Hierarchy Viewer 可以看到View的布局層次,以及每個View刷新加載的時間。
這樣可以很快定位到那塊layout & View 耗時最長。
還有就是通過自定義View來減少view的層次。
內(nèi)存泄露是個折騰的問題。
什么時候會發(fā)生內(nèi)存泄露?內(nèi)存泄露的根本原因:長生命周期的對象持有短生命周期的對象。短周期對象就無法及時釋放。
1. 靜態(tài)集合類引起內(nèi)存泄露
主要是hashmap,Vector等,如果是靜態(tài)集合 這些集合沒有及時setnull的話,就會一直持有這些對象。
2.remove 方法無法刪除set集 Objects.hash(firstName, lastName);
經(jīng)過測試,hashcode修改后,就沒有辦法remove了。
3.observer 我們在使用監(jiān)聽器的時候,往往是addxxxlistener,但是當我們不需要的時候,忘記removexxxlistener,就容易內(nèi)存leak。
廣播沒有unregisterrecevier
4.各種數(shù)據(jù)鏈接沒有關(guān)閉,數(shù)據(jù)庫contentprovider,io,sokect等。cursor
5.內(nèi)部類:
java中的內(nèi)部類(匿名內(nèi)部類),會持有宿主類的強引用this。
所以如果是new Thread這種,后臺線程的操作,當線程沒有執(zhí)行結(jié)束時,activity不會被回收。
Context的引用,當TextView 等等都會持有上下文的引用。如果有static drawable,就會導致該內(nèi)存無法釋放。
6.單例
單例 是一個全局的靜態(tài)對象,當持有某個復制的類A是,A無法被釋放,內(nèi)存leak。
當程序需要申請一段“大”內(nèi)存,但是虛擬機沒有辦法及時的給到,即使做了GC操作以后
這就會拋出 OutOfMemoryException 也就是OOM
為了減少單個APP對整個系統(tǒng)的影響,android為每個app設置了一個內(nèi)存上限。
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。
1.ArrayMap/SparseArray代替hashmap
2.避免在android里面使用Enum
3.減少bitmap的內(nèi)存占用
inSampleSize:縮放比例,在把圖片載入內(nèi)存之前,我們需要先計算出一個合適的縮放比例,避免不必要的大圖載入。
decode format:解碼格式,選擇ARGB_8888/RBG_565/ARGB_4444/ALPHA_8,存在很大差異。
4.減少資源圖片的大小,過大的圖片可以考慮分段加載
大多數(shù)對象的復用,都是利用對象池的技術(shù)。
1.listview/gridview/recycleview contentview的復用
2.inBitmap 屬性對于內(nèi)存對象的復用ARGB_8888/RBG_565/ARGB_4444/ALPHA_8
這個方法在某些條件下非常有用,比如要加載上千張圖片的時候。
3.避免在ondraw方法里面 new對象
4.StringBuilder 代替+
CrashHandler
關(guān)鍵是實現(xiàn)Thread.UncaughtExceptionHandler
然后是在application的oncreate里面注冊。
ANR->Application Not Responding
也就是在規(guī)定的時間內(nèi),沒有響應。
三種類型:
1). KeyDispatchTimeout(5 seconds) —主要類型按鍵或觸摸事件在特定時間內(nèi)無響應
2). BroadcastTimeout(10 seconds) —BroadcastReceiver在特定時間內(nèi)無法處理完成
3). ServiceTimeout(20 seconds) —小概率類型 Service在特定的時間內(nèi)無法處理完成
為什么會超時:事件沒有機會處理 & 事件處理超時
ANR的關(guān)鍵
是處理超時,所以應該避免在UI線程,BroadcastReceiver 還有service主線程中,處理復雜的邏輯和計算
而交給work thread操作。
1)避免在activity里面做耗時操作,oncreate & onresume
2)避免在onReceiver里面做過多操作
3)避免在Intent Receiver里啟動一個Activity,因為它會創(chuàng)建一個新的畫面,并從當前用戶正在運行的程序上搶奪焦點。
4)盡量使用handler來處理UI thread & workthread的交互。
首先定位ANR發(fā)生的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發(fā)生前的使用情況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)共享變量(內(nèi)存)
2)管道
3)handle機制
runOnUiThread(Runnable)
view.post(Runnable)
Dalvik進程。
每一個android app都會獨立占用一個dvm虛擬機,運行在linux系統(tǒng)中。
所以dalvik進程和linux進程是可以理解為一個概念。
從小到上就是:
linux kernel,lib dalvik vm ,application framework, app
activitymanager.getMemoryClass() 獲取內(nèi)存限制。
關(guān)于合理使用內(nèi)存,其實就是避免OOM & 內(nèi)存泄露中已經(jīng)說明。
1)main code
unit test
3)mianifest
4)res->drawable,drawable-xxhdpi,layout,value,mipmap
mipmap 是一種很早就有的技術(shù)了,翻譯過來就是紋理映射技術(shù).
google建議只把啟動圖片放入。
5)lib
6)color
文件的系統(tǒng)權(quán)限是由linux系統(tǒng)規(guī)定的,只讀,讀寫等。
運行時權(quán)限,是對于某個系統(tǒng)上的app的訪問權(quán)限,允許,拒絕,詢問。該功能可以防止非法的程序訪問敏感的信息。
Framework是android 系統(tǒng)對 linux kernel,lib庫等封裝,提供WMS,AMS,bind機制,handler-message機制等方式,供app使用。
簡單來說framework就是提供app生存的環(huán)境。
1)Activity在attch方法的時候,會創(chuàng)建一個phonewindow(window的子類)
2)onCreate中的setContentView方法,會創(chuàng)建DecorView
3)DecorView 的addview方法,會把layout中的布局加載進來。
線程間的通信可以參考第6點。
進程間的通信:bind機制(IPC->AIDL),linux級共享內(nèi)存,boradcast,
Activity 之間,activity & serview之間的通信,無論他們是否在一個進程內(nèi)。
屏幕適配的方式:xxxdpi, wrap_content,match_parent. 獲取屏幕大小,做處理。
dp來適配屏幕,sp來確定字體大小
drawable-xxdpi, values-1280*1920等 這些就是資源的適配。
wrap_content,match_parent, 這些是view的自適應
weight,這是權(quán)重的適配。
Android Interface Definition Language
AIDL是使用bind機制來工作。
參數(shù):
java原生參數(shù)
String
parcelable
list & map 元素 需要支持AIDL
參考:android 進程/線程管理(一)——消息機制的框架 這個系類。
android 事件分發(fā)機制
帶你一起探究Android事件分發(fā)機制, 讓面試提問不在畏懼!
EventBus,廣播,view.post, runinUiThread
但是無論各種花樣,本質(zhì)上就2種:handler機制 + 廣播
你真正了解UI線程更新的幾種方式嗎,面試必備之深度揭秘
必須可以。子線程 可以new 一個mainHandler,然后發(fā)送消息到UI Thread。
帶你一步一步深入Handler源碼,拿下面試官不在話下
視圖動畫,或者說補間動畫。只是視覺上的一個效果,實際view屬性沒有變化,性能好,但是支持方式少。
屬性動畫,通過變化屬性來達到動畫的效果,性能略差,支持點擊等事件。android 3.0
幀動畫,通過drawable一幀幀畫出來。
Gif動畫,原理同上,canvas畫出來。
具體可參考:https://i.cnblogs.com/posts?categoryid=672052
overridePendingTransition
view的更新必須在UI thread中進行
surfaceview會單獨有一個線程做ui的更新。
surfaceview 支持open GL繪制。
1.EventBus 事件分發(fā)機制,由handler實現(xiàn),線程間通信
2.xUtils->DbUtils,ViewUtils,HttpUtils,BitmapUtils
3.百度地圖
4.volley
5.fastjson
6.picciso
7.友盟
8.zxing
9.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); ???}}
關(guān)鍵是canvas.drawCycle & paint.setsytle(stoken)
參考鏈接
https://github.com/danylovolokh/LondonEyeLayoutManager
參考鏈接
https://blog.csdn.net/k316378085/article/details/52316633
參考鏈接
https://blog.csdn.net/sz237812861/article/details/78383484?locationNum=4&fps=1
參考鏈接
https://blog.csdn.net/alpha58/article/details/75210753
參考鏈接
https://blog.csdn.net/androidstarjack/article/details/72669394
參考鏈接
2018年Android的?;罘桨感Чy(tǒng)計
一些基礎知識和理論肯定是要背的,要理解的背,用自己的語言總結(jié)一下背下來。
雖然 Android 沒有前幾年火熱了,已經(jīng)過去了會四大組件就能找到高薪職位的時代了。這只能說明 Android 中級以下的崗位飽和了,現(xiàn)在高級工程師還是比較缺少的,我能明顯感覺到國慶后多了很多高級職位,所以努力讓自己成為高級工程師才是最重要的。
好了,希望對大家有所幫助。
接下來是整理的一些Android學習資料,有興趣的朋友們可以關(guān)注下我【主頁的簡介】查看免費領(lǐng)取方式。
①Android開發(fā)核心知識點筆記
②對標“阿里 P7” 40W+年薪企業(yè)資深架構(gòu)師成長學習路線圖
③面試精品集錦匯總
④全套體系化高級架構(gòu)視頻
Android精講視頻領(lǐng)取學習后更加是如虎添翼!進軍BATJ大廠等(備戰(zhàn))!現(xiàn)在都說互聯(lián)網(wǎng)寒冬,其實無非就是你上錯了車,且穿的少(技能),要是你上對車,自身技術(shù)能力夠強,公司換掉的代價大,怎么可能會被裁掉,都是淘汰末端的業(yè)務Curd而已!現(xiàn)如今市場上初級程序員泛濫,這套教程針對Android開發(fā)工程師1-6年的人員、正處于瓶頸期,想要年后突破自己漲薪的,進階Android中高級、架構(gòu)師對你更是如魚得水,趕快領(lǐng)取吧!
獲取方式:關(guān)注我 主頁 查看免費領(lǐng)取方式!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。