
這里收集整理的是今年大廠Android開發(fā)崗的面試題,問的深度不算高,但是大多數(shù)程序員真不一定能回答得上。大家可以查漏補缺檢驗一下自身水平。
切記!學(xué)如逆水行舟,不進則退
目錄
1.如何對 Android 應(yīng)用進行性能分析
2.什么情況下會導(dǎo)致內(nèi)存泄露
3.如何避免 OOM 異常
4.Android 中如何捕獲未捕獲的異常
5.ANR 是什么?怎樣避免和解決 ANR(重要)
6.Android 線程間通信有哪幾種方式
7.Devik 進程,linux 進程,線程的區(qū)別
8.描述一下 android 的系統(tǒng)架構(gòu)
9.android 應(yīng)用對內(nèi)存是如何限制的?我們應(yīng)該如何合理使用內(nèi)存?
10. 簡述 android 應(yīng)用程序結(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.進程保活
一、性能優(yōu)化
1.如何對 Android 應(yīng)用進行性能分析
android 性能主要之響應(yīng)速度 和UI刷新速度。
可以參考博客:Android系統(tǒng)性能調(diào)優(yōu)工具介紹
首先從函數(shù)的耗時來說,有一個工具TraceView 這是androidsdk自帶的工作,用于測量函數(shù)耗時的。
UI布局的分析,可以有2塊,一塊就是Hierarchy Viewer 可以看到View的布局層次,以及每個View刷新加載的時間。
這樣可以很快定位到那塊layout & View 耗時最長。
還有就是通過自定義View來減少view的層次。
2.什么情況下會導(dǎo)致內(nèi)存泄露
內(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,就會導(dǎo)致該內(nèi)存無法釋放。
6.單例
單例 是一個全局的靜態(tài)對象,當持有某個復(fù)制的類A是,A無法被釋放,內(nèi)存leak。
3.如何避免 OOM 異常
首先OOM是什么?
當程序需要申請一段“大”內(nèi)存,但是虛擬機沒有辦法及時的給到,即使做了GC操作以后
這就會拋出 OutOfMemoryException 也就是OOM
Android的OOM怎么樣?
為了減少單個APP對整個系統(tǒng)的影響,android為每個app設(shè)置了一個內(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。
如何避免OOM
減少內(nèi)存對象的占用
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.減少資源圖片的大小,過大的圖片可以考慮分段加載
內(nèi)存對象的重復(fù)利用
大多數(shù)對象的復(fù)用,都是利用對象池的技術(shù)。
1.listview/gridview/recycleview contentview的復(fù)用
2.inBitmap 屬性對于內(nèi)存對象的復(fù)用ARGB_8888/RBG_565/ARGB_4444/ALPHA_8
這個方法在某些條件下非常有用,比如要加載上千張圖片的時候。
3.避免在ondraw方法里面 new對象
4.StringBuilder 代替+
4.Android 中如何捕獲未捕獲的異常

CrashHandler
關(guān)鍵是實現(xiàn)Thread.UncaughtExceptionHandler
然后是在application的oncreate里面注冊。
5.ANR 是什么?怎樣避免和解決 ANR(重要)
ANR->Application Not Responding
也就是在規(guī)定的時間內(nèi),沒有響應(yīng)。
三種類型:
1). KeyDispatchTimeout(5 seconds) —主要類型按鍵或觸摸事件在特定時間內(nèi)無響應(yīng)
2). BroadcastTimeout(10 seconds) —BroadcastReceiver在特定時間內(nèi)無法處理完成
3). ServiceTimeout(20 seconds) —小概率類型 Service在特定的時間內(nèi)無法處理完成
為什么會超時:事件沒有機會處理 & 事件處理超時
怎么避免ANR
ANR的關(guān)鍵
是處理超時,所以應(yīng)該避免在UI線程,BroadcastReceiver 還有service主線程中,處理復(fù)雜的邏輯和計算
而交給work thread操作。
1)避免在activity里面做耗時操作,oncreate & onresume
2)避免在onReceiver里面做過多操作
3)避免在Intent Receiver里啟動一個Activity,因為它會創(chuàng)建一個新的畫面,并從當前用戶正在運行的程序上搶奪焦點。
4)盡量使用handler來處理UI thread & workthread的交互。
如何解決ANR
首先定位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 waitstarted
CPUusage 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% iowait
04-0113:12:15.872 E/ActivityManager( 220): CPUusage from 3697ms to 4223ms later:-- ANR后CPU的使用量
從log可以看出,cpu在做大量的io操作。
所以可以查看io操作的地方。
當然,也有可能cpu占用不高,那就是 主線程被block住了。
6.Android 線程間通信有哪幾種方式
1)共享變量(內(nèi)存)
2)管道
3)handle機制
runOnUiThread(Runnable)
view.post(Runnable)
7.Devik 進程,linux 進程,線程的區(qū)別
Dalvik進程。
每一個android app都會獨立占用一個dvm虛擬機,運行在linux系統(tǒng)中。
所以dalvik進程和linux進程是可以理解為一個概念。
8.描述一下 android 的系統(tǒng)架構(gòu)
從小到上就是:
linux kernel,lib dalvik vm ,application framework, app
9.android 應(yīng)用對內(nèi)存是如何限制的?我們應(yīng)該如何合理使用內(nèi)存?
activitymanager.getMemoryClass() 獲取內(nèi)存限制。
關(guān)于合理使用內(nèi)存,其實就是避免OOM & 內(nèi)存泄露中已經(jīng)說明。
10. 簡述 android 應(yīng)用程序結(jié)構(gòu)是哪些
1)main code
- unit test
3)mianifest
4)res->drawable,drawable-xxhdpi,layout,value,mipmap
mipmap 是一種很早就有的技術(shù)了,翻譯過來就是紋理映射技術(shù).
google建議只把啟動圖片放入。
5)lib
6)color
11.請解釋下 Android 程序運行時權(quán)限與文件系統(tǒng)權(quán)限的區(qū)別
文件的系統(tǒng)權(quán)限是由linux系統(tǒng)規(guī)定的,只讀,讀寫等。
運行時權(quán)限,是對于某個系統(tǒng)上的app的訪問權(quán)限,允許,拒絕,詢問。該功能可以防止非法的程序訪問敏感的信息。
12.Framework 工作方式及原理,Activity 是如何生成一個 view 的,機制是什么
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中的布局加載進來。
13.多線程間通信和多進程之間通信有什么不同,分別怎么實現(xiàn)
線程間的通信可以參考第6點。
進程間的通信:bind機制(IPC->AIDL),linux級共享內(nèi)存,boradcast,
Activity 之間,activity & serview之間的通信,無論他們是否在一個進程內(nèi)。
14.Android 屏幕適配
屏幕適配的方式:xxxdpi, wrap_content,match_parent. 獲取屏幕大小,做處理。
dp來適配屏幕,sp來確定字體大小
drawable-xxdpi, values-1280*1920等 這些就是資源的適配。
wrap_content,match_parent, 這些是view的自適應(yīng)
weight,這是權(quán)重的適配。
15.什么是 AIDL 以及如何使用
Android Interface Definition Language
AIDL是使用bind機制來工作。
參數(shù):
java原生參數(shù)
String
parcelable
list & map 元素 需要支持AIDL
16.Handler 機制
參考:android 進程/線程管理(一)——消息機制的框架 這個系類。
17.事件分發(fā)機制
android 事件分發(fā)機制
帶你一起探究Android事件分發(fā)機制, 讓面試提問不在畏懼!
18.子線程發(fā)消息到主線程進行更新 UI,除了 handler 和 AsyncTask,還有什么
EventBus,廣播,view.post, runinUiThread
但是無論各種花樣,本質(zhì)上就2種:handler機制 + 廣播
19.子線程中能不能 new handler?為什么
必須可以。子線程 可以new 一個mainHandler,然后發(fā)送消息到UI Thread。
20.Android 中的動畫有哪幾類,它們的特點和區(qū)別是什么
視圖動畫,或者說補間動畫。只是視覺上的一個效果,實際view屬性沒有變化,性能好,但是支持方式少。
屬性動畫,通過變化屬性來達到動畫的效果,性能略差,支持點擊等事件。android 3.0
幀動畫,通過drawable一幀幀畫出來。
Gif動畫,原理同上,canvas畫出來。
具體可參考:https://i.cnblogs.com/posts?categoryid=672052
21.如何修改 Activity 進入和退出動畫
overridePendingTransition
22.SurfaceView & View 的區(qū)別
view的更新必須在UI thread中進行
surfaceview會單獨有一個線程做ui的更新。
surfaceview 支持open GL繪制。

