面試知識彙總(三)-- Android知識相關

目錄

Framework

1. Android 系統啓動過程: 

2. Android 系統架構: 應用層、Framework、系統運行庫層(Android Runtime)、硬件抽象層(Hal),、Linux內核層

3. 應用安裝

4. App啓動流程,從點擊桌面開始

5. 進程保活的方式,如何保證一個後臺服務不被殺死?比較省電的方式是什麼?App中喚醒其他進程的實現方式?

6. Activity, View, Window,  Surface, SurfaceView,  DecorView, ViewRoot

7. IPC

8. 虛擬機相關

9.  android中UID和PID的作用及區別

10. android系統的低電耗模式(Doze模式)是怎麼工作的

11. android最近幾個版本的系統差異或特性

12. NDK

13. JNI

14. Android進程分類?進程和 Application 的生命週期?進程調度

15.談談對進程共享和線程安全的認識

 

 

App部分

1. 自定義view的過程,ViewGroup和View有什麼不一樣

2. RecyclerView和ListView的性能對比

3. 四大組件,原理

3.1 Service生命週期, startService和BindService

3.2 ContentProvider

3.3 BroadcastReceiver

4. Activity和Fragment的生命週期,各生命狀態發生在什麼情況下; Fragment和Activity的通信方式

5. Activity的四種launcherMode

6. Context

7. 事件分發

8. 動畫的幾種類型: 

9. Android數據存儲方式

10. 線程切換的方式

11. View刷新機制,繪製流程

12. 談談對多進程開發的理解以及多進程應用場景



Framework

1. Android 系統啓動過程: 

https://zhuanlan.zhihu.com/p/80806364  關於Android系統啓動,你需要知道這些步驟

https://blog.51cto.com/ticktick/1659473  Android內核開發:圖解Android系統的啓動過程

https://www.lagou.com/lgeduarticle/82941.html Android 系統啓動流程

https://www.jianshu.com/p/e084414c7e1c  Android系統啓動(一)-開篇

(1)Bootloader引導

(2)Linux kernel啓動,尋找init.rc文件

(3)init進程啓動: 

init 進程是所有用戶進程的鼻祖

創建一些文件夾並掛載設備; 初始化和啓動屬性服務;解析init.rc和其他服務的rc文件(每個服務一個rc文件, 包括native服務), 啓動對應的系統級進程,包括Zygote

(4)Zygote啓動:通過JNI方式調用ZygoteInit.main()進入java世界, fork System Server進程, System Server進程啓動所以的Android核心服務, 接着通過ActivityManagerService啓動Home

(5)launcher啓動

2. Android 系統架構: 應用層、Framework、系統運行庫層(Android Runtime)、硬件抽象層(Hal),、Linux內核層

3. 應用安裝

     (1)具體說清一個應用程序安裝到手機上時發生了什麼

     (2)應用安裝的幾種方式:system/priv-app, data/app , 預裝應用,應用市場應用,adb install的應用

     (3)packageManagerService的啓動過程

4. App啓動流程,從點擊桌面開始

5. 進程保活的方式,如何保證一個後臺服務不被殺死?比較省電的方式是什麼?App中喚醒其他進程的實現方式?

Android進程保活終極方案總結 https://blog.csdn.net/hxl517116279/article/detail

6. Activity, View, Window,  Surface, SurfaceView,  DecorView, ViewRoot

(1)簡析Window、Activity、DecorView以及ViewRoot之間的錯綜關係  https://www.jianshu.com/p/8766babc40e0

 

 

