面試

Android系統(tǒng)架構(gòu)

http://www.itdecent.cn/p/fd3a36abc886

系統(tǒng)啟動過程

系統(tǒng)引導(dǎo)程序加載啟動linux內(nèi)核,內(nèi)核中有數(shù)據(jù)結(jié)構(gòu)和驅(qū)動程序,讀取init.c,執(zhí)行一些初始化的bin命令,執(zhí)行app_process.main,啟動Zygote進(jìn)程;Zygote preloadClass完成android環(huán)境的初始化,并startSystemServer,啟動server進(jìn)程,完成服務(wù)注冊;調(diào)用Ams.systemReady,并調(diào)用ActivityStack的resumeTopActivity,里面會判斷next有沒有,沒有就startHomeActivity。

https://www.cnblogs.com/tiantianbyconan/p/5013863.html

http://www.itdecent.cn/p/9cbf147da660

java本地內(nèi)存和主存

根據(jù)JMM的設(shè)計,系統(tǒng)存在一個主內(nèi)存(Main Memory),Java中所有變量都儲存在主存中,對于所有線程都是共享的。每條線程都有自己的工作內(nèi)存(Working Memory),工作內(nèi)存中保存的是主存中某些變量的拷貝,線程對所有變量的操作都是在工作內(nèi)存中進(jìn)行,線程之間無法相互直接訪問,變量傳遞均需要通過主存完成。

java內(nèi)存模型

http://www.itdecent.cn/p/9e02547b0873

java提供finalize()方法,垃圾回收器準(zhǔn)備釋放內(nèi)存的時候,會先調(diào)用finalize()

并發(fā)三大特性

http://www.itdecent.cn/p/cf57726e77f2

volatile和synchronized區(qū)別

http://blog.csdn.net/suifeng3051/article/details/52611233

http://blog.csdn.net/guyuealian/article/details/52525724

java內(nèi)存模型

http://blog.csdn.net/suifeng3051/article/details/52611310

https://www.cnblogs.com/lewis0077/p/5143268.html

GC

http://www.itdecent.cn/p/4eb06375976c

http://www.itdecent.cn/p/1d7f424cf91e

MinorGc清理年輕代;

Major GC清理年老區(qū)(Tenured space).

Full GC清理整個內(nèi)存堆 – 既包括年輕代也包括年老代

jvm原理

http://www.importnew.com/17770.html

http://blog.csdn.net/houliang120/article/details/50958212

Handler的IdleHandler

http://blog.csdn.net/anseven/article/details/40975851

bsdiff算法

https://cloud.tencent.com/developer/article/1008518

BSDiff算法的提出即針對可執(zhí)行文件更新前后二階變動的兩個重要規(guī)律:1)沒有被更新代碼所影響的代碼段,在變?yōu)榭蓤?zhí)行文件后,該區(qū)域的二進(jìn)制內(nèi)容的改變是極為稀疏的,即僅僅有部分指針或寄存器地址會變動,通常不會超過一兩個字節(jié);2)更新后的代碼和數(shù)據(jù)會有很大的位置變動,但這種變動大多為整塊的移動,即某一塊位置中代碼內(nèi)的指針地址變動均會有相同的位移值

基于此思想,BSDiff算法使用如下步驟來進(jìn)行生成差異更新包:

1. 將舊文件二進(jìn)制使用后綴排序或哈希算法形成一個字符串索引。

2. 使用該字符串索引對比新文件,生成差異文件(difference file)和新增文件(extra file)。

3. 將差異文件和新增文件及必要的索引控制信息壓縮為差異更新包。

dexdiff

http://www.itdecent.cn/p/8267373e1f1e

Step1:計算出new dex中每項Section的大小,比如string_ids在dex文件中所占大小。

step2:根據(jù)表中前一項的偏移地址和大小,計算出每項Section的偏移地址。

this.patchedStringIdsOffset = patchedHeaderOffset + patchedheaderSize;

step3:調(diào)用DexSectionDiffAlgorithm.execute(),將new dex與old dex中的每項section進(jìn)行對比,對于每項Section,遍歷其每一項Item,進(jìn)行新舊對比,記錄ADD,DEL標(biāo)識,存放于patchOperationList中。接著遍歷patchOperationList,添加REPLACE標(biāo)識,最后將ADD,DEL,REPLACE操作分別記錄到各自的List中。

step4:調(diào)用DexPatchGenerator.writePatchOperations(),將記錄寫入補丁。

dex和加固

http://mp.weixin.qq.com/s/UKySMpPe1O4sa-wnadPAyg

ContentProvider初始化和啟動

http://blog.csdn.net/zhenjie_chang/article/details/62889188

http://blog.csdn.net/wangbaochu/article/details/52042926

Contextprovider在ActivityThread.main時調(diào)用Ams的attachApplication通過Pms獲取所有manifest中的contentprovider,發(fā)送到activityThread.h調(diào)用installProvider,通過LoadedApk反射生成Contentprovider

本進(jìn)程內(nèi)的ContentProvider一般是在進(jìn)程啟動的時候就啟動并創(chuàng)建的。在Activity的啟動過程中分析過新進(jìn)程的啟動過程。

1.?創(chuàng)建一個新的進(jìn)程。調(diào)用ActivityThread的main方法

2.?調(diào)用ActivityThread的attach方法

3.?調(diào)用ActivityManagerService的attachApplication方法,通知新的進(jìn)程創(chuàng)建完成,根據(jù)新創(chuàng)建的進(jìn)程初始化ProcessRecord的信息。然后查詢所有和本進(jìn)程相關(guān)的ContentProvider信息。

4.?調(diào)用新建進(jìn)程的bindApplication方法,通知新進(jìn)程安裝并啟動這些ContentProvider

Receiver注冊和發(fā)送

http://blog.csdn.net/joneren/article/details/72556751

http://blog.csdn.net/angel1hao/article/details/51955953

http://www.itdecent.cn/p/17ed7bfeed13

apk打包過程

http://www.itdecent.cn/p/7c288a17cda8

http://www.itdecent.cn/p/a134d00e81ab

dvm和jvm

http://www.itdecent.cn/p/038807ec68c3

http://www.itdecent.cn/p/e8781933658d

Gc

http://www.itdecent.cn/p/3c7678246f90

http://blog.csdn.net/langxianwenye/article/details/40895267

http://blog.csdn.net/hello2mao/article/details/42361755

http://android.jobbole.com/81209/

Concurrent mark sweep----全部對象的檢測回收

Concurrent partial mark sweep----部分的檢測回收

Concurrent sticky mark sweep----僅檢測上次回收后創(chuàng)

建的對象,速度快,卡頓少,比較頻繁


SparseArray+ArrayMap

http://www.itdecent.cn/p/86b1fb6f9601

兩個數(shù)組Key和Value;二分查找法查詢數(shù)組插入位置,如果是容量夠的話就插入,如果容量不夠以2倍擴容,delete時候會將value置Delete,gc會進(jìn)行回收;

http://www.itdecent.cn/p/6a6a8256306b

兩個數(shù)組Hash,Key和Value;二分查找法通過Hash(key)判斷位置;


斷點續(xù)傳

http://blog.csdn.net/inconsolabl/article/details/48085903

http://www.itdecent.cn/p/5b2e22c42467



java動態(tài)代理機制

http://www.itdecent.cn/p/7fb4b469acd6



Toast要優(yōu)雅

http://www.itdecent.cn/p/364117750619

http://mp.weixin.qq.com/s/l62PtbmrIOkVKfJ2r0JwEw

http://blog.csdn.net/dj0379/article/details/51589403

hook原理

http://www.itdecent.cn/p/b30ea19c444b

http://www.itdecent.cn/p/8632fdc86009

http://www.itdecent.cn/p/36a2924e5d97

equal寫法

http://www.itdecent.cn/p/787775ea4899

動畫原理

http://blog.csdn.net/lmj623565791/article/details/42056859

Mvp,Mvc,Mvvm

http://www.itdecent.cn/p/b9549aa0e1fe

View#post與Handler#post的區(qū)別,以及導(dǎo)致的內(nèi)存泄漏分析

http://wwangc.me/post/android-view-post-ml.html/

LayoutInflater解析

http://wwangc.me/post/android-layout-inflate.html/


圖形顯示系統(tǒng)

http://wwangc.me/post/android-gui-1.html/

過度繪制

http://wwangc.me/post/android-overdraw.html/

插件原理

http://wwangc.me/post/android-plugins-dev.html/

VirtualApk滴滴是因為插件在某些方面與主工程數(shù)據(jù)耦合,而在滴滴打車中,其他業(yè)務(wù)模塊均需要宿主提供的訂單、定位、賬號等數(shù)據(jù),因此插件不可能和宿主沒有交互;

DroidPlugin是為了插件和主工程不存在耦合。

Https原理

http://wwangc.me/post/network-https.html/#more

http://www.itdecent.cn/p/6bc0646588fe

http://www.itdecent.cn/p/55a5c3bd1a0e

https://www.zhihu.com/question/25912483

http://wetest.qq.com/lab/view/110.html




容器比較

http://www.itdecent.cn/p/d562638071d1

http://www.itdecent.cn/p/da62adf81b49

String\StringBuilder\StringBuffer

http://www.itdecent.cn/p/f3b1e9e717ca

deep clone

http://blog.csdn.net/zhangjg_blog/article/details/18369201/

不可變對象

https://www.cnblogs.com/jaylon/p/5721571.html

Activity層級

http://www.itdecent.cn/p/a8850e7cbac2


class的范型講解:

getSuperclass ? 返回直接繼承的父類(由于編譯擦除,沒有顯示泛型參數(shù))

getGenericSuperclass ?返回直接繼承的父類(包含泛型參數(shù))

//參數(shù)化類型??

????????????ParameterizedType?parameterizedType=?(ParameterizedType)?genericSuperclass;??

//返回表示此類型實際類型參數(shù)的?Type?對象的數(shù)組??

????????????Type[]?actualTypeArguments?=?parameterizedType.getActualTypeArguments();??

this.clazz=?(Class)actualTypeArguments[0];?


Future\FutureTask\Callable

http://blog.csdn.net/javazejian/article/details/50896505


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 揮去17年的記憶,開始18年的面容... 過了今天我的所有的生活即將恢復(fù)正常,忙碌的生活和沒有辦法用言語表達(dá)的喜怒...
    love_立閱讀 261評論 0 1

友情鏈接更多精彩內(nèi)容