二、項目框架的使用
23.開發(fā)中都使用過哪些框架、平臺
1.EventBus 事件分發(fā)機制,由handler實現(xiàn),線程間通信
2.xUtils->DbUtils,ViewUtils,HttpUtils,BitmapUtils
3.百度地圖
4.volley
5.fastjson
6.picciso
7.友盟
8.zxing
9.Gson
24.使用過那些自定義View
pull2RefreshListView
25.自定義控件:繪制圓環(huán)的實現(xiàn)過程
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)
26.自定義控件:摩天輪的實現(xiàn)過程

27.GridLayout的使用
參考鏈接
https://blog.csdn.net/k316378085/article/details/52316633
28.流式布局的實現(xiàn)過程
參考鏈接
https://blog.csdn.net/sz237812861/article/details/78383484?locationNum=4&fps=1
29.第三方登陸
30.第三方支付
參考鏈接
https://blog.csdn.net/androidstarjack/article/details/72669394
31.進程?;?/h3>
關(guān)于面試的充分準備
一些基礎(chǔ)知識和理論肯定是要背的,要理解的背,用自己的語言總結(jié)一下背下來。
雖然 Android 沒有前幾年火熱了,已經(jīng)過去了會四大組件就能找到高薪職位的時代了。這只能說明 Android 中級以下的崗位飽和了,現(xiàn)在高級工程師還是比較缺少的,很多高級職位給的薪資真的特別高(錢多也不一定能找到合適的),所以努力讓自己成為高級工程師才是最重要的。
這里附上上述的面試題相關(guān)的幾十套字節(jié)跳動,京東,小米,騰訊、頭條、阿里、美團等公司19年的面試題。把技術(shù)點整理成了視頻和PDF(實際上比預(yù)期多花了不少精力),包含知識脈絡(luò) + 諸多細節(jié)。
由于篇幅有限,這里以圖片的形式給大家展示一小部分。


《Android高級教程全套+BAT面試題集+學(xué)習(xí)心得》,石墨文檔可見;https://shimo.im/docs/qvwWp3dGy8HP6VRG
網(wǎng)上學(xué)習(xí) Android的資料一大堆,但如果學(xué)到的知識不成體系,遇到問題時只是淺嘗輒止,不再深入研究,那么很難做到真正的技術(shù)提升。希望這份系統(tǒng)化的技術(shù)體系對大家有一個方向參考。
天道酬勤,只要你想,大廠offer并不是遙不可及!
希望本篇文章能為你帶來幫助,如果有問題,請在評論區(qū)留言