ActivityThread.handResumeActivity() -> getDecorView() -> WindowManager.addView(DecorView, WindowManager.LayoutParams) -> ViewRoot.setView(DecorView, WindowManager.LayoutParams, ...) -> ViewRootImpl.performTraversals() -> activity.makeVisible() -> DecorView.setVisibility(Visible

(2)Android的Surface、View、SurfaceView、Window概念整理 

http://www.360doc.com/content/19/0927/10/8335678_863480139.shtml

(3)SurfaceView、GLSrurfaceView

SurfaceView繼承自View,有兩個子類:GLSurfaceView, VideoView

View和宿主Window共用一個繪圖表面surface; 而SurfaceView雖然也在View的屬性結構中,但有自己的surface, 內部持有一個Canvas;

每一個窗口在SurfaceFlinger服務中都對應有一個Layer,用來描述它的繪圖表面。對於那些具有SurfaceView的窗口來說,每一個SurfaceView在SurfaceFlinger服務中還對應有一個獨立的Layer或者LayerBuffer,用來單獨描述它的繪圖表面,以區別於它的宿主窗口的繪圖表面。

 SurfaceView是用Zorder排序的,默認在宿主Window的後面,SurfaceView通過在Window上面“挖洞”(設置透明區域)進行顯示。

View的繪圖效率不高,用於動畫變化較少的程序; SurfaceView的繪圖效率較高,用於界面更新頻繁的程序

SurfaceView的UI可以在一個獨立的線程中進行繪製,可以不佔用主線程。

SurfaceView採用雙緩衝機制: frontCanvas, backCanvas

不能進行平移,縮放等變換(對SurfaceView進行ScrollBy,ScrollTo操作沒有效果(還有透明度,旋轉)

使用SurfaceView的步驟:

首先要繼承SurfaceView,實現SurfaceHolder.Callback接口。

重寫方法:

surfaceChanged:surface大小或格式發生變化時觸發,在surfaceCreated調用後該函數至少會被調用一次。

surfaceCreated:Surface創建時觸發,一般在這個函數開啓繪圖線程(新的線程,不要再這個線程中繪製Surface)。

surfaceDestroyed:銷燬時觸發,一般不可見時就會銷燬。

利用getHolder()獲取SurfaceHolder對象,調用SurfaceHolder.addCallback添加回調

SurfaceHolder.lockCanvas 獲取Canvas對象並鎖定畫布,調用Canvas繪圖,SurfaceHolder.unlockCanvasAndPost 結束鎖定畫布,提交改變。

————————————————

版權聲明:本文爲CSDN博主「lidongxiu0714」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。

原文鏈接:https://blog.csdn.net/u010126792/article/details/86249399

7. IPC

(1)Binder機制

https://blog.51cto.com/ticktick/1659473

 

ServiceManager是什麼:https://www.cnblogs.com/monsterdev/p/12685105.html

ServiceManager是binder服務的大管家,由Init進程解析init.rc文件創建,其本身也是一個Binder服務

(2)簡述IPC, Binder和其他IPC的對比,

Intent中附加extras(Bundle): 只能在四大組件間的通信

共享文件,sharedPereference:  不支持高併發和即時通訊

Messager(基於Binder): 一對多的串行

ContentProvider(基於Binder): 數據源場景下的Binder

Socket: 網絡交換

Binder: 支持一對多併發

(3)AIDL

(4)Parcelable: 文件序列化, Serializable: 內存序列化

(5) Messenger: https://www.cnblogs.com/linghu-java/p/8798374.html

 

8. 虛擬機相關

(1)JVM、Dalvik和ART

JVM 是 java虛擬機,是實現java誇平臺的主要方式,可以使得java這樣的高級語言編譯成機器可以識別的機器語言,讓java 可以一次編譯,到處運行

Dalvik 是Android系統在上面運行的虛擬機,Dalvik虛擬機是專門爲移動設備定製的,它允許在有限的內存中同時運行多個虛擬機的實例,並且每一個Dalvik應用都是一個獨立的Linux進程。獨立的進程可以防止虛擬機崩潰的時所有進程都被關閉。

ART 是指 Android Runtime ,是安卓4.4之後推出替代DVM的,DVM中的應用每次運行時,字節碼都需要通過即時編譯器(Just In Time,JIT)轉換成機器碼,這會使應用的運行效率降低。而在ART中,系統在安裝應用時會進行一次預編譯(Ahead Of Time,AOT),將字節碼預先編譯成機器碼並存在本地,這樣應用每次運行時就不需要再執行編譯了,能大大提高運行效率。

[Android Runtime (ART)和apk的預編譯] https://blog.csdn.net/qq_25804863/article/details/48696619

(2)JVM內存區域劃分

(3)JVM內存模型

(4)談談你對雙親委派模型理解

(5)邏輯地址與物理地址,爲什麼使用邏輯地址?

(6)Android爲每個應用程序分配的內存大小是多少?Android中進程內存的分配,能不能自己分配定額內存?

9.  android中UID和PID的作用及區別

PID是各進程的身份標識,程序一運行系統就會自動分配給進程一個獨一無二的PID.進程中止後PID被系統回收,可能會被繼續分配給新運行的程序,但是在android系統中一般不會把已經kill掉的進程ID重新分配給新的進程,新產生進程的進程號,一般比產生之前所有的進程號都要大.

UID在linux中就是用戶的ID,表明是哪個用戶運行了這個程序,主要用於權限的管理.而在android 中又有所不同,因爲android爲單用戶系統,這時UID 便被賦予了新的使命,數據共享,爲了實現數據共享,android爲每個應用幾乎都分配了不同的UID,不像傳統的linux,每個用戶相同就爲之分配相同的UID.

如果讓其他的開發者知道了我們的shareUserId,那我們的數據不是暴露了?

其實我們要使不同的程序能夠相互訪問,還需要擁有相同的簽名,每個公司或者開發者的簽名是唯一的,這樣我們就不用擔心了

10. android系統的低電耗模式(Doze模式)是怎麼工作的

https://blog.csdn.net/qq_25804863/article/details/50229437

11. android最近幾個版本的系統差異或特性

https://blog.csdn.net/qq_25804863/article/details/83348760

12. NDK

請介紹一下NDK,什麼是NDK庫?

13. JNI

jni用過嗎?如何在jni中註冊native函數,有幾種註冊方式?

Java如何調用c、c++語言?

jni如何調用java層代碼?

14. Android進程分類?進程和 Application 的生命週期?進程調度

15.談談對進程共享和線程安全的認識

 

 

App部分

1. 自定義view的過程,ViewGroup和View有什麼不一樣

xml初始化和代碼初始化

onMeasure-> onLayout -> onDraw/DispatchDraw

2. RecyclerView和ListView的性能對比

3. 四大組件,原理

Activity,Service,ContendProvider(ContendResolver, ContendObserver, Binder),BroadCast

3.1 Service生命週期, startService和BindService

startService: Service會經歷onCreate->onStartCommand。stopService:  onDestroy方法。調用者如果沒有stopService,Service會一直在後臺運行,下次調用者再起來仍然可以stopService。

bindService: Service會經歷onCreate->onBind。這個時候調用者和Service綁定在一起。調用者調用unbindService方法或者調用者Context不存在了(如Activity被finish了),Service就會調用onUnbind->onDestroy。

多次調用startService,該Service只能被創建一次,即該Service的onCreate方法只會被調用一次。但是每次調用startService,onStartCommand方法都會被調用。Service的onStart方法在API 5時被廢棄,替代它的是onStartCommand方法。

第一次執行bindService時,onCreate和onBind方法會被調用,但是多次執行bindService時,onCreate和onBind方法並不會被多次調用,即並不會多次創建服務和綁定服務。

3.2 ContentProvider

(1)ContentProvider:

四大組件的內容提供者,主要用於對外提供數據。實現各個應用程序之間的(跨應用)數據共享,比如聯繫人應用中就使用了ContentProvider,你在自己的應用中可以讀取和修改聯繫人的數據,不過需要獲得相應的權限。其實它也只是一箇中間人,真正的數據源是文件或者SQLite等

一個應用實現ContentProvider來提供內容給別的應用來操作,通過ContentResolver來操作別的應用數據,當然在自己的應用中也可以

(2)ContentResolver:

內容解析者,用於獲取內容提供者提供的數據,ContentResolver.notifyChange(uri)發出消息

(3)ContentObserver:

內容監聽器,可以監聽數據的改變狀態

目的是觀察(捕捉)特定Uri引起的數據庫的變化,繼而做一些相應的處理,它類似於數據庫技術中的觸發器(Trigger),當ContentObserver所觀察的Uri發生變化時,便會觸發它。觸發器分爲表觸發器、行觸發器,相應地ContentObsever也分爲表ContentObserver、行ContentObserver,當然這是與它所監聽的Uri MIME Type有關的

ContentResolver.registerContentObserver()監聽消息

getContentResolver->ApplicationContentResolver->ContentProviderProxy<===IBidner====>Transport->NameProvider

query -> ApplicationContentResolver.acqireProvider -> ActivityThread.ActivityMnagerNative.getDefault(0.getContentProvider()  -> ActivityMnagerService.getContendProviderImpl

(4)Contendprovider, COntentResolver, ContentObserver的關係

(5)ContentProvider的權限管理

3.3 BroadcastReceiver

(1)廣播的分類和使用場景

(2)本地廣播和全局廣播有什麼差別?

(3)BroadcastReceiver,LocalBroadcastReceiver 區別

4. Activity和Fragment的生命週期,各生命狀態發生在什麼情況下; Fragment和Activity的通信方式

Activity第一次啓動:onCreate->onStart->onResume。

Activity切換到後臺( 用戶打開新的Activity或者切換到桌面) ,onPause->onStop(如果新Activity採用了透明主題,則當前Activity不會回調onstop)。

Activity從後臺到前臺,重新可見,onRestart->onStart->onResume。

用戶退出Activity,onPause->onStop->onDestroy。

onStart開始到onStop之前,Activity可見。onResume到onPause之前,Activity可以接受用戶交互。

在新Activity啓動之前,棧頂的Activity需要先onPause後,新Activity才能啓動。所以不能在onPause執行耗時操作。

onstop中也不可以太耗時,資源回收和釋放可以放在onDestroy中。

5. Activity的四種launcherMode

Standard: 每次都會新建示例;

SingleTop: 默認和啓動這一task。 如果task頂端中有該示例,則重用, 回調OnNewIntent;否則新建

以上兩種,默認和啓動者一個task,如果指定啓動模式爲NEW_TASK,則新建一個task。

SingleTask: 啓動模式啓動Activity時,首先會根據taskAffinity去尋找當前是否存在一個對應名字的任務棧

如果不存在,則會創建一個新的Task,並創建新的Activity實例入棧到新創建的Task中去

如果存在,則得到該任務棧,查找該任務棧中是否存在該Activity實例

        如果存在實例,則將它上面的Activity實例都出棧,然後回調啓動的Activity實例的onNewIntent方法

        如果不存在該實例,則新建Activity,併入棧

此外,我們可以將兩個不同App中的Activity設置爲相同的taskAffinity,這樣雖然在不同的應用中,但是Activity會被分配到同一個Task中去。

SingleInstance:  這種模式下的Activity會單獨佔用一個Task棧,具有全局唯一性,即整個系統中就這麼一個實例,由於棧內複用的特性,後續的請求均不會創建新的Activity實例,除非這個特殊的任務棧被銷燬了。

6. Context

深入理解 Android 中的各種 Context  https://www.jianshu.com/p/31dbe3317fe1

(1) Context是個抽象類, ContextWrapper是封裝Context的代理類

(2)ContextImpl繼承自Context,ContextImpl 是 Context 的主要實現類,Activity、Service 和 Application 的 Base Context 都是由它創建的

(3) ContextWrapper的子類: ContextThemeWrapper(子類:Activity), Application, Service

(4) Activity的ContextImpl是在ActivityThread的創建和attach: performLaunchActivity

 

(5)Context的作用:

四大組件的交互,包括啓動 Activity、Broadcast、Service,獲取 ContentResolver 等

獲取系統/應用資源,包括 AssetManager、PackageManager、Resources、System Service 以及 color、string、drawable 等

文件,包括獲取緩存文件夾、刪除文件、SharedPreference 相關等

數據庫(SQLite)相關,包括打開數據庫、刪除數據庫、獲取數據庫路徑等

其它輔助功能,比如設置 ComponentCallbacks,即監聽配置信息改變、內存不足等事件的發生

 

7. 事件分發

(1)DispatchTouchEvent  -> OnInterceptEvent -> onTouchEvent

(2) InputManagerService -> WindowManagerServiece -> ViewRootImpl -> DecorView( mWindow.callback.disapatchTouchEvent )-> Activity -> PhoneWindow -> DecorView -> ViewGroup/View

8. 動畫的幾種類型: 

      (1)幀動畫, 屬性動畫,補間動畫

(2)Android動畫框架實現原理

9. Android數據存儲方式

10. 線程切換的方式

AsyncTask, Handler, EventBus, RxJava, IntentService

11. View刷新機制,繪製流程

12. 談談對多進程開發的理解以及多進程應用場景
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章