-
描述清點擊 Android Studio 的 build 按鈕后發生了什么
-
畫出 Android 的大體架構圖
Android系統采用分層架構,從下往上依次為:
Linux內核
系統庫和Android運行時
框架層
應用程序層
-
App啟動流程,從點擊桌面開始
Https請求慢的解決辦法: DNS攜帶數據,直接訪問IP
https相關,如何驗證證書的合法性,https中哪里用了對稱加密,哪里用了非對稱加密,對加密算法(如RSA)等是否有了解
-
Bundle 機制
-
Activity的啟動模式
standard
singleTop
singleTask
singleInstance
啟動模式
-
四大組件
-
Service的開啟方式
-
廣播的使用場景
-
service一些知識,Activity與Service通信的方式
-
簡述Activity啟動全部過程?
-
fragment的生命周期,Activity與Fragment之間生命周期比較
-
簡述IPC?
IPC是Inter-Process Communication的縮寫,含義為進程間通信或者跨進程通信,是指兩個進程之間進行數據交換的過程。
IPC
IPC-2
http://www.lxweimin.com/p/96062c549b2a
-
fragment之間傳遞數據的方式?
1.Fragment 方法設置和調用。
2.采取接口回調的方式進行數據傳遞。
3.使用三方開源框架:EventBus
fragment之間傳遞數據
-
四種啟動模式,用過哪些,出過什么問題。(包括聊到了onSaveInstanceState跟onRestoreInstanceState的場景與時機,然后在一個點跟面試官看法不同,我說我調試時候遇到過相關問題,面試官讓我回去再確認下)
standard 標準模式,每次都新建一個實例對象
singleTop 如果在任務棧頂發現了相同的實例則重用,否則新建并壓入棧頂
singleTask 如果在任務棧中發現了相同的實例,將其上面的任務終止并移除,重用該實例。否則新建實例并入棧
singleInstance 允許不同應用,進程線程等共用一個實例,無論從何應用調用該實例都重用
啟動模式
onSaveInstanceState()方法會在什么時候被執行,有這么幾種情況:
(1)、當用戶按下HOME鍵時。
這是顯而易見的,系統不知道你按下HOME后要運行多少其他的程序,自然也不知道activity A是否會被銷毀,因此系統會調用onSaveInstanceState(),讓用戶有機會保存某些非永久性的數據。以下幾種情況的分析都遵循該原則
(2)、長按HOME鍵,選擇運行其他的程序時。
(3)、按下電源按鍵(關閉屏幕顯示)時。
(4)、從activity A中啟動一個新的activity時。
(5)、屏幕方向切換時,例如從豎屏切換到橫屏時。
數據恢復
-
BroadcastReceiver,LocalBroadcastReceiver 區別
一、應用場景
1、BroadcastReceiver用于應用之間的傳遞消息;
2、而LocalBroadcastManager用于應用內部傳遞消息,比broadcastReceiver更加高效。
二、安全
1、BroadcastReceiver使用的Content API,所以本質上它是跨應用的,所以在使用它時必須要考慮到不要被別的應用濫用;
2、LocalBroadcastManager不需要考慮安全問題,因為它只在應用內部有效。
LocalBroadcastReceiver
-
android 事件傳遞機制
事件傳遞機制
Android中事件傳遞機制(一) - 理論知識
-
如何保持應用的穩定性
- 提高編碼質量 (靜態掃描工具:Lint、Findbugs)
- 改進Crash上報系統,解決Crash問題
- 目前的策略:先在某一個渠道灰度,當問題暴露的足夠多時,再發布全量版本。
穩定性
-
談談classloader,類加載機制 雙親委派模型
熱修復詳細的流程:
1.通過PathClassLoader 來加載自身App的dex,因為我們要修改自己的bug.
2.通過DexClassLoader來加載我們的補丁dex文件,這里面就是沒有bug的dex.
3.反射兩個classLoader的<DexPathList pathList;>,目的是拿到這個值.
4.接著我們來繼續反射兩個classloader中的pathList(注意:是兩個!一個是我們自己應用的,另一個是我們補丁的,PathClassLoader和DexClassLoader都繼承BaseDexClassLoader),DexPathList里面的<Element[] dexElements;>,沒錯還是拿到這個數組的值
5.合并兩個反射到的Element 數組!這里是重中之重.我們需要把我們的補丁dex放在數組的最前面!
6.將合并的新的數組,通過Field重新設置到我們自身App的DexPathList->dexElements.沒錯!就是合并之后覆蓋有bug那個loader的Element 數組!!
7.通過Android build-tools 中的dx命令打包一個沒有bug的dex
注:假設你的App中有一個class A 出bug了,那么你就可以通過dx命令打包一個只有class A的dex文件.
-
動態加載
-
SP是進程同步的嗎?有什么方法做到同步
commit() 是同步提交到內存后再同步提交到磁盤上,如果 commit() 之前還有沒結束的異步任務(包括 apply() 的提交),就會一直阻塞到前面的提交都完成,才進行提交。
apply() 是立即提交到內存后異步提交到磁盤上。
commit() 有返回值,而 apply 沒有返回值。
存在內存與磁盤數據不同步的情況,多進程共享需要注意數據安全。
ContentProvider 多進程共享 SharedPreferences 數據
-
介紹下SurfaceView
一是,如果屏幕刷新頻繁,onDraw方法會被頻繁的調用,onDraw方法執行的時間過長,會導致掉幀,出現頁面卡頓。而SurfaceView采用了雙緩沖技術,提高了繪制的速度,可以緩解這一現象。
二是,view的onDraw方法是運行在主線程中的,會輕微阻塞主線程,對于需要頻繁刷新頁面的場景,而且onDraw方法中執行的操作比較耗時,會導致主線程阻塞,用戶事件的響應受到影響,也就是響應速度下降,影響了用戶的體驗。而SurfaceView可以在自線程中更新UI,不會阻塞主線程,提高了響應速度。
SurfaceView介紹
SurfaceView SurfaceView, TextureView, SurfaceTexture等的區別
http://www.lxweimin.com/p/03449246930b
-
OSGI
OSGi是java平臺(注意,是平臺而不是語言!)的模塊化層
-
對 Dalvik、ART 虛擬機有基本的了解;
-
App 是如何沙箱化,為什么要這么做;
-
Application 的生命周期;
-
handler實現機制(很多細節需要關注:如線程如何建立和退出消息循環等等)
-
ThreadLocal 原理
-
ActicityThread相關?
-
進程間通信的方式
- 使用Bundle的方式
- 使用文件共享的方式
- 使用Messenger的方式
- 使用AIDL的方式
- 使用Socket的方式
-
為什么不能在子線程更新UI
-
Handler為什么能夠更新UI
-
如何保證一個線程只有一個Looper
MVP模式
模式MVP,MVC介紹
recycleview listview 的區別,性能
Android ListView與RecyclerView對比淺析
ListView的優化
ListView的優化
RecycleView的使用,原理,RecycleView優化
RecyclerView 性能優化
ListView 和 RecyclerView 復用機制區別
網絡請求緩存處理,okhttp如何處理網絡緩存的
圖片加載庫相關,bitmap如何處理大圖,如一張30M的大圖,如何預防OOM
高效加載大圖, 有效避免程序OOM
listview圖片加載錯亂的原理和解決方案
ListView異步加載圖片亂序問題,原因分析及解決方案
圖片加載原理
圖片加載之原理分析
Android圖片加載機制及其優化
模塊化實現(好處,原因)
模塊化實現
熱修復,插件化
-
OkHttp源碼?
-
Glide源碼?
RxJava的作用,與平時使用的異步操作來比,優勢
響應式編程框架,響應式編程是一種通過異步和數據流來構建事務關系的編程模型
為什么使用RxJava
RxJava簡介及其源碼解讀?
源碼分析
RxJava的作用,優缺點
TCP的三次握手四次揮手全流程(畫了每次握手揮手時候的報文內容與控制位設定)
三次握手四次揮手過程
-
Volley的源代碼
http中緩存機制,Last-Modify的作用
徹底弄懂HTTP緩存機制及原理
-
EventBus實現原理
Android相關優化(如內存優化、網絡優化、布局優化、電量優化、業務優化)
內存優化
網絡優化
布局優化
電量優化
業務優化
handler發消息給子線程,looper怎么啟動
Handler之從主線程往子線程發消息
OOM,內存泄漏
內存泄漏
activity棧
Activity調用棧分析
封裝view的時候怎么知道view的大小
view渲染
View 渲染流程
Window、DecorView、ViewRootImp的關系
Measure、Layout、Draw
Bitmap 使用時候注意什么?
Bitmap 使用時候注意
OOM 是否可以try catch ?
oom是否可以try catch
ANR 如何產生?
ANR的產生和解決辦法
Jni 用過么?
CMake的編譯使用
native 通過JNI調用java的屬性跟方法
Glide 使用什么緩存,內存緩存如何控制大小?
從源碼的角度理解Glide的執行流程
Glide中的緩存
如何實現Fragment的滑動
如何實現Fragment的滑動?
ViewPager使用細節,如何設置成每次只初始化當前的Fragment,其他的不初始化
Fragment 懶加載
Fragment 懶加載1
ListView重用的是什么
ListView 和 RecyclerView 復用機制區別
RxJava、EventBus底層原理
如何自我實現一個網絡請求框架
-
Retrofit原理?為何用代理?代理的作用是什么?
-
ButterKnife原理?用到反射嗎?為什么?
-
Hotfix 原理
ANR異常如何查找并分析?
Android ANR分析詳解
Git工作流
分支開發工作流
build.gradle 腳本依賴和打包配置(替換資源)
組件化開發 context arouter
三次握手 四次揮手
三次握手四次揮手過程
svg path 大小長度限制
-
invalidate() postInvalidate() 全局刷新 局部刷新
invalidate
二次采樣,不壓縮圖片,實現
Android圖片壓縮(二次采樣)
SurfaceView View 區別
Android中的SurfaceView詳解
lrucache linkHashMap
LruCache帶你徹底解析Android緩存機制
動態權限適配方案,權限組的概念
Android 動態權限適配方案總結
Binder機制介紹
android中的Binder機制
權限管理系統(底層的權限是如何進行 grant 的)
權限管理系統
系統啟動流程 Zygote進程 –> SystemServer進程 –> 各種系統服務 –> 應用進程
MVP模式
MVP設計模式
怎么啟動service,service和activity怎么進行數據交互
Activity與Service的交互方式
Android系統為什么會設計ContentProvider,進程共享和線程安全問題
Android系統為什么會設計ContentProvider
是否熟悉Android jni開發,jni如何調用java層代碼
Java與Native相互調用
計算一個view的嵌套層級
計算一個ViewGroup的嵌套層級
項目組件化的理解
下拉狀態欄是不是影響activity的生命周期,如果在onStop的時候做了網絡請求,
onResume的時候怎么恢復
用到的一些開源框架,介紹一個看過源碼的,內部實現過程。
App啟動崩潰異常捕捉
App啟動崩潰異常捕捉
Android進程分類
Android進程分類
用IDE如何分析內存泄漏?
如何處理內存泄漏。也提到了簡歷中20000*20000大小的圖片如何加載的
大尺寸圖片加載問題
App中喚醒其他進程的實現方式
App中喚醒其他進程的實現方式
AndroidManifest的作用與理解
- 為應用的 Java 軟件包命名。軟件包名稱充當應用的唯一標識符。
- 描述應用的各個組件,包括構成應用的 Activity、服務、廣播接收器和內容提供程序。它還為實現每個組件的類命名并發布其功能,例如它們可以處理的 Intent 消息。這些聲明向 Android 系統告知有關組件以及可以啟動這些組件的條件的信息。
- 確定托管應用組件的進程。
- 聲明應用必須具備哪些權限才能訪問 API 中受保護的部分并與其他應用交互。還聲明其他應用與該應用組件交互所需具備的權限
- 列出 Instrumentation類,這些類可在應用運行時提供分析和其他信息。這些聲明只會在應用處于開發階段時出現在清單中,在應用發布之前將移除。
- 聲明應用所需的最低 Android API 級別
- 列出應用必須鏈接到的庫
AndroidManifest--你真的理解了嗎?
EventBus作用,實現方式,代替EventBus的方式
Android中開啟攝像頭的主要步驟
String 為什么要設計成不可變的?
為什么String要設計成不可變的?
序列化的作用,以及 Android 兩種序列化的區別。
Android 序列化 & 反序列化
進程間通信的機制
AIDL機制
AsyncTask機制
AsyncTask機制原理分析
AsyncTask機制原理分析1
AsyncTask機制原理分析2
如何取消AsyncTask
取消AsyncTask
Android為什么引入Parcelable
Android為什么引入Parcelable
有沒有嘗試簡化Parcelable的使用
簡化Parcelable的使用
應用安裝過程
APK安裝核心步驟為:
從AndroidManifest中解析出應用信息、各組件信息、權限信息
為應用程序分配UID,并讓PMS記錄個組件信息,AMS啟動四大組件時,需要這些信息
更新應用程序權限信息,授權應用程序資源訪問權
AlertDialog,popupWindow,Activity區別
Activity 上有 Dialog 的時候按 home 鍵時的生命周期
Application 和 Activity 的 context 對象的區別
性能優化,怎么保證應用啟動不卡頓
用過React Native沒。(自己用過Ionic,但是面試官沒聽過,Ionic在2015年相對較火)
平時如何自我學習,2017 Google I/O大會討論內容有哪些
MVP框架,如何用,怎么用。怎么解耦。跟MVC的差別
問專業方向(GIS),問如何處理地理圍欄
如何省電又能實時跟服務器端交互(我說的是AlarmManager+Service),一直傳輸位置信息給服務器。用了什么協議
由上面的扯到OkHttp底層原理
Binder相關?
觸摸事件的分發?
點擊事件被攔截,但是相傳到下面的view,如何操作?
Android事件分發機制
翻轉一個單項鏈表
合并多個單有序鏈表(假設都是遞增的)
Android中數據存儲方式
Android中進程內存的分配,能不能自己分配定額內存
微信主頁面的實現方式
微信上消息小紅點的原理
項目的并發度多大,如何處理crash后的信息回傳
兩個不重復的數組集合中,求共同的元素。
上一問擴展,海量數據,內存中放不下,怎么求出。
如何對APP進行內存優化
涉及到OpenGL的項目。以及OpenGL3.0與2.0的差別
View與SurfaceView
OpenGL、GLSurfaceView和Shader,主要聊了OpenGL繪制方法
JNI/NDK開發如何使用,如何定義java文件與cpp文件中的方法(主要看是不是真的用過吧)
涉及到自己項目中用到的優化方案與策略,尤其針對圖片的
看到用過GreenDao,問有沒有在一個事務中提交兩種不同的操作
MVP框架,混合開發相關
ANR異常發生條件
5s內沒有響應用戶輸入事件
2)10s內廣播接收器沒有處理完畢
3)20s內服務沒有處理完畢
如何分析ANR
log+trace.txt
內存優化如何做?
自定義View和ViewGroup
說一下自己定義的組件就行
事件處理
分發,攔截,處理。只是View沒有攔截處理
動畫
View動畫,屬性動畫,幀動畫。再說下View和屬性動畫區別。
參考:https://developer.android.com/guide/topics/graphics/overview.html
Dalvik和Art區別?(Just In Time和Ahead Of Time)
會對代碼進行review嗎?何時review?怎么review?
項目中遇到的讓你棘手的問題?多久解決,怎么解決?(考的是你發現問題和解決問題的能力)
如何學習?何時學習?怎么學習?學習渠道?(考的是學習能力)
Android一些優化方案
什么是過渡繪制,如何防止過渡繪制
事件分發機制
ListView的優化
Binder機制
在多進程中,Application會啟動幾次
單例模式,雙鎖原理,volatile原理,靜態內部類實現單例的原理。
網絡的五層模型,又問了TCP和UDP,還有Android相關的長連接
事件分發機制
Binder實現機制,Stub類中asInterface函數作用,BnBinder和BpBinder區別。
gradle中buildToolsVersion和TargetSdkVersion的區別是什么
手機適配一些方案
Java基礎知識。線程,java虛擬機,內存模型等。
Android基礎知識。官方API,常用控件源碼,自定義控件,動畫,性能分析等。
app層面:第三方開源框架(okHttp,Retrofit,ButterKnife),熱修復技術(Andfix,Robust,Tinker等),崩潰處理,日志處理,內存溢出內存泄漏定位等。
網絡基礎:TCP/IP,Http/Https,UDP,七層網絡協議等等。
Android是如何進行資源管理的單例,快排,回型打印二維數組
Acticity啟動模式有幾種,分別代表什么意思
Binder機制,從java到framework再到kenral層,面試官問的都很詳細,遇到不會的也都會跟我解釋
Serializable和Parcelable的區別。
View的繪制流程,詳細到framework代碼,討論到不確定的地方,立馬打開電腦和我一起看源碼。
事件分發機制。
常用設計模式,使用靜態內部類實現單例的原理是什么。
線程同步,CopyOnWriteArrayList怎樣實現。
Volley源碼
下拉listview的實現,需要注意的地方和優化的地方(不是lsitview的優化,是下拉的優化)
Android上一些優化方案
聊項目,GLSufaceView,OpengGL,Shader相關一些知識,在項目中做的優化
gc是根據什么來回收一個對象的,引用計數和gc root分別怎么實現。
怎樣會產生內存泄露,舉一個具體的例子,使用什么檢查內存泄露
自定義View的繪制流程
給出二叉樹和一個值,找出所有和為這個值的路徑;{1,3}{3,6}{3,4}{6,8}區間去重,最少去掉幾個集 合,可以讓這個集合沒有交集
什么是ANR,Activity、BroadcastReceiver、Service對ANR時間限制分別是多少,怎么處理ANR,除了系統生成trace.txt文件,怎么在程序中檢測ANR。寫出偽代碼。
編解碼一些知識,I幀,B幀,P幀區別。
Android一些優化方案。
算法 n/m,怎么判斷得數是無限循環小數。
事件分發機制。
算法,將一個字符串轉換成int型數字,考慮 錯誤輸入,溢出,正負值等一些條件,考細心。
給出一個搜索二叉樹,輸出一個排序好的雙向鏈表
類的加載過程,Person person = new Person();為例進行說明。
JVM相關知識,GC機制。
類的加載器,雙親機制,Android的類加載器。
Android中進程的級別,以及各自的區別。
插件化原理。
集合框架,list,map,set都有哪些具體的實現類,區別都是什么。
concurrentHashmap原理,原子類。
volatile原理。
Binder機制。
View的繪制流程,事件傳遞機制,Handler異步消息機制。
Interger中的128(-128~127),這里考的是常量池的概念,這個沒回答上來。
線程池的相關知識。
Handler機制,HandlerThread實現等等。
LRUCache算法是怎樣實現的。
內存泄露,怎樣查找,怎么產生的內存泄露。
怎樣計算一張圖片的大小,加載bitmap過程(怎樣保證不產生內存溢出),二級緩存,LRUCache算法。
簡單介紹一下java中的泛型,泛型擦除以及相關的概念。
Android優化相關的只是,布局優化、內存優化等等。
SQL相關的知識優化的方案,這里我直接說不太了解,就過了。
算法題,m * n的矩陣,能形成幾個正方形(2 * 2能形成1個正方形,2 * 3 2個,3 * 3 6個)
Android優化.。
插件化相關技術,熱修補技術是怎樣實現的,和插件化有什么區別。
GLSurfaceView的相關知識,OpenGL,Shader,繪制流程。
多進程間的通訊,Binder機制。
詢問看過哪些框架源碼,EventBus,Volley講了一下
Android一些源碼的閱讀
優秀的第三方框架源碼閱讀
廣度:比較新的技術(Rxjava,插件化等),JVM,GC,網絡,數據庫,Android(一般不會詢問之前面試官問過的問題)。
深度:一般會通過1或2個問題來考察,例如:map接口下都有什么子類->hashmap和hashtable區別->hashmap實現原理->怎么解決hash沖突->是否了解concurrentHashmap->concurrentHashmap實現原理->volatile實現原理(concurrentHashmap讀是不加鎖的,使用到了volatile)
Android基礎
View的繪制流程;自定義View如何考慮機型適配;自定義View的事件分發機制;View和ViewGroup分別有哪些事件分發相關的回調方法;自定義View如何提供獲取View屬性的接口;
Art和Dalvik對比;虛擬機原理,如何自己設計一個虛擬機(內存管理,類加載,雙親委派);JVM內存模型及類加載機制;內存對象的循環引用及避免
內存回收機制與GC算法(各種算法的優缺點以及應用場景);GC原理時機以及GC對象;內存泄露場景及解決方法;OOM的避免及解決方法
四大組件及生命周期;ContentProvider的權限管理(讀寫分離,權限控制-精確到表級,URL控制);Activity的四種啟動模式對比;Activity狀態保存于恢復
Fragment生命周期;Fragment狀態保存
startActivityForResult是哪個類的方法,在什么情況下使用,如果在Adapter中使用應該如何解耦
AsyncTask原理及不足;IntentService原理
AstncTask+HttpClient與AsyncHttpClient有什么區別
如何保證一個后臺服務不被殺死;比較省電的方式是什么
如何通過廣播攔截和abort一條短信;廣播是否可以請求網絡;廣播引起anr的時間限制
進程間通信,AIDL
Handler機制及底層實現
Binder機制及底層實現
ApplicationContext和ActivityContext的區別
一張Bitmap所占內存以及內存占用的計算
對于應用更新這塊是如何做的?(灰度,強制更新,分區域更新)
混合開發,RN,weex,H5,小程序(做Android的了解一些前端js等還是很有好處的)
說一款你認為當前比較火的應用并設計(直播APP)
動態權限適配方案,權限組的概念
網絡請求緩存處理,okhttp如何處理網絡緩存的
圖片加載庫相關,bitmap如何處理大圖,如一張30M的大圖,如何預防OOM
Rtmp 協議
rtmp
Android一些優化方案
什么是過渡繪制,如何防止過渡繪制
事件分發機制
ListView的優化
Binder機制
在多進程中,Application會啟動幾次
單例模式,雙鎖原理,volatile原理,靜態內部類實現單例的原理。
Java多線程,synchronized
聊項目,都具體做了什么。
Binder機制
volley的源代碼,在圖片緩存部分討論了挺長時間,http中緩存機制,Last-Modify的作用等。
fragment的生命周期
service一些知識
事件分發機制
Binder實現機制,Stub類中asInterface函數作用,BnBinder和BpBinder區別。
gradle中buildToolsVersion和TargetSdkVersion的區別是什么
手機適配一些方案
hashmap的實現原理
靜態方法是否能被重寫
3次握手和4次揮手的原因,以及為什么需要這樣做。
數據結構,搜索二叉樹的一些特性,平衡二叉樹。
hashmap是如何解決hash沖突的
進程與線程區別
寫了一個二分查找和單例模式
http中的同步和異步
聊了一些項目上做的東西,問了問職業規劃
我認為Android做的優秀的幾個地方,然后又根據我說的問了問比較深入問題。
Android是如何進行資源管理的。
java比較重要的幾個特性
網絡五層結構,每一層協議,由于我網絡不是很好,還問了一些其他的問題(例如MAC地址和ip地址的區別等)。
為什么離開原來公司,以及職業規劃,然后因為面試完大概就晚上8點了,就先讓我回去,下周讓hr跟我聯系,我想這是應該通過面試了吧。
單例,快排,回型打印二維數組
寫一個死鎖,死鎖是怎樣產生的,怎樣防止死鎖
Acticity啟動模式有幾種,分別代表什么意思
聊項目都做了些什么
字符串反轉,討論復雜度。
聊經歷和項目
給定一個int型 n,輸出1~n的字符串例如 n = 4 輸出“1 2 3 4”
輸出所有的笛卡爾積組合
單例模式
最長上升子序列
對剛才做的題,一些錯的地方做了討論,主要是類的加載和內部類方面的知識,尤其一些深入到JVM層的知識的確自己有一些不足,不過大部分都還是能答出來。
雙親委托機制,類的五個加載過程。
java類加載器的加載流程。
Binder機制,從java到framework再到kenral層,面試官問的都很詳細,遇到不會的也都會跟我解釋。
Serializable和Parcelable的區別。
View的繪制流程,詳細到framework代碼,討論到不確定的地方,立馬打開電腦和我一起看源碼。
事件分發機制。
常用設計模式,使用靜態內部類實現單例的原理是什么。
線程同步,CopyOnWriteArrayList怎樣實現。
Volley源碼,EventBus源碼。
項目介紹,聊一些項目上的問題
下拉listview的實現,需要注意的地方和優化的地方(不是lsitview的優化,是下拉的優化)。
Android上一些優化方案
介紹了一下現在做的項目,大體說明了現在所用到的技術。
聊項目,GLSufaceView,OpengGL,Shader相關一些知識,在項目中做的優化
gc是根據什么來回收一個對象的,引用計數和gc root分別怎么實現。
怎樣會產生內存泄露,舉一個具體的例子,使用什么檢查內存泄露
自定義View的繪制流程
給出二叉樹和一個值,找出所有和為這個值的路徑;{1,3}{3,6}{3,4}{6,8}區間去重,最少去掉幾個集合,可以讓這個集合沒有交集。
什么是ANR,Activity、BroadcastReceiver、Service對ANR時間限制分別是多少,怎么處理ANR,除了系統生成trace.txt文件,怎么在程序中檢測ANR。寫出偽代碼。
編解碼一些知識,I幀,B幀,P幀區別。
Android一些優化方案。
算法 n/m,怎么判斷得數是無限循環小數。
類的加載過程,Person person = new Person();為例進行說明。
JVM相關知識,GC機制。
類的加載器,雙親機制,Android的類加載器。
Android中進程的級別,以及各自的區別。
插件化原理。
集合框架,list,map,set都有哪些具體的實現類,區別都是什么。
concurrentHashmap原理,原子類。
volatile原理。
Binder機制。
View的繪制流程,事件傳遞機制,Handler異步消息機制。
Interger中的128(-128~127),這里考的是常量池的概念,這個沒回答上來。
線程池的相關知識。
Handler機制,HandlerThread實現等等。
LRUCache算法是怎樣實現的。
說了說項目中相關的知識。
聊了聊之前做過的項目。
內存泄露,怎樣查找,怎么產生的內存泄露。
怎樣計算一張圖片的大小,加載bitmap過程(怎樣保證不產生內存溢出),二級緩存,LRUCache算法。
簡單介紹一下java中的泛型,泛型擦除以及相關的概念。
Android優化相關的只是,布局優化、內存優化等等。
SQL相關的知識優化的方案,這里我直接說不太了解,就過了。
算法題,m * n的矩陣,能形成幾個正方形(2 * 2能形成1個正方形,2 * 3 2個,3 * 3 6個)
項目相關。
Android優化.。
插件化相關技術,熱修補技術是怎樣實現的,和插件化有什么區別。
詢問了我博客上寫的一些東西,從項目立意談起,到設計,再到詳細的技術實現,可謂是面面俱到,由于自己寫的博客還是比較熟悉,回答的還不錯。
GLSurfaceView的相關知識,OpenGL,Shader,繪制流程。
詢問當前做的項目,以及到具體的實現和優化。
多進程間的通訊,Binder機制。
詢問看過哪些框架源碼,EventBus,Volley講了一下。
hashmap實現原理
自定義view流程
事件機制
activity生命周期
handler機制
鏈表加法 例如 1->2->3 + 4->5->6->7 = 4->6->9->0
設計題
view繪制流程
事件機制
activity生命周期
service兩種啟動方式,如果多次綁定,會有什么結果
binder機制
volley框架
查找兩個鏈表的共同節點
Rxjava、Retrofit、okhttp相關的,這些我了解的不是很深。
apk是打包過程,資源文件生成id的規則,xml文件打包后放在哪里?
聊了聊之前做的項目
Android中的引用以及使用場景
Volley框架,okHttp
數組實現隊列,快排
fragment生命周期
集合相關的知識,List,Set,Map具體的實現類,以及相應的區別,ConcurrentHashMap實現原理。
多線程知識,例如,volatile原理
內部類和靜態內部類的區別,以及使用場景。
一道關于多線程的設計題,下載一本書的章節1.下載一個list列表。2.從列表中并行下載相應的內容。3.顯示下載后的章節。要求:并行下載、章節有順序,需要盡早顯示出來,出現異常錯誤立馬停止下載。
自我介紹,大體聊了以下項目中做的東西。
Top K度算法題,給定一個數組,求前n個最大的數,堆排序。 3. 判斷一個view的父類或者父父類是否為listview
listivew的優化,使用復用機制,最多需要創建多少個view。 5. activity的啟動模式。
如何計算Bitmap在內存中的大小?
serizalable和parcelable的區別
volley源碼,HTTP緩存機制。
自我介紹
實現map接口的幾個類,以及各自的特點和區別。
ConcurrentHashMap實現原理,Volatile原理。
快排
Binder機制
單例模式實現方式,靜態內部類實現單例的原理,內部類和靜態內部類的區別等 7. 插件化一些問題
自我介紹,聊了聊項目。
繪制OpenGL過程,Shader語言,GLSurfaceView等,說了說在渲染視頻的時候做的優化。
JVM相關知識。
又說了一遍Binder機制。
Android中一些優化方案。
插件化原理,主要是DL和 360 DroidPlugin的區別,因為我只看了DL源碼,對DroidPlugin了解的不深,就大體聊了下DL實現的過程。
自我介紹,項目介紹了一下。
GC原理
插件化
職業發展
Android基礎知識
Java基礎知識,大概是多線程,線程安全,集合類,JVM,類相關知識等。
Android一些源碼的閱讀
優秀的第三方框架源碼閱讀
廣度:比較新的技術(Rxjava,插件化等),JVM,GC,網絡,數據庫,Android(一般不會詢問之前面試官問過的問題)。
深度:一般會通過1或2個問題來考察,例如:map接口下都有什么子類->hashmap和hashtable區別->hashmap實現原理->怎么解決hash沖突->是否了解concurrentHashmap->concurrentHashmap實現原理->volatile實現原理(concurrentHashmap讀是不加鎖的,使用到了volatile)
對MVC和MVP的理解
Android中的MVC與MVP
Handler的內存泄漏問題具體是什么,解決方案知道有什么,空數據的時候Handler的阻塞問題。
Handler導致的內存泄漏
http的長連接和短連接這兩個概念
http 長連接和短連接介紹
HashMap、ConcurrentHashMap、Hashtable的問題,數據結構,線程安全啊之類的問題了,當然還是考了version 1.7和1.8。
HaskMap
哈希表如何處理沖突
解決哈希沖突的方法
動態代理原理
代理模式(動態代理)及其原理分析
保活機制
Android保活實現方案梳理
AMS
AMS
hook
Hook機制之動態代理
Android 如何開啟多進程?應用是否可以開啟N個進程?
開啟多進程
設計模式
JsBridge 原理
組件化
Android徹底組件化方案實踐
ARouter之基本使用(一)
可能是最詳細的ARouter源碼分析
static static {} 誰先執行
1.靜態成員變量
特點:
1.隨著類的加載,會在方法區的靜態區開辟內存空間,初始化數據
2.可以通過類名直接訪問,格式:類名.靜態成員變量
3.一般用于存儲所有類的共享數據
2.靜態成員方法
特點:
1.靜態方法中只能訪問靜態成員變量(不能使用this引用)
2.非靜態方法中可以訪問靜態成員(都能訪問),在非靜態方法中可以訪問靜態方法
非靜態方法中即可以使用靜態成員,也可以使用非靜態成員
3.靜態成員變量與非靜態成員的區別
1.生命周期
靜態成員變量是隨著類的加載在方法區的靜態區中初始化,在程序結束時而消失
成員變量是隨著對象的初始化在堆中創建與初始化,在對象被垃圾回收時,而消失
2.存儲的特點
靜態成員變量是所有對象共享存儲數據
成員變量是某一對象存儲的數據
3.訪問方式
靜態成員變量可以通過類名直接訪問,也可以通過對象訪問
成員變量只能通過對象來訪問
對象初始化過程
1.加載類的字節碼文件到jvm的方法區中
2.為靜態成員變量在靜態區開辟內存空間,并初始化默認值
3.加載靜態代碼塊,初始化靜態成員變量
4.在堆中開辟空間(根據成員變量的大小),并默認初始化成員變量
5.加載構造代碼塊,顯式初始化成員變量
6.加載構造方法,顯式初始化成員變量
7.將堆內存空間的首地址賦給對象的引用
hashmap 初始大小
android整理之HashMap
probuf 為什么傳輸數據快
Android Protobuf應用及原理
Google出品的Protocol Buffer
紅黑二叉樹
如何查找鏈表倒數第n個節點
lock 與 synchronzid 區別
ReentrantLock 顯示的獲得、釋放鎖,synchronized 隱式獲得釋放鎖
ReentrantLock 可響應中斷、可輪回,synchronized 是不可以響應中斷的,為處理鎖的
不可用性提供了更高的靈活性
ReentrantLock 是 API 級別的,synchronized 是 JVM 級別的
ReentrantLock 可以實現公平鎖
ReentrantLock 通過 Condition 可以綁定多個條件
底層實現不一樣, synchronized 是同步阻塞,使用的是悲觀并發策略,lock 是同步非阻
塞,采用的是樂觀并發策略
Lock 是一個接口,而 synchronized 是 Java 中的關鍵字,synchronized 是內置的語言
實現。
synchronized 在發生異常時,會自動釋放線程占有的鎖,因此不會導致死鎖現象發生;
而 Lock 在發生異常時,如果沒有主動通過 unLock()去釋放鎖,則很可能造成死鎖現象,
因此使用 Lock 時需要在 finally 塊中釋放鎖。
Lock 可以讓等待鎖的線程響應中斷,而 synchronized 卻不行,使用 synchronized 時,
等待的線程會一直等待下去,不能夠響應中斷。
通過 Lock 可以知道有沒有成功獲取鎖,而 synchronized 卻無法辦到。
Lock 可以提高多個線程進行讀操作的效率,既就是實現讀寫鎖等。
eventbus 源碼xxx
netty 機制
Netty的理解和使用
Netty在Android中使用
gradle 如何運行
常量池
深入淺出java常量池
View 渲染
ViewGroup 子view 交叉繪制
getMeasureWidth getWidth
源碼解析通過getWidth() 與 getMeasuredWidth()獲取寬高的區別
onResume 能不能拿到width height
onCreate() 和 onResume() 獲取不到 View 的寬高
onResume() 中如何獲取 View 寬高
自定義view view draw() 主要做什么
handler postDelayMessage 原理
Handler postDelayed的原理
補間動畫和屬性動畫區別 原理(屬性改變)
談談屬性動畫和補間動畫的原理及區別
invalide 一定會重新繪制嗎?
為什么有時候不會回調onDraw
組件化
相機預覽數據格式
Android下攝像頭預覽數據只能 ImageFormat.NV21 格式
jpg png 區別原理
gif、jpg、png、webp圖片格式比較
LinkedBlockingQueue(兩個獨立鎖提高并發)
blockingqueue (如果數據放入過快)
生產者消費者問題
字節跳動:
多指觸控
多點觸控最佳實踐
surfaceview
SurfaceView
seekto 優化
seekTo不準確的解決方案
視頻編碼之I幀 、P幀、B幀
視頻編碼之I幀 、P幀、B幀
Mediaplayer
MediaPlayer狀態機
IjkMediaPlayer
ijkplayer 音視頻同步流程分析
rtmp m3u8協議
RTMP、HTTP-FLV、HLS
glide 源碼
ArrayMap 源碼
ArrayMap
深入剖析 Android中的 ArrayMap
messagequeue 原理
深入理解 MessageQueue
兩個棧如何實現隊列
網易:
布局優化
約束布局優點
- 減少View樹的嵌套,從而減少了onMeasure和onLayout,使性能更加高效
- 約束的方式來指定各個控件的位置和關系的,它有點類似于RelativeLayout,但遠比RelativeLayout要更強大。
可以在子線程跳轉activity嗎
在子線程中是不可以進行UI操作更新,但同時不要誤以為不可以進行startActivity() ,進行界面跳轉。startActivity(Intent) 的底層實現是將 intent分解成任務,傳遞到mainLooper 輪詢的隊列中,最終由主線程執行。所以跟由哪個線程調用一點關系都沒有的。
可以在子線程inflater嗎
AsyncLayoutInflater官方提供了一個類,可以來進行異步的inflate
從一個內部類的實例拿到所在外部類的實例
this$0
synchronzid 用于方法,靜態方法,鎖的是什么,如何使用
synchronzid
pathclassloader
如何在application oncreate打斷點(開發者平臺)