1、Android的系統架構分為幾層,大概有哪些內容?
應用層:Acyivity、Application、Service.
Binder通信層:Binder Proxy、Binder Driver
系統服務層:WindowManagerService、ActivityManagerService
運行時層:Davlik Runtime/ART Runtime
硬件抽象層:Camera HAL, Audio Hal
Linux內核層:Camera Driver,Audio Driver
2、Android中Intent傳遞數據的大小限制?如何解決該問題?
大小限制大約是1MB:超過該限制可能導致 OOM。
解決辦法
進程內:EventBus、文件緩存
進程間:通過ContentProvider進行進程間數據共享和傳遞。
總結: 不要通過 Intent 在 Android 基礎組件之間傳遞大數據(binder transaction 緩存為1MB)
3、APK的打包流程分為幾部分?
資源打包,代碼打包
4、APK打包流程(6步)
APPT工具對資源文件進行打包(AndroidManifest.xml、布局等)生成R.java文件; 通過AIDL工具處理AIDL文件,生成對應的Java文件。
Javac工具對R.java、項目源碼、aidl對應的Java文件這三部分進行編譯,生成class文件
Dex工具將所有class文件轉換為DEX文件:該過程進行將Java字節碼轉換為Dalvik字節碼、壓縮常量池、清除冗余信息等工作。
ApkBuilder工具將資源文件、Dex文件打包成APK文件
KeyStore對APK文件進行簽名。
正式版APK,需要用ZipAlign工具進行對齊處理:過程中是將APK中所有資源文件的起始地址都便宜4字節的整數倍,通過內存映射訪問APK文件的速度會更快
5、APK的安裝流程(6步)
復制APK到/data/app目錄下,解壓並掃描安裝包。
資源管理器解析APK里的資源文件。
解析AndroidManifest文件,並在/data/data/目錄下創建對應的應用數據目錄
對dex文件進行優化,並且保存在dalvik-cache目錄下。
將AndroidManifest文件解析出的四大組件信息注冊到PackageManagerService中。
安裝完成后,發送廣播
6、點擊應用圖標是如何啟動APP的?
點擊應用圖標后會去啟動應用的LauncherActivity
如果LauncherActivity所在進程沒有創建,就會創建新進程(以Socket形式通知Zygote進程去fork新進程)。
整體的流程就是Activity的啟動流程。
7、PathClassLoader和DexClassLoader的區別
PathClassLoader: 只能加載安裝到Android系統的APK,即/data/data目錄,是Android默認的類加載器。
DexClassLoader: 可以加載任意目錄下的dex、jar、apk、zip文件。
7、Android有哪些Context的相關類?
Context抽象類
ContextImpl:Context的實現類
ContextWrapper:Context的包裝類(內部是ContextImpl),Applicaiton、Activity、Service都間接或者直接繼承自ContextWrapper
8、Android有哪些進程
前台進程: 用戶當前操作所必須的進程
可見進程:沒有任何前台組件,但是任輝影響屏幕上可見內容的進程。
服務進程:正在運行服務(該服務通過startService()啟動),且不屬於上面兩者的進程。
后台進程:包含目前對用戶不可兼得Activity的進程。
空進程:不包含任何活動組件的進程。
9、前台進程需要滿足的條件(下列條件的任意一個)
具有可交互的Activity—該Activity已經調用onResume()
通過bindService啟動的Service,並且綁定的Activity處於可交互狀態。此時Service的進程就是前台進程。
明確調用了前台Service(Service執行了startForeground()方法)—高版本的Service都必須要調用startForeground,不然很容易被殺死。
正在執行某一生命周期的Service(onCreate、onStart、onDestory)
正在執行onReceive()的BroadcastReceiver處於前台進程。(onReceive()是在UI線程執行的,即使用戶在Home首頁,此時廣播接受器接收到廣播就會處於前台進程。)
10、可見進程需要滿足的條件(任意一條即可)
具有不在前台,但是任然可見的Activity
綁定到可見或者前台Activity
的Service
11、服務進程的作用
- 不影響用戶交互的內容。
- 但是執行比較重要的任務,比如
下載
12、空進程的作用
用於緩存
,能縮短下一次打開組件的時間。
13、如何進行進程保活
- 提升進程優先級,降低進程被殺死的概率。
- 拉活已經被殺死的進程。
14、如何提升優先級?
監控手機鎖屏事件
鎖屏
是啟動一個像素的Activity,在用戶解鎖的時候,將Activity銷毀掉,前台Activity會將進程變成前台進程,且優先級最高
15、如何拉活已經殺死的進程
利用廣播拉活Activity
- 手機去監聽
系統廣播
:如開機廣播,鎖屏解鎖廣播等。
16、什么是序列化
序列化
就是將對象
轉化為二進制流
,便於存儲和傳輸
17、Serializable和Parcelable的區別(復雜類型的數據傳遞)
Serilizable是java實現的一套序列化方法,會觸發頻繁的IO操作,效率較低,適合將對象存儲到磁盤上的情況。把需要傳遞的類實現serilizable接口
Parcelable是Android提供的序列化方法。把需要傳遞的類實現parcelable接口,Parcelable將序列化后的字節流寫入到一個共享內存中,其他對象可以從該共享內存中讀出字節流,並反序列化成對象,效率較高,適合對象間和進程間傳遞信息。
18、64k問題的產生原因和如何解決?
- 產生原因:
Dex文件
中class、method的索引使用short類型
,因此如果方法、類的總數超過了2字節的short-65535
就會出問題。 - 解決辦法:使用
Google的Multidex