目錄
2. Android 系統架構: 應用層、Framework、系統運行庫層(Android Runtime)、硬件抽象層(Hal),、Linux內核層
5. 進程保活的方式,如何保證一個後臺服務不被殺死?比較省電的方式是什麼?App中喚醒其他進程的實現方式?
6. Activity, View, Window, Surface, SurfaceView, DecorView, ViewRoot
10. android系統的低電耗模式(Doze模式)是怎麼工作的
14. Android進程分類?進程和 Application 的生命週期?進程調度
1. 自定義view的過程,ViewGroup和View有什麼不一樣
3.1 Service生命週期, startService和BindService
4. Activity和Fragment的生命週期,各生命狀態發生在什麼情況下; Fragment和Activity的通信方式
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
-
Android 如何保證service在後臺不被kill https://www.cnblogs.com/sjm19910902/p/6396499.html
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