Android開發面試題


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

綁定到可見或者前台ActivityService

 

11、服務進程的作用

  1. 不影響用戶交互的內容。
  2. 但是執行比較重要的任務,比如下載

12、空進程的作用

用於緩存,能縮短下一次打開組件的時間。

13、如何進行進程保活

  1. 提升進程優先級,降低進程被殺死的概率。
  2. 拉活已經被殺死的進程。

14、如何提升優先級?

  1. 監控手機鎖屏事件
  2. 鎖屏是啟動一個像素的Activity,在用戶解鎖的時候,將Activity銷毀掉,前台Activity會將進程變成前台進程,且優先級最高

15、如何拉活已經殺死的進程

  1. 利用廣播拉活Activity
  2. 手機去監聽系統廣播:如開機廣播,鎖屏解鎖廣播等。

16、什么是序列化

序列化就是將對象轉化為二進制流,便於存儲和傳輸

 

17、Serializable和Parcelable的區別(復雜類型的數據傳遞)

Serilizable是java實現的一套序列化方法,會觸發頻繁的IO操作,效率較低,適合將對象存儲到磁盤上的情況。把需要傳遞的類實現serilizable接口


Parcelable是Android提供的序列化方法。把需要傳遞的類實現parcelable接口,Parcelable將序列化后的字節流寫入到一個共享內存中,其他對象可以從該共享內存中讀出字節流,並反序列化成對象,效率較高,適合對象間和進程間傳遞信息。

18、64k問題的產生原因和如何解決?

  1. 產生原因:Dex文件中class、method的索引使用short類型,因此如果方法、類的總數超過了2字節的short-65535就會出問題。
  2. 解決辦法:使用Google的Multidex


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM