三曙强、高級(jí)開發(fā)技術(shù)面試題
這里講的是大公司需要用到的一些高端Android技術(shù),這里專門整理了一個(gè)文檔愧杯,希望大家都可以看看。這些題目有點(diǎn)技術(shù)含量鞋既,需要好點(diǎn)時(shí)間去研究一下的力九。
(一)圖片
1、圖片庫對(duì)比
目前通用的圖片庫是Glide和Picasso
庫大小和方法數(shù)量:
對(duì)比兩個(gè)jar庫的大小跌前,Glide要比Picasso大很多棕兼,基本上是Picasso的3.5倍
Picasso的方法大概有849個(gè),Glide的方法大概有2678個(gè)
使用方式:
緩存大械峙摇:
Picasso是下載圖片然后緩存完整的大小到本地伴挚,比如圖片的大小是1080p,之后如果我需要同一張圖片灾炭,就會(huì)返回這張full size的茎芋,如果我需要resize,也就是對(duì)這個(gè)full size做resize蜈出。
Glide則完全不一樣的做法田弥。Glide會(huì)先下載圖片,然后改變圖片的大小铡原,以適應(yīng)ImageView的要求偷厦,然后緩存到本地。如果下載同一個(gè)圖片燕刻,但是設(shè)定兩個(gè)不同大小的imageView只泼,那么Glide實(shí)際是緩存兩份。
內(nèi)存使用:
同樣格式的圖片卵洗,Glide內(nèi)存使用比Picasso小辜妓。
加載圖片的時(shí)間:
當(dāng)下載圖片時(shí),加載的速度Picasso是要比Glide快的忌怎,因?yàn)镚lide需要進(jìn)行改變圖片的大小籍滴,然后緩存;如果已經(jīng)緩存在內(nèi)存中榴啸,Glide加載速度比Picasso要快孽惰,因?yàn)镻icasso內(nèi)存中的圖片需要resize。
其他方面:
Glide支持gif
Glide更加靈活鸥印。
http://www.reibang.com/p/fc72001dc18d
2勋功、圖片庫的源碼分析
https://blog.csdn.net/guolin_blog/article/details/53759439
3、圖片框架緩存實(shí)現(xiàn)
Glide將緩存分成了兩個(gè)模塊库说,一個(gè)是內(nèi)存緩存狂鞋,一個(gè)是硬盤緩存。
這兩個(gè)緩存模塊的作用各不相同潜的,內(nèi)存緩存的主要作用是防止應(yīng)用重復(fù)將圖片數(shù)據(jù)讀取到內(nèi)存中骚揍,而硬盤緩存的主要作用是防止應(yīng)用重復(fù)從網(wǎng)絡(luò)或其他地方重復(fù)下載和讀取數(shù)據(jù)。
https://blog.csdn.net/guolin_blog/article/details/54895665
4、LRUCache原理
LRUCache的核心思想就是維護(hù)一個(gè)緩存對(duì)象列表信不,其中對(duì)象列表的排列方式是按照訪問順序?qū)崿F(xiàn)的嘲叔,即一直沒有訪問的對(duì)象放在隊(duì)尾,即將被淘汰抽活。而最近訪問的對(duì)象將放在隊(duì)頭硫戈,最后被淘汰。
http://www.reibang.com/p/b49a111147ee
5下硕、圖片加載原理
(1)丁逝、圖片Drawable其實(shí)只是一個(gè)加載圖片的工具,并不是一張圖片梭姓;它可以加載xml文件果港,解析出我們的圖,也可以從drawable文件夾中加載圖片處理交給畫布畫糊昙。
(2)、主流的圖片加載原理其實(shí)都用到了緩存:內(nèi)存緩存谢谦、活動(dòng)緩存释牺、磁盤緩存等等,首先都是從緩存中獲取到回挽,如果沒有再從網(wǎng)絡(luò)下載數(shù)據(jù)到本地加載没咙;最終的形式都是將文件解析成Bitmap加載到圖片上。
6千劈、自己去實(shí)現(xiàn)圖片庫祭刚,怎么做?
7墙牌、Glide源碼解析
8涡驮、Glide使用什么緩存?
內(nèi)存緩存和硬盤緩存
9喜滨、Glide內(nèi)存緩存如何控制大凶酵薄?
(二)網(wǎng)絡(luò)和安全機(jī)制
1虽风、網(wǎng)絡(luò)框架對(duì)比和源碼分析
優(yōu)先使用Retrofit棒口,前提是后臺(tái)最好是支持Restful風(fēng)格,如果不想使用或沒有能力掌握辜膝,則推薦使用Volley无牵,如果需要上傳大量的數(shù)據(jù),則不推薦使用volley厂抖,推薦使用okhttp茎毁。
Retrofit整個(gè)項(xiàng)目使用的動(dòng)態(tài)代理和靜態(tài)代理
2、自己去設(shè)計(jì)網(wǎng)絡(luò)請求框架忱辅,怎么做充岛?
網(wǎng)絡(luò)請求框架的核心就是封裝了網(wǎng)絡(luò)請求+異步+數(shù)據(jù)處理
其中網(wǎng)絡(luò)請求一般使用Android的網(wǎng)絡(luò)請求原生方法(HttpClient或HttpURLConnection)
一般而言保檐,我們需要考慮的方面有:
1、構(gòu)建我們的請求Request:包含url,請求方法崔梗,請求參數(shù)夜只,請求頭,編碼蒜魄,請求體扔亥,編碼格式,超時(shí)時(shí)間谈为,代理端口旅挤,代理主機(jī)等。
2伞鲫、由Dispatcher分發(fā)器并行分發(fā)我們的Request請求粘茄,這里的分發(fā)器實(shí)際是一個(gè)線程池。
3秕脓、準(zhǔn)備開始連接服務(wù)器柒瓣,連接http獲取https服務(wù)器地址,https需要考慮自簽名證書、雙向SSL驗(yàn)證等安全問題吠架。
4芙贫、Response得到服務(wù)器的回調(diào),考慮輸入流關(guān)閉的問題傍药,大文件傳輸?shù)膯栴}磺平,線程切換問題,緩存問題拐辽。
3拣挪、okhttp源碼
http://www.reibang.com/p/5b7ccc7e5bb7
4、網(wǎng)絡(luò)請求緩存處理俱诸,okhttp如何處理網(wǎng)絡(luò)緩存的
okHttp緩存流程分為讀取緩存和存儲(chǔ)緩存兩個(gè)過程媒吗。
讀取使用緩存的流程從HttpEngine的sendRequest發(fā)送請求開始。
(1)乙埃、首先闸英,獲取OkHttpClient的Cache緩存對(duì)象,就是之前創(chuàng)建OkHttpClient時(shí)設(shè)置的Cache介袜。
(2)甫何、然后傳入Request請求到Cache的get方法去查找緩存響應(yīng)數(shù)據(jù)Response.
(3)、構(gòu)造一個(gè)緩存策略遇伞,傳入Request請求和緩存響應(yīng)Response辙喂,然后調(diào)用它的get方法去決策使用網(wǎng)絡(luò)請求還是緩存響應(yīng)。
(4)、策略判定以后巍耗,如果是使用緩存秋麸,它的cacheResponse不為空,networkRequest為空炬太,如果使用請求灸蟆,則相反。然后再將策略給出的兩個(gè)值亲族,繼續(xù)處理炒考。
(5)、如果使用請求霎迫,但是之前又找到了緩存響應(yīng)斋枢,則要關(guān)閉緩存響應(yīng)資源。
(6)知给、如果策略得出緩存響應(yīng)為空瓤帚,網(wǎng)絡(luò)請求也為空,則返回請求不合理的響應(yīng)涩赢。
(7)甩牺、如果請求為空蟹演,緩存不為空既琴,也就是使用緩存的情況也拜,則使用緩存響應(yīng)來構(gòu)造返回的響應(yīng)數(shù)據(jù)赃阀。
(8)霎肯、最后只使用網(wǎng)絡(luò)請求的情況,走網(wǎng)絡(luò)請求的路線榛斯。
總結(jié):先查找是否有可用的Cache观游,然后通過Cache找到對(duì)應(yīng)的緩存,然后將請求和緩存交給緩存策略去判斷使用請求還是使用緩存驮俗,得出結(jié)果后懂缕,自己再判斷使用緩存還是使用請求,如果使用緩存王凑,則用緩存構(gòu)造響應(yīng)直接返回搪柑,如果使用請求,那么開始網(wǎng)絡(luò)請求流程索烹。
OkHttp的存儲(chǔ)緩存流程是從HttpEngine的readResponse發(fā)送請求開始的工碾。
http://www.reibang.com/p/00d281c226f6
5、從網(wǎng)絡(luò)加載一個(gè)10M的圖片百姓,說下注意事項(xiàng)
需要注意開啟子線程加載渊额,需要注意內(nèi)存是否會(huì)溢出。
6、TCP的3次握手和四次揮手
上圖包括三個(gè)部分:建立連接旬迹,數(shù)據(jù)傳輸火惊,斷開連接
第一次握手:客戶端發(fā)送syn包(seq = x)到服務(wù)器,并進(jìn)入SYN_SENT狀態(tài)奔垦,等待服務(wù)器確認(rèn)屹耐;第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack = x+1)宴倍,同時(shí)自己也發(fā)送一個(gè)SYN包(seq = y)张症,即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài)鸵贬;第三次握手:客戶端收到服務(wù)器的SYN+ACK包俗他,向服務(wù)器確認(rèn)包ACK(ack = y+1),此包發(fā)送完畢阔逼,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài)兆衅,完成三次握手。
四次揮手
第一次揮手:主動(dòng)關(guān)閉方發(fā)送一個(gè)FIN嗜浮,用來關(guān)閉主動(dòng)方到被動(dòng)方的數(shù)據(jù)傳輸羡亩,也就是主動(dòng)關(guān)閉方告訴被動(dòng)關(guān)閉方:我已經(jīng)不會(huì)再給你發(fā)送數(shù)據(jù)了(當(dāng)然,在FIN之前發(fā)送出去的數(shù)據(jù)危融,如果沒有收到對(duì)應(yīng)的ack確認(rèn)報(bào)文畏铆,主動(dòng)關(guān)閉方依然會(huì)重發(fā)這些數(shù)據(jù)),但此時(shí)主動(dòng)關(guān)閉方還可以接收數(shù)據(jù)吉殃。
第二次揮手:被動(dòng)關(guān)閉方收到FIN包后辞居,發(fā)送一個(gè)ACK給對(duì)方,確認(rèn)序號(hào)為收到序號(hào)加1(與SYN相同蛋勺,一個(gè)FIN占用一個(gè)序號(hào))瓦灶。
第三次揮手:被動(dòng)關(guān)閉方發(fā)送一個(gè)FIN,用來關(guān)閉被動(dòng)關(guān)閉方到主動(dòng)關(guān)閉方的數(shù)據(jù)傳輸抱完,也就是告訴主動(dòng)關(guān)閉方贼陶,我的數(shù)據(jù)也發(fā)送完了,不會(huì)再給你發(fā)送數(shù)據(jù)了巧娱。
第四次揮手:主動(dòng)關(guān)閉方收到FIN后碉怔,發(fā)送一個(gè)ACK給被動(dòng)關(guān)閉方,確認(rèn)序號(hào)為收到的序號(hào)+1禁添,致此完成四次揮手眨层。
7、TCP與UDP的區(qū)別
(1)上荡、TCP面向連接(如打電話要先撥號(hào)建立連接)趴樱;UDP是無連接的馒闷,即發(fā)送數(shù)據(jù)之前不需要建立連接。
(2)叁征、TCP提供可靠服務(wù)纳账。也就是說,通過TCP連接傳送的數(shù)據(jù)捺疼,無差錯(cuò)疏虫,不丟失,不重復(fù)啤呼,且按序到達(dá)卧秘;UDP盡最大努力交付,即不保證可靠交付官扣。
(3)翅敌、TCP面向字節(jié)流,實(shí)際上是TCP把數(shù)據(jù)看成了一連串無結(jié)構(gòu)的字節(jié)流惕蹄;UDP面向報(bào)文的蚯涮,UDP沒有擁塞控制,因此卖陵,網(wǎng)絡(luò)出現(xiàn)擁塞不會(huì)使源主機(jī)的發(fā)送效率降低(對(duì)實(shí)時(shí)應(yīng)用很有用遭顶,如IP電環(huán),實(shí)時(shí)視頻會(huì)議等)
(4)泪蔫、每一條TCP連接只能是點(diǎn)對(duì)點(diǎn)的棒旗;UDP支持一對(duì)一,一對(duì)多撩荣,多對(duì)一和多對(duì)多交互通信铣揉。
(5)、TCP首部開銷20字節(jié)婿滓;UDP的首部開銷小老速,只有8個(gè)字節(jié)粥喜;
(6)凸主、TCP的邏輯通信信道是全雙工的可靠信道;UDP則是不可控信道额湘。
8卿吐、TCP與UDP的應(yīng)用
當(dāng)對(duì)網(wǎng)絡(luò)通信質(zhì)量有要求時(shí),比如:整個(gè)數(shù)據(jù)要準(zhǔn)確無誤的傳遞給對(duì)方锋华,這往往需要可靠的傳輸協(xié)議
如:瀏覽器使用的HTTP嗡官,F(xiàn)lashFXP使用ftp,QQ文件傳輸?shù)?/p>
對(duì)當(dāng)前網(wǎng)絡(luò)通信質(zhì)量要求不高的時(shí)候毯焕,要求網(wǎng)絡(luò)通訊速度盡量的快衍腥,這就使用UDP磺樱,如:QQ語音,QQ視頻婆咸,TFTP
9竹捉、HTTP協(xié)議
Http協(xié)議是超文本傳輸協(xié)議。
http請求分成三個(gè)部分尚骄,分別是請求行块差,消息報(bào)頭,請求正文
10倔丈、HTTP1.0與2.0的區(qū)別
HTTP1.0:瀏覽器每次請求都需要與服務(wù)器建立一個(gè)TCP連接憨闰,服務(wù)器處理完成后立即斷開TCP連接(無連接),服務(wù)器不跟蹤每個(gè)客戶端也不記錄過去的請求(無狀態(tài))
HTTP2.0:HTTP2.0引入了二進(jìn)制數(shù)據(jù)幀和流的概念需五,其中幀對(duì)數(shù)據(jù)進(jìn)行順序標(biāo)識(shí)鹉动,這樣瀏覽器在收到數(shù)據(jù)之后,就可以按照序列對(duì)數(shù)據(jù)進(jìn)行合并警儒,而不會(huì)出現(xiàn)合并后數(shù)據(jù)錯(cuò)亂的情況训裆。同樣因?yàn)橛辛诵蛄校?wù)器就可以并行的傳輸數(shù)據(jù)蜀铲,這就是流所做的事情边琉。
11、HTTP報(bào)文結(jié)構(gòu)
一個(gè)HTTP的請求報(bào)文由四個(gè)部分組成:請求行记劝,請求頭部变姨,空行,請求數(shù)據(jù)厌丑。
HTTP響應(yīng)報(bào)文也分為三個(gè)部分:響應(yīng)行定欧,響應(yīng)頭,響應(yīng)體怒竿。
https://blog.csdn.net/shouwang666666/article/details/70232053
12砍鸠、HTTP與HTTPS的區(qū)別以及如何實(shí)現(xiàn)安全性
兩者的區(qū)別:
(1)、HTTP是明文傳輸耕驰,傳輸內(nèi)容容易被篡改或者被竊纫琛;HTTPS是密文傳輸朦肘,https相當(dāng)于包裝了SSL\TLS協(xié)議的HTTP饭弓。
(2)、https在網(wǎng)絡(luò)請求效率上會(huì)低于http媒抠,因?yàn)椴捎昧瞬煌恼埱髤f(xié)議以及更復(fù)雜的安全驗(yàn)證操作弟断。
(3)、https需要申請CA證書趴生,用于驗(yàn)證公鑰這個(gè)證書收費(fèi)阀趴,HTTP不用昏翰。
主要通過非對(duì)稱加密+對(duì)稱加密+CA證書來保證請求安全的。
13刘急、如何驗(yàn)證證書的合法性?
(1)矩父、驗(yàn)證證書是否在有效期內(nèi)。
(2)排霉、驗(yàn)證證書是否被吊銷了窍株。
(3)、驗(yàn)證證書真實(shí)性攻柠,是否是由上級(jí)CA簽發(fā)的球订。
http://www.reibang.com/p/f4a37da10c53
14、https中哪里用了對(duì)稱加密瑰钮,哪里用了非對(duì)稱加密冒滩,對(duì)加密算法(如RSA)等是否有了解?
https協(xié)議中加密使用了SSL協(xié)議,SSL的加密既用了對(duì)稱加密也用了非對(duì)稱加密浪谴,對(duì)稱加密速度快开睡,平時(shí)傳輸用對(duì)稱加密,非對(duì)稱加密傳密碼比較安全苟耻,所以對(duì)稱加密的密碼是用非對(duì)稱加密來傳的篇恒,這種加密的關(guān)鍵是用非對(duì)稱加密的方式用密文傳輸對(duì)稱加密用的密碼。
RSA非對(duì)稱加密
RSA算法舉例:
1凶杖,任取兩個(gè)質(zhì)數(shù)胁艰,比如p=3,q=11
2智蝠,計(jì)算n=p*q腾么,也就是n=33
3,計(jì)算A=(p-1)*(q-1)杈湾,也就是A=20
4解虱,在1到A之間隨便選個(gè)數(shù)e,要求e和A互質(zhì)漆撞,比如選e=3(隨便選的殴泰,和p=3沒有關(guān)系)
5,計(jì)算d叫挟,要求e*d mod(A)=1艰匙,也就是3*d對(duì)20取模等于1限煞,d可以等于7抹恳,可以等于17,還可以等于其他很多值署驻,這里選d=7
6奋献,于是得到了e和d健霹,e和d關(guān)于A互為模反元素,那么瓶蚂,公鑰就是(n糖埋,e)也就是(33,3),私鑰就是(n窃这,d)也就是(33,7)
7瞳别,公鑰(33,3)由服務(wù)器發(fā)給瀏覽器,私鑰(33,7)由服務(wù)器自己留下杭攻。假如瀏覽器要發(fā)送的內(nèi)容是18祟敛,用m表示,即m=18兆解,那么m的e次方對(duì)n取模馆铁,即18的3次方對(duì)33取模,得到結(jié)果c=24锅睛,也就是瀏覽器發(fā)送的加密內(nèi)容是24
8埠巨,服務(wù)器收到24的加密內(nèi)容后,用c的d次方對(duì)n取模现拒,即24的7次方對(duì)33取模辣垒,得到m=18,也就是瀏覽器本來要發(fā)送的內(nèi)容印蔬。
15乍构、client如何確定自己發(fā)送的消息被server收到?
當(dāng)Client收到服務(wù)器返回的二次握手的信息,包含Client發(fā)送的SYN+服務(wù)器確認(rèn)的SYN
16扛点、談?wù)勀銓?duì)WebSocket的理解
WebSocket是應(yīng)用層html5出的一種協(xié)議哥遮,相比較http而言優(yōu)勢是支持長連接,WebSocket只需要一次HTTP握手陵究,整個(gè)通信過程是建立在一次連接/狀態(tài)中眠饮,也就避免了HTTP的非狀態(tài)性,服務(wù)端會(huì)一直知道你的信息铜邮,直到關(guān)閉請求仪召;同時(shí)WebSocket協(xié)議解決了服務(wù)器與客戶端全雙工通信的問題。
信息只能單向傳送為單工松蒜;信息能雙向傳送扔茅,但不能同時(shí)雙向傳送稱為半雙工;信息能夠同時(shí)雙向傳送稱為雙工秸苗。
17、WebSocket與socket的區(qū)別
Socket處于抽象層,是Http底層協(xié)議;而WebSocket是類似于http應(yīng)用層協(xié)議灭忠,WebSocket是應(yīng)用層html5出的協(xié)議旭旭。
Http協(xié)議有個(gè)缺陷:通信只能從客戶端發(fā)起,做不到服務(wù)器主動(dòng)向客戶端推送信息悴了。
WebSocket最大的特點(diǎn)就是挨摸,服務(wù)器可以主動(dòng)向客戶端推送信息,客戶端也可以主動(dòng)向服務(wù)器發(fā)送信息蜗顽,是真正的雙向平等對(duì)話,屬于服務(wù)器推送技術(shù)的一種雇盖。
18忿等、談?wù)勀銓?duì)安卓簽名的理解。
Android簽名是為了保證應(yīng)用發(fā)布者是本人崔挖,大致有幾種:以前Eclipse用keyStore進(jìn)行簽名贸街;現(xiàn)在Android Studio開發(fā)app采用JKS簽名;Android系統(tǒng)簽名采用的是pem/pk8.
每個(gè)Android App都會(huì)有自己的簽名狸相,如果我們沒有指定簽名薛匪,編譯時(shí)會(huì)默認(rèn)用SDK目錄下的debug簽名文件。
常見的簽名jks在Android studio中有兩種方式給app簽名脓鹃,一種是build時(shí)generate signed apk逸尖;一種是在build文件中配置簽名信息。
19瘸右、請解釋安卓為啥要加簽名機(jī)制?
(1)冷溶、應(yīng)用程序升級(jí),驗(yàn)證app的唯一性尊浓,包名和簽名都一致才能升級(jí)逞频。
(2)、應(yīng)用程序模塊化栋齿,可以模塊化部署多個(gè)應(yīng)用到一個(gè)進(jìn)程苗胀,只要他們的簽名都一樣。
(3)瓦堵、代碼或者數(shù)據(jù)共享基协,同一個(gè)簽名有相同的權(quán)限,可以共享數(shù)據(jù)和代碼菇用。
20澜驮、視頻加密傳輸
為何要加密傳輸,因?yàn)楸I鏈和盜播的存在惋鸥,讓版權(quán)價(jià)值大打折扣杂穷。用戶通過一次付費(fèi)行為,就可以拿到付費(fèi)視頻的播放URL卦绣,將播放的URL進(jìn)行二次分發(fā)耐量,這種行為叫做盜鏈;用戶將視頻直接下載到本地滤港,然后進(jìn)行二次上傳分發(fā)品山,這種行為叫做盜播。
常用的視頻加密技術(shù)有:
(1)孟辑、分片加密
基于蘋果公司的HLS協(xié)議,服務(wù)器需要切片出TS文件并進(jìn)行AES加密著榴,生成m3u8索引文件,然后客戶端下載到本地給播放器播放屁倔。
(2)脑又、文件前中后加密
這三段文件加密都涉及到文件的讀取,尤其是對(duì)大文件的讀取汰现,我們使用java的RandomAccessFile(隨機(jī)訪問文件)這個(gè)類來進(jìn)行文件的加密解密挂谍。
21叔壤、App 是如何沙箱化瞎饲,為什么要這么做?
Android是一個(gè)多用戶系統(tǒng)炼绘,每個(gè)應(yīng)用是一個(gè)獨(dú)立的用戶嗅战。系統(tǒng)為每個(gè)應(yīng)用分配一個(gè)唯一的用戶標(biāo)識(shí)(UID),并為應(yīng)用中所有的文件設(shè)置該用戶才能訪問的權(quán)限。每個(gè)進(jìn)程中有一個(gè)獨(dú)立的VM俺亮。每個(gè)應(yīng)用在自己的進(jìn)程中運(yùn)行驮捍,應(yīng)用組件需要執(zhí)行時(shí),系統(tǒng)創(chuàng)建該進(jìn)程脚曾,當(dāng)系統(tǒng)內(nèi)存不足時(shí)东且,系統(tǒng)會(huì)銷毀該進(jìn)程。
在很多情況下本讥,源自同一開發(fā)者或同一開發(fā)機(jī)構(gòu)的應(yīng)用程序珊泳,相互間存在信任關(guān)系。Android系統(tǒng)提供一種所謂的共享UID(SharedUserID)機(jī)制拷沸,使具備信任關(guān)系的應(yīng)用程序可以運(yùn)行在同一進(jìn)程空間色查。
沙箱是為app提供隔離環(huán)境的一種安全機(jī)制,嚴(yán)格控制執(zhí)行的程序所訪問的資源撞芍,以確保系統(tǒng)的安全秧了,讓app在獨(dú)立的進(jìn)程中執(zhí)行任務(wù),讓其不能訪問外部進(jìn)程的資源序无,這樣一個(gè)應(yīng)用出問題了验毡,其他的應(yīng)用進(jìn)程能夠保障不被影響。
22帝嗡、權(quán)限管理系統(tǒng)(底層的權(quán)限是如何進(jìn)行 grant 的)米罚?
應(yīng)用程序在應(yīng)用層的AndroidManifest.xml中所申請的權(quán)限將會(huì)在Android系統(tǒng)啟動(dòng)時(shí),經(jīng)過解析后丈探,逐步映射到內(nèi)核層的組ID和用戶ID录择,最終由內(nèi)核層setgid()和setuid()函數(shù)設(shè)置后才能執(zhí)行;在進(jìn)行權(quán)限申請時(shí),6.0以上需要?jiǎng)討B(tài)代碼申請隘竭,6.0以下直接在AndroidManifest.xml中注冊即可塘秦。
(三)數(shù)據(jù)庫
1、sqlite升級(jí)动看,增加字段的語句
(1)尊剔、將表A重命名,重命名為A_temp菱皆。
(2)须误、創(chuàng)建新表A。
(3)仇轻、將表A_temp中的數(shù)據(jù)插入到新表A中京痢。
(4)、刪除表A_temp篷店。
2祭椰、數(shù)據(jù)庫框架對(duì)比和源碼分析
greenDao是一種Android數(shù)據(jù)庫ORM框架,與OrmLite疲陕、ActiveOrm方淤、LitePal等數(shù)據(jù)庫相比,單位時(shí)間內(nèi)可以插入蹄殃、更新和查詢更多數(shù)據(jù)携茂,而且提供了大量的靈活通用的接口。
https://blog.csdn.net/u012702547/article/details/52226163
3诅岩、數(shù)據(jù)庫的優(yōu)化
數(shù)據(jù)庫性能上:
(1)讳苦、批量事務(wù)插入,提升數(shù)據(jù)插入的性能按厘。
(2)医吊、單條sql由于多條sql
(3)、讀和寫操作是互斥的逮京,寫操作過程中可以休眠讓讀操作進(jìn)行卿堂。
(4)、使用索引懒棉。
(5)草描、使用聯(lián)合索引
(6)、勿使用過多索引
(7)策严、增加查詢條件
(8)穗慕、提前將字段的index映射好。
數(shù)據(jù)庫設(shè)計(jì)上:
(1)妻导、通過冗余換取查詢速度
(2)逛绵、減少數(shù)據(jù)來提升查詢速度怀各。
(3)、避免大數(shù)據(jù)多表的聯(lián)合查詢术浪。
4瓢对、數(shù)據(jù)庫數(shù)據(jù)遷移問題
(1)、將表A重命名胰苏,重命名為A_temp硕蛹。
(2)、創(chuàng)建新表A硕并。
(3)法焰、將表A_temp中的數(shù)據(jù)插入到新表A中。
(4)倔毙、刪除表A_temp埃仪。
(四)算法
1、排序算法有哪些普监?
(1)贵试、冒泡排序:
從第一個(gè)數(shù)開始琉兜,相鄰元素兩兩對(duì)比凯正,小的數(shù)放前面。(每循環(huán)一次豌蟋,最后一個(gè)數(shù)都會(huì)被確定下來廊散,為每輪的最大數(shù))
(2)、選擇排序:
從第一個(gè)數(shù)開始梧疲,循環(huán)一圈找最小的數(shù)交換位置允睹。(每循環(huán)一圈,第一個(gè)數(shù)都會(huì)被確定下來幌氮,為每輪最小的值)
(3)缭受、插入排序:
從第二個(gè)數(shù)開始,跟前一個(gè)數(shù)比較该互,若比前一個(gè)數(shù)小米者,則交換位置,接著跟前一個(gè)數(shù)比較宇智,直到比前一個(gè)數(shù)大為止蔓搞。(從第一張開始整理撲克牌,小的往前插)(可能會(huì)出現(xiàn)一個(gè)數(shù)從最后比較到最前面随橘,比較費(fèi)時(shí))
(4)喂分、希爾排序:
?? ?希爾排序?qū)儆诓迦腩惻判颍菍⒄麄€(gè)有序序列分割成若干個(gè)小的子序列分別進(jìn)行插入排序机蔗。
?? ?排序過程:先取一個(gè)正整數(shù)d1<n蒲祈,把所有序號(hào)相隔d1的數(shù)組元素放一組甘萧,組內(nèi)進(jìn)行直接插入排序,然后取d2<d1梆掸,重復(fù)上述分組和排序操作幔嗦,直至d1=1,即所有記錄放進(jìn)一個(gè)組中排序?yàn)橹沽ぬ丁#▽⒚块g隔一定步距的數(shù)取出來進(jìn)行比較邀泉,比如gap=5,就是把第1個(gè)钝鸽、第6個(gè)汇恤、第11個(gè)...數(shù)取出來進(jìn)行插入排序)
?? ?優(yōu)點(diǎn):當(dāng)n值很大時(shí),數(shù)據(jù)項(xiàng)每一趟排序需要移動(dòng)的個(gè)數(shù)很少拔恰,但數(shù)據(jù)項(xiàng)的距離很長因谎;當(dāng)n值減小時(shí),每一趟需要移動(dòng)的數(shù)據(jù)增多颜懊,此時(shí)已經(jīng)接近于它們排序后的最終位置财岔。
??? 希爾分析:
?? ??? ?希爾排序是按照不同步長對(duì)元素進(jìn)行插入排序,當(dāng)剛開始元素很無序的時(shí)候河爹,步長最大匠璧,所以插入排序的元素個(gè)數(shù)很少,速度很快咸这;當(dāng)元素基本有序了夷恍,步長很小,插入排序?qū)τ谟行虻男蛄行屎芨呦蔽K阅鹧柵判虻臅r(shí)間復(fù)雜度會(huì)比o(n^2)好一些。
(5)侄刽、歸并排序:
?歸并排序有兩種實(shí)現(xiàn)方法:自上而下的遞歸指黎;自下而上的迭代。下面講遞歸法:
?? ?將原數(shù)組用二分法一直分到兩個(gè)數(shù)為一組州丹,然后通過比較將較小的數(shù)放到前面(通過一個(gè)中間數(shù)組排序)醋安;然后一層層向上排序。
??? (就是兩個(gè)數(shù)比較進(jìn)行排序当叭,然后兩組(四個(gè)數(shù))進(jìn)行比較排序茬故,然后兩組(八個(gè)數(shù))進(jìn)行比較排序…)
(6)、快速排序:
快速排序思想:先找到一個(gè)基準(zhǔn)點(diǎn)(一般指數(shù)組的中部)蚁鳖,然后數(shù)組被該基準(zhǔn)點(diǎn)分為兩部分磺芭,依次與該基準(zhǔn)點(diǎn)數(shù)據(jù)比較,如果比它小醉箕,放左邊钾腺;反之徙垫,放右邊。 左右分別用一個(gè)空數(shù)組去存儲(chǔ)比較后的數(shù)據(jù)放棒。最后遞歸執(zhí)行上述操作姻报,直到數(shù)組長度<=1。
?? ?特點(diǎn):快速间螟,常用吴旋。缺點(diǎn)是需要另外聲明兩個(gè)數(shù)組,浪費(fèi)了內(nèi)存空間資源厢破。
2荣瑟、最快的排序算法是哪個(gè)?
快速排序時(shí)最快的排序算法摩泪。
3笆焰、手寫一個(gè)冒泡排序
4、手寫快速排序代碼
5见坑、快速排序的過程嚷掠、時(shí)間復(fù)雜度、空間復(fù)雜度
快速排序原理:
(1)荞驴、定義一個(gè)基準(zhǔn)元素base(我這里定義最左邊的元素定位基準(zhǔn)元素)
(2)不皆、定義兩個(gè)變量i和j
(3)、j先從右向左遍歷戴尸,找到第一個(gè)比base小的數(shù)就停止粟焊。
(4)冤狡、i從左往右遍歷孙蒙,找到第一個(gè)比base大的數(shù)就停止。
(5)悲雳、如果i和j不相等挎峦,交換i和j指向的元素。
(6)合瓢、直到i和j指向同一元素坦胶,將這個(gè)元素與基準(zhǔn)元素交換
(7)、遞歸求解
圖解:
6晴楔、手寫堆排序
7顿苇、堆排序過程、時(shí)間復(fù)雜度及空間復(fù)雜度
將待排序的序列構(gòu)造成一個(gè)大頂堆税弃。此時(shí)纪岁,這個(gè)序列最大值就是堆頂?shù)母?jié)點(diǎn)。將其與數(shù)組末尾元素進(jìn)行交換则果,此時(shí)末尾元素就是最大值幔翰,然后將剩余的n-1個(gè)序列重新構(gòu)造成一個(gè)堆漩氨,這樣就可以得到n-1個(gè)元素的次大值。如此反復(fù)執(zhí)行遗增,便能得到一個(gè)有序序列了叫惊。
堆排序的時(shí)間復(fù)雜度是O(n log n)
空間復(fù)雜度為O(1)
8、寫出你所知道的排序算法及時(shí)空復(fù)雜度做修,穩(wěn)定性
9霍狰、二叉樹給出根節(jié)點(diǎn)和目標(biāo)節(jié)點(diǎn),找出從根節(jié)點(diǎn)到目標(biāo)節(jié)點(diǎn)的路徑
10饰及、給阿里2萬多名員工按年齡排序應(yīng)該選擇哪個(gè)算法蚓耽?
快速排序
https://blog.csdn.net/lsm18829224913/article/details/80304750
11、GC算法(各種算法的優(yōu)缺點(diǎn)以及應(yīng)用場景)
(1)旋炒、標(biāo)記清除
優(yōu)點(diǎn):實(shí)現(xiàn)簡單步悠;與保守式GC算法兼容;
缺點(diǎn):碎片化瘫镇;分配速度鼎兽;與寫時(shí)復(fù)制技術(shù)不兼容
(2)、復(fù)制算法
優(yōu)點(diǎn):優(yōu)秀的吞吐量铣除;可實(shí)現(xiàn)告訴分配谚咬;不會(huì)發(fā)生碎片化;與緩存兼容
缺點(diǎn):堆使用效率低下尚粘;不兼容保守式GC算法择卦;遞歸調(diào)用函數(shù)
(3)、標(biāo)記整理
優(yōu)點(diǎn):可有效利用堆
缺點(diǎn):壓縮花費(fèi)計(jì)算成本
(4)郎嫁、增量算法
優(yōu)點(diǎn):縮短了最大暫停時(shí)間秉继;降低了吞吐量。
http://www.reibang.com/p/9e7ec35c45f5
12泽铛、蟻群算法與蒙特卡洛算法
https://blog.csdn.net/longxinghaofeng/article/details/77740480
https://blog.csdn.net/bi_mang/article/details/52416258
13尚辑、子串包含問題(KMP 算法)寫代碼實(shí)現(xiàn)
在匹配階段,若是模式串和文本串相同盔腔,那就繼續(xù)匹配下一位杠茬,若是不相同,就去找next數(shù)組記錄的位置弛随,繼續(xù)匹配瓢喉,這也就是KMP算法和普通暴力算法的主要區(qū)別,暴力是從頭開始匹配舀透,而KMP是通過next數(shù)組栓票,發(fā)現(xiàn)前面可以跳過大量重復(fù)計(jì)算的東西。
next數(shù)組計(jì)算方法:
next數(shù)組的計(jì)算主要和模式串相關(guān)盐杂,與文本串沒有關(guān)系逗载,因?yàn)槎吡J酱昂蠊沧铋L子序列。這樣才會(huì)讓我們跳過大量的重復(fù)計(jì)算厉斟,next數(shù)組的主要實(shí)現(xiàn)方法有很多挚躯,就是要找到前后最長公共子序列的長度,比如:
ababa:
模式串的各個(gè)子串:前綴:后綴:最大公共元素長度:
a 0
ab a b 0
aba a ab a ba 1
abab a ab aba b ab bab 2
ababa a ab aba abab a ba aba baba 3
如上圖next數(shù)組的元素就是0擦秽,0码荔,1,2感挥,3
kmp算法的核心就是就算next數(shù)組缩搅。
14、一個(gè)無序触幼,不重復(fù)數(shù)組硼瓣,輸出N個(gè)元素,使得N個(gè)元素的和相加為M置谦,給出時(shí)間復(fù)雜度堂鲤、空間復(fù)雜度。手寫算法
15媒峡、萬億級(jí)別的兩個(gè)URL文件A和B瘟栖,如何求出A和B的差集C(提示:Bit映射->hash分組->多文件讀寫效率->磁盤尋址以及應(yīng)用層面對(duì)尋址的優(yōu)化)
16、百度POI中如何試下查找最近的商家功能(提示:坐標(biāo)鏡像+R樹)谅阿。
17半哟、兩個(gè)不重復(fù)的數(shù)組集合中,求共同的元素签餐。
retainAll取交集
18寓涨、兩個(gè)不重復(fù)的數(shù)組集合中,這兩個(gè)集合都是海量數(shù)據(jù)贱田,內(nèi)存中放不下缅茉,怎么求共同的元素?
采取分而治之的方法
先遍歷數(shù)組A男摧,對(duì)每個(gè)元素求取hash(元素)%1000,然后根據(jù)所取到的值將元素分別存儲(chǔ)在1000個(gè)數(shù)組中译打。
遍歷數(shù)組B耗拓,采取和A相同的方式,將元素分別存儲(chǔ)在1000個(gè)數(shù)組中奏司,這樣處理后乔询,所有可能相同的元素都在對(duì)應(yīng)的小數(shù)組中(a0VSb0,a1VSb1...a999VSb999),不對(duì)應(yīng)的小數(shù)組不可能有相同的元素韵洋,然后只要求出1000對(duì)小數(shù)組中相同的元素即可竿刁。
19菠隆、一個(gè)文件中有100萬個(gè)整數(shù),由空格分開呻待,在程序中判斷用戶輸入的整數(shù)是否在此文件中奏篙。說出最優(yōu)的方法
使用位圖方法,申請足夠的內(nèi)存迫淹,一個(gè)bit位代表一個(gè)unsigned int值报破。讀入100萬數(shù)據(jù),設(shè)置響應(yīng)的bit位千绪,讀入要查詢的數(shù)充易,查看響應(yīng)bit位是否為1,為1表示存在荸型,為0表示不存在盹靴。
https://www.cnblogs.com/hongdada/p/8267032.html
20、一張Bitmap所占內(nèi)存以及內(nèi)存占用的計(jì)算
一張圖片(Bitmap)占用的內(nèi)存=圖片長度*圖片寬度*單位像素占用的字節(jié)數(shù)瑞妇。(圖片長度和圖片寬度的單位是像素)稿静。
21、2000萬個(gè)整數(shù)辕狰,找出第五十大的數(shù)字改备?
采用最小堆。首先讀入前50個(gè)數(shù)字蔓倍,來創(chuàng)建大小為50的最小堆悬钳,建堆的時(shí)間復(fù)雜度O(50log50),然后遍歷后續(xù)數(shù)字偶翅,并與堆頂(最心础)的數(shù)字進(jìn)行比較,如果比最小的數(shù)小聚谁,則繼續(xù)讀取后續(xù)數(shù)字母剥,如果比最小值大,則替換對(duì)頂元素,并重新調(diào)整堆為最小堆环疼,重復(fù)這個(gè)過程直到2000萬個(gè)整數(shù)遍歷完成习霹。此時(shí),采用中序遍歷的方式輸出所有的50個(gè)數(shù)字炫隶,就是前50大的數(shù)字淋叶,第一個(gè)即為第50大的數(shù)字。
22等限、燒一根不均勻的繩爸吮,從頭燒到尾總共需要1個(gè)小時(shí)。現(xiàn)在有若干條材質(zhì)相同的繩子望门,問如何用燒繩的方法來計(jì)時(shí)一個(gè)小時(shí)十五分鐘呢形娇?
先用兩根繩子,一根繩子一頭點(diǎn)火筹误,另一根繩子兩頭點(diǎn)火桐早,當(dāng)?shù)诙K子燃燒完畢的時(shí)候(即半個(gè)小時(shí)),點(diǎn)燃第一根繩子的另一頭厨剪,當(dāng)?shù)谝桓K子燃燒完畢的時(shí)候哄酝,此時(shí)正好45分鐘,然后再點(diǎn)燃第三根繩子的兩頭祷膳,等第三根繩子燒完陶衅,則正好是一個(gè)小時(shí)十五分鐘。
23直晨、求1000以內(nèi)的水仙花數(shù)以及40億以內(nèi)的水仙花數(shù)
24搀军、5枚硬幣,2正3反如何劃分為兩堆然后通過翻轉(zhuǎn)讓兩堆中正面向上的硬8幣和反面向上的硬幣個(gè)數(shù)相同
25勇皇、時(shí)針走一圈罩句,時(shí)針分針重合幾次
11次。
26敛摘、N*N的方格紙,里面有多少個(gè)正方形
n^2 +(n-1)^2 +……+1 = (n+1)(2n+1)n/6個(gè)
27门烂、x個(gè)蘋果,一天只能吃一個(gè)兄淫、兩個(gè)屯远、或者三個(gè),問吃完有多少種吃法拖叙?
(五)插件化氓润、模塊化、組件化薯鳍、熱修復(fù)、增量更新、Gradle
1挖滤、對(duì)熱修復(fù)和插件化的理解
插件化和熱修復(fù)不是同一概念崩溪,插件化顧名思義就是把需要實(shí)現(xiàn)的模塊或是功能當(dāng)做一個(gè)獨(dú)立的提取出來,減少宿主的規(guī)模斩松,當(dāng)需要使用到響應(yīng)的功能時(shí)伶唯,再去加載相應(yīng)的模塊。
熱修復(fù)則往往是從修復(fù)bug的角度出發(fā)惧盹,強(qiáng)調(diào)的是不需要二次安裝應(yīng)用的前提下修復(fù)已知的bug乳幸。
2、插件化原理分析
插樁代理
https://blog.csdn.net/rayht/article/details/79795985
3钧椰、模塊化實(shí)現(xiàn)(好處粹断,原因)
(1)、結(jié)構(gòu)清晰嫡霞,各個(gè)模塊的代碼實(shí)現(xiàn)分離瓶埋,不會(huì)攪在一起。在代碼review或者二次開發(fā)的時(shí)候一目了然诊沪,不會(huì)滿世界去找代碼养筒。
(2)、協(xié)同開發(fā)的時(shí)候更靈活端姚,不用再等同組的其他同事的模塊開發(fā)完成后才能運(yùn)行app晕粪,自己負(fù)責(zé)的模塊稍加修改就可以當(dāng)做主App直接跑起來。
(3)渐裸、便于維護(hù)巫湘。每個(gè)模塊的代碼、布局文件橄仆、資源文件可以隨時(shí)從項(xiàng)目中通過gradle配置去掉剩膘。
4、熱修復(fù),插件化
Android插件化----指將一個(gè)程序劃分成不同的部分盆顾,比如一般App的皮膚樣式就可以看成一個(gè)插件怠褐。
Android組件化-----這個(gè)概念和上邊相差不是那么明顯,組件和插件最大的區(qū)別在于:組件是指通用和復(fù)用性較高的構(gòu)建您宪,比如圖片緩存就可以看成一個(gè)組件被多個(gè)App調(diào)用奈懒。
熱修復(fù)----從bug角度出發(fā),強(qiáng)調(diào)的是在不需要二次安裝應(yīng)用的前提下修復(fù)已知的bug宪巨。
5磷杏、項(xiàng)目組件化的理解
除了有commonLib和app模塊外,還包括按功能劃分的各個(gè)業(yè)務(wù)組件模塊捏卓,之前的包變成現(xiàn)在的組件模塊极祸,增加了層次感;每個(gè)模塊可以單獨(dú)編譯,加快了編譯速度遥金,也為提供單元模塊測試提供了支持浴捆;多人開發(fā)只負(fù)責(zé)自己開發(fā)的模塊,直接避免了版本管理的沖突稿械。
(1)选泻、設(shè)置模塊間的依賴,且使得業(yè)務(wù)模塊可單獨(dú)編譯--通過配置gradle即可解決美莫。
(2)页眯、業(yè)務(wù)模塊之間的跳轉(zhuǎn)以及通信--使用阿里開源的ARouter即可解決。
http://www.reibang.com/p/8b6e6a50e21e
6厢呵、描述清點(diǎn)擊 Android Studio 的 build 按鈕后發(fā)生了什么
Android Studio點(diǎn)擊build后就會(huì)編譯整個(gè)項(xiàng)目窝撵,并將apk安裝到手機(jī)上,這個(gè)過程就是android工程編譯打包的過程述吸。
(1)忿族、打包資源文件,生成R.java文件蝌矛。
輸入:Resource文件(即工程的res文件)
? ? Assets文件(即工程的assets文件夾)
? ? AndroidManifest.xml文件
? ? Android基礎(chǔ)類庫(Android.jar文件)
輸出:R.java文件
? ? ? ? ? 打包好的資源道批。
工具:aapt工具
(2)、處理AIDL文件(沒有可以省略)入撒,生成對(duì)應(yīng)的.java文件
輸入:源碼文件隆豹、aidl文件、freamwork.aidl文件
輸出:對(duì)應(yīng)的.java文件
工具:aidl工具
(3)茅逮、編譯java文件璃赡,生成對(duì)應(yīng)的.class文件。
輸入:源碼文件(包括第一步生成的R.java和第二步生成的aidl.java文件)
? ? ? ? ? 庫文件(.jar文件)
輸出:對(duì)應(yīng)的.class文件
工具:javac工具
(4)献雅、把.class文件轉(zhuǎn)化為Davilk VM支持的.dex文件
輸入:第三步生成的.class文件(包括AIDL碉考、R.java、源代碼生成的.class文件)
? ? 庫文件(.jar文件)
輸出:對(duì)應(yīng)的.dex文件
工具:javac工具
(5)挺身、打包生成未簽名的.apk文件
輸入:打包后的資源文件(包括本地和第三方庫里的)
? 打包后的.dex文件
? ? libs文件(包括.so文件侯谁,如果涉及到C/C++開發(fā)的話)
輸出:未簽名的.apk文件
工具:apkbuilder工具
(6)、對(duì)未簽名的.apk文件進(jìn)行簽名
輸入:未簽名的.apk文件
輸出:簽名的.apk文件
工具:jarsigner工具
(7)章钾、對(duì)簽名后的.apk文件進(jìn)行對(duì)齊處理
輸入:簽名的.apk文件
輸出:對(duì)齊后的.apk文件
工具:zipalign工具
反編譯過程:
(1)墙贱、將apk解壓
(2)、找到classes.dex文件贱傀,用dex2jar工具惨撇,將dex轉(zhuǎn)變?yōu)?jar文件,命令d2j-dex2jar classes.dex
(3)府寒、用jd-gui工具魁衙,將jar文件轉(zhuǎn)換成java文件
(4)报腔、用apktool這個(gè)工具用于最大幅度的還原apk中9-patch圖片、布局纺棺、字符串等等一系列的資源榄笙。命令apktool d Demo.apk邪狞。
(六)架構(gòu)設(shè)計(jì)和設(shè)計(jì)模式
1祷蝌、談?wù)勀銓?duì)Android設(shè)計(jì)模式的理解
Android的設(shè)計(jì)模式一般有MVC,MVP帆卓,MVVM三種
2巨朦、MVC MVP MVVM原理和區(qū)別
MVC是指Modle,View和Controller剑令,將界面糊啡,業(yè)務(wù)邏輯和控制器分開,是一種低耦合的設(shè)計(jì)方式吁津,適用于簡單的應(yīng)用開發(fā)棚蓄。
這種設(shè)計(jì)模式最簡單,但問題有三:
(1)碍脏、View和Model相互可見梭依,耦合度高。
(2)典尾、如果程序復(fù)雜役拴,那么Activity這個(gè)Controller將十分繁瑣復(fù)雜,不容易維護(hù)钾埂。
(3)河闰、Activity角色模糊,View或Model褥紫。
MVP:P是指Presenter姜性,即實(shí)現(xiàn)者,功能與Controller類似髓考。Presenter實(shí)質(zhì)為Interface類的運(yùn)用部念,用于降低M、V绳军、C間的耦合度印机,主旨是為Activity或Fragment瘦身。
MVP模式容易維護(hù)门驾,可拆卸射赛,可擴(kuò)展,耦合性叫MVC較小奶是,結(jié)構(gòu)清晰楣责。
MVP的缺點(diǎn)竣灌,在于開發(fā)開銷相對(duì)較大。與MVC相比秆麸,需要維護(hù)更多的接口初嘹。
MVVM:MVVM由三部分組成,M沮趣,V屯烦,VM,分別代表Modle房铭,View驻龟,ViewModle。談?wù)揗VVM的前提是需要了解DataBinding缸匪,即Modle與View的進(jìn)行綁定翁狐,包括單向綁定(Modle影響View),雙向綁定(Modle與View相互影響)凌蔬。
MVVM的側(cè)重點(diǎn)在于數(shù)據(jù)與UI的聯(lián)動(dòng)露懒,自動(dòng)更新,而非降低耦合度砂心。對(duì)于耦合度的問題懈词,其實(shí)還是需要結(jié)合MVP模式來解決。
3计贰、你所知道的設(shè)計(jì)模式有哪些钦睡?
4、項(xiàng)目中常用的設(shè)計(jì)模式
(1)躁倒、模板方法模式
定義一個(gè)操作中的算法的骨架荞怒,而將一些步驟延遲到子類中,如jdbcTemplate
(2)秧秉、代理模式
spring的Proxy模式在AOP中有體現(xiàn)
(3)褐桌、觀察者模式
定義對(duì)象的一種一對(duì)多的依賴關(guān)系,當(dāng)一個(gè)對(duì)象的狀態(tài)發(fā)生改變時(shí)象迎,所有依賴于它的對(duì)象都得到通知并被自動(dòng)更新
(4)荧嵌、適配器模式
MethodBeforeAdviceAdapter類。
(5)砾淌、策略模式
使用了java的繼承和多態(tài)
(6)啦撮、單例模式
解決了一個(gè)全局使用的類頻繁的創(chuàng)建與銷毀。
(7)汪厨、工廠模式
分為三種:簡單工廠赃春,工廠方法,抽象工廠劫乱。
5织中、手寫生產(chǎn)者/消費(fèi)者模式
生產(chǎn)者消費(fèi)者問題是線程模型中的經(jīng)典問題:生產(chǎn)者和消費(fèi)者在同一時(shí)間段內(nèi)共用同一存儲(chǔ)空間锥涕,生產(chǎn)者向空間里生產(chǎn)數(shù)據(jù),而消費(fèi)者取走數(shù)據(jù)狭吼。
實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式有三點(diǎn):
(1)层坠、一般使用隊(duì)列作為緩沖區(qū),給生產(chǎn)者和消費(fèi)者解耦刁笙,平衡了生產(chǎn)者和消費(fèi)者的處理能力破花。
(2)、構(gòu)建生產(chǎn)者采盒,隊(duì)列滿使得生產(chǎn)者線程阻塞旧乞。
(3)、構(gòu)建消費(fèi)者磅氨,隊(duì)列空使得消費(fèi)者線程阻塞。
BlockingQueue是一個(gè)阻塞隊(duì)列嫡纠,它的存取可以保證只有一個(gè)線程在進(jìn)行烦租,所以根據(jù)邏輯,生產(chǎn)者在內(nèi)存滿的時(shí)候進(jìn)行等待除盏,并喚醒消費(fèi)者隊(duì)列叉橱,反過來消費(fèi)者在饑餓狀態(tài)下,等待并喚醒生產(chǎn)者生產(chǎn)者蠕。
6窃祝、寫出觀察者模式的代碼
從上邊的例子可以看出,定義了四個(gè)訂閱者踱侣,一個(gè)發(fā)布者粪小,當(dāng)發(fā)布者更新一個(gè)消息時(shí),四個(gè)訂閱者都收到消息抡句,根據(jù)發(fā)布者更新的信息執(zhí)行對(duì)應(yīng)的更新操作探膊。
7、適配器模式待榔,裝飾者模式逞壁,外觀模式的異同?
裝飾器模式:能動(dòng)態(tài)的新增或組合對(duì)象的行為锐锣。
適配器模式:是對(duì)其他對(duì)象接口的一種轉(zhuǎn)換行為腌闯,將原接口轉(zhuǎn)換為目標(biāo)接口,達(dá)到適配的效果雕憔。
外觀模式:外觀對(duì)象提供對(duì)子系統(tǒng)各元件功能的簡化為共同層次的調(diào)用接口姿骏,它主要起簡化作用。
裝飾者是“新增行為”橘茉,適配器模式是“轉(zhuǎn)換行為”工腋,外觀者模式是“簡化行為”姨丈。
8、用到的一些開源框架擅腰,介紹一個(gè)看過源碼的蟋恬,內(nèi)部實(shí)現(xiàn)過程。
EventBus是一款在Android開發(fā)中使用的發(fā)布/訂閱事件總線框架趁冈,基于觀察者模式歼争,將事件的接收者和發(fā)送者分開,簡化了組件之間的通信渗勘,使用簡單沐绒、效率高,體積小旺坠。
技術(shù)要點(diǎn):java反射乔遮,ThreadLocal&Queue,單例模式取刃,建造者模式
EventBus以反射開始--注冊蹋肮,以反射結(jié)束--事件的消費(fèi)。
https://blog.csdn.net/json_it/article/details/79948484
9璧疗、談?wù)剬?duì)RxJava的理解
RxJava說到底坯辩,本質(zhì)可以壓縮為異步一個(gè)詞。它就是一個(gè)異步操作的庫崩侠,其他定于都是基于這之上的漆魔。
RxJava的異步實(shí)現(xiàn)是通過一種擴(kuò)展的觀察者模式來實(shí)現(xiàn)的。
10却音、RxJava的功能與原理實(shí)現(xiàn)
RxJava原理就是創(chuàng)建一個(gè)Observable對(duì)象來干活改抡,然后使用各種操作符建立起來的鏈?zhǔn)讲僮鳎腿缤魉€一樣僧家,把你想要處理的數(shù)據(jù)一步一步加工成你想要的成品雀摘,然后發(fā)射給Subscriber處理。
11八拱、RxJava的作用阵赠,與平時(shí)使用的異步操作來比的優(yōu)缺點(diǎn)
異步操作有Handler、AsyncTask等肌稻,但使用Rxjava清蚀,就算再多的異步操作,代碼邏輯越來越復(fù)雜爹谭,RxJava依然可以保持清晰的邏輯枷邪。
http://www.reibang.com/p/57b5c6567791
12、說說EventBus作用诺凡,實(shí)現(xiàn)方式东揣,代替EventBus的方式
EventBus作用:簡化各組件間的通信践惑,讓我們書寫代碼更簡單,能有效的分離事件發(fā)送方和事件接收方(也就是解耦合)嘶卧,能避免復(fù)雜和容易出錯(cuò)的依賴性和生命周期的問題怒坯。
RxJava可以替代EventBus向臀,也可以使用Handler或AsyncTask
13逗柴、從0設(shè)計(jì)一款A(yù)pp整體架構(gòu)夫啊,如何去做?
(1)钟鸵、構(gòu)建方式:Gradle或Maven
(2)钉稍、網(wǎng)絡(luò)框架:包括網(wǎng)絡(luò)請求,圖片異步加載棺耍,圖片緩存贡未,網(wǎng)絡(luò)緩存,力求簡單易用烈掠。
(3)羞秤、適配資源。
(4)左敌、設(shè)計(jì)模式:MVC、MVP俐镐、MVVM
14矫限、說一款你認(rèn)為當(dāng)前比較火的應(yīng)用并設(shè)計(jì)(比如:直播APP,P2P金融佩抹,小視頻等)
15叼风、談?wù)剬?duì)java狀態(tài)機(jī)理解
狀態(tài)機(jī)包含一個(gè)狀態(tài)集合,定義當(dāng)狀態(tài)機(jī)處于某一個(gè)狀態(tài)的時(shí)候它所能接受的事件以及可執(zhí)行的行為棍苹,執(zhí)行完后无宿,狀態(tài)機(jī)所處的狀態(tài)。
http://www.reibang.com/p/d48e0d565618
16枢里、Fragment如果在Adapter中使用應(yīng)該如何解耦孽鸡?
接口回調(diào),廣播
17栏豺、Binder機(jī)制及底層實(shí)現(xiàn)
IPC原理:
每個(gè)Android進(jìn)程彬碱,只能運(yùn)行在自己進(jìn)程所擁有的虛擬地址空間。對(duì)應(yīng)一個(gè)4GB的虛擬地址空間奥洼,其中3GB是用戶空間巷疼,1GB是內(nèi)核空間,當(dāng)然內(nèi)核空間的大小可以通過參數(shù)配置進(jìn)行調(diào)整灵奖。對(duì)于用戶空間嚼沿,不同進(jìn)程之間彼此是不共享的估盘,而內(nèi)核空間確實(shí)可共享的。Client進(jìn)程向Server進(jìn)程通信骡尽,恰恰是利用了進(jìn)程間可共享內(nèi)核空間來完成底層通信工作的遣妥,Client端與Server端進(jìn)程往往采用ioctl等方法跟內(nèi)核空間的驅(qū)動(dòng)進(jìn)行交互。
Binder原理:
Binder通信采用C/S架構(gòu)爆阶,從組件視角來說燥透,包含Client、Server辨图、ServiceManager以及binder驅(qū)動(dòng)班套,其中ServerManager用于管理系統(tǒng)中的各種服務(wù)。
Binder通信的四個(gè)角色:
Client進(jìn)程:使用服務(wù)的進(jìn)程故河。
Server進(jìn)程:提供服務(wù)的進(jìn)程吱韭。
ServiceManager進(jìn)程:ServiceManager的作用是將字符串形式的Binder名字轉(zhuǎn)化成Client中對(duì)該Binder的引用,使得Client能夠通過Binder名字獲得對(duì)Server中Binder實(shí)體的引用鱼的。
Binder驅(qū)動(dòng):驅(qū)動(dòng)負(fù)責(zé)進(jìn)程之間Binder通信的建立理盆,Binder在進(jìn)程之間的傳遞,Binder引用計(jì)數(shù)管理凑阶,數(shù)據(jù)包在進(jìn)程間的傳遞交互等一系列底層支持猿规。
http://www.reibang.com/p/4920c7781afe?from=jiantop.com
18、對(duì)于應(yīng)用更新這塊是如何做的宙橱?(解答:灰度姨俩,強(qiáng)制更新,分區(qū)域更新)师郑?
19环葵、實(shí)現(xiàn)一個(gè)Json解析器(可以通過正則提高速度)
https://www.cnblogs.com/mahuan2/p/8034392.html
20、統(tǒng)計(jì)啟動(dòng)時(shí)長,標(biāo)準(zhǔn)
啟動(dòng)類型
(1)宝冕、冷啟動(dòng):application沒有被創(chuàng)建张遭,需要先創(chuàng)建進(jìn)程,然后啟動(dòng)MainActivity地梨。由于這個(gè)過程需要fork一個(gè)新進(jìn)程菊卷,所以耗時(shí)。
(2)湿刽、熱啟動(dòng):同上面對(duì)照的烁,已經(jīng)啟動(dòng)過application,并駐留在系統(tǒng)內(nèi)存內(nèi)诈闺,只是需要喚醒該進(jìn)程渴庆,并啟動(dòng)MainActivity。
啟動(dòng)時(shí)長統(tǒng)計(jì):
adb統(tǒng)計(jì):adb shell am start -w pageage/activityname 通過這條命令啟動(dòng),可以獲得啟動(dòng)時(shí)間襟雷。
(七)性能優(yōu)化
1刃滓、如何對(duì)Android 應(yīng)用進(jìn)行性能分析以及優(yōu)化?
http://www.reibang.com/p/da2a4bfcba68
2、ddms 和 traceView
TraceView是AndroidSDK自帶的工具耸弄,用于Android應(yīng)用程序及Framework層的代碼進(jìn)行性能分析咧虎。
TraceView是一個(gè)圖形化工具,最終它會(huì)產(chǎn)生一個(gè)圖表计呈,用于對(duì)性能分析進(jìn)行說明砰诵。
TraceView原理:TraceView通過修改code,在需要調(diào)試的起始位置加入調(diào)試函數(shù)捌显,程序運(yùn)行之后會(huì)在SD的根目錄下產(chǎn)生*.trace文件來保存運(yùn)行時(shí)數(shù)據(jù)茁彭,然后把*.trace文件拷貝到PC機(jī)上,通過traceview命令對(duì)*.trace文件進(jìn)行分析扶歪。
DDMS:
(1)理肺、查看進(jìn)程的堆棧使用情況。
(2)善镰、跟蹤對(duì)象的內(nèi)存分配
(3)妹萨、操作仿真器或設(shè)備的文件系統(tǒng)。
(4)炫欺、檢查線程信息乎完。
(5)、方法分析品洛。
(6)囱怕、使用的網(wǎng)絡(luò)流量工具
(7)、使用LogCat
(8)毫别、模擬電話業(yè)務(wù)和位置
(9)、模擬來電或SMS文本信息
(10)典格、設(shè)置手機(jī)地理位置岛宦。
https://blog.csdn.net/liu515714312/article/details/20034813
3、性能優(yōu)化如何分析systrace耍缴?
Systrace原理:在系統(tǒng)一些關(guān)鍵鏈路(比如System Service砾肺,虛擬機(jī),Binder驅(qū)動(dòng))插入一些信息(這里稱為Label)防嗡,通過Label的開始和結(jié)束來確定某個(gè)核心過程的執(zhí)行時(shí)間变汪,然后把這些Label信息收集起來得到系統(tǒng)關(guān)鍵路徑的運(yùn)行時(shí)間信息,進(jìn)而得到整個(gè)系統(tǒng)的運(yùn)行性能信息蚁趁。
http://www.reibang.com/p/fa6cfad8ccc2
4裙盾、用IDE如何分析內(nèi)存泄漏?
(1)、把java應(yīng)用程序使用的heap dump下來番官。
(2)庐完、使用java heap分析工具,找出內(nèi)存占用超出預(yù)期的嫌疑對(duì)象徘熔。
(3)门躯、必要時(shí),需要分析嫌疑對(duì)象和其他對(duì)象的引用關(guān)系酷师。
(4)讶凉、查看程序的源代碼,找出嫌疑對(duì)象數(shù)量過多的原因山孔。
https://blog.csdn.net/u010944680/article/details/51721532
5懂讯、Java多線程引發(fā)的性能問題,怎么解決饱须?
創(chuàng)建線程的方式:繼承Thread類域醇;實(shí)現(xiàn)Runnable接口
兩種方式的主要區(qū)別在于多線程訪問同一資源的情況下,用Runnable創(chuàng)建的線程可以處理同一資源蓉媳,而Thread類創(chuàng)建的線程則各自獨(dú)立處理譬挚,各自擁有自己的資源。
多線程引發(fā)的問題:
(1)酪呻、線程的創(chuàng)建和銷毀都需要時(shí)間减宣,當(dāng)有大量的線程創(chuàng)建和銷毀時(shí),那么這些時(shí)間的消耗則比較明顯玩荠,將導(dǎo)致性能上的缺失漆腌。
(2)、大量的線程創(chuàng)建阶冈、執(zhí)行和銷毀是非常耗CPU和內(nèi)存的闷尿,這樣直接影響系統(tǒng)的吞吐量,導(dǎo)致性能急劇下降女坑,如果內(nèi)存資源占用的比較多填具,還很可能造成OOM。
(3)匆骗、大量的線程的創(chuàng)建和銷毀很容易導(dǎo)致GC頻繁的執(zhí)行劳景,從而發(fā)生內(nèi)存抖動(dòng)現(xiàn)象,而發(fā)生內(nèi)存抖動(dòng)碉就,對(duì)移動(dòng)端來講盟广,最大的影響就是造成頁面卡頓。
解決辦法:
重用已有的線程瓮钥,從而減少線程的創(chuàng)建和銷毀筋量,這就需要使用線程池烹吵,線程池的基本作用就是進(jìn)行線程的復(fù)用。
6毛甲、啟動(dòng)頁白屏及黑屏解決年叮?
原因:
在啟動(dòng)Activity時(shí),執(zhí)行setContentView(R.layout.activity_splash)出現(xiàn)白屏玻募。
onCreate----setContentView這個(gè)并不是發(fā)生在窗體繪制的第一步只损,系統(tǒng)會(huì)在執(zhí)行這個(gè)步驟前,先繪制窗體七咧,這時(shí)候布局資源還沒有加載跃惫,于是就使用默認(rèn)背景色。
這種亮色系造成白色閃屏艾栋。
這種暗色系主題爆存,造成黑色閃屏。
解決方案:
(1)蝗砾、把啟動(dòng)圖bd_splash設(shè)置為窗體背景先较,避免剛剛啟動(dòng)App時(shí)出現(xiàn)黑/白屏。
(2)悼粮、設(shè)置為背景bd_splash顯示時(shí)闲勺,后臺(tái)負(fù)責(zé)加載資源,同時(shí)去下載廣告扣猫,廣告圖下載成功或超時(shí)時(shí)菜循,顯示SplashActivity的真實(shí)樣子。
(3)申尤、隨后進(jìn)入MainActivity
7癌幕、啟動(dòng)太慢怎么解決?
應(yīng)用啟動(dòng)速度取決于application中做了什么事情昧穿,比如繼承了很多sdk勺远,并且sdk的init操作都需要在主線程中實(shí)現(xiàn),那自然就慢了时鸵。在非必要的情況下谚中,可以把加載延后,或丟給子線程寥枝。
8、怎么保證應(yīng)用啟動(dòng)不卡頓磁奖?
同上邊是一個(gè)道理囊拜,也可以做一個(gè)閃屏頁當(dāng)緩沖時(shí)間。
9比搭、App啟動(dòng)崩潰異常捕捉
http://www.reibang.com/p/fb28a5322d8a
10冠跷、自定義View注意事項(xiàng)
減少不必要的invalidate()方法。
(1)、降低刷新頻率
(2)蜜托、使用硬件加速
(3)抄囚、初始化時(shí)創(chuàng)建對(duì)象;不要在onDraw方法內(nèi)創(chuàng)建繪制對(duì)象橄务,一般都在構(gòu)造函數(shù)里初始化對(duì)象幔托。
(4)、狀態(tài)存儲(chǔ)和恢復(fù):如果內(nèi)存不足時(shí)蜂挪,而恰好我們的Activity置于后臺(tái)重挑,不行被重啟,或者用戶旋轉(zhuǎn)屏幕造成Activity重啟棠涮,我們的View也應(yīng)該盡量的去保存自己的屬性谬哀。
11、現(xiàn)在下載速度很慢,試從網(wǎng)絡(luò)協(xié)議的角度分析原因,并優(yōu)化(提示:網(wǎng)絡(luò)的5層都可以涉及)严肪。
12史煎、Https請求慢的解決辦法(提示:DNS,攜帶數(shù)據(jù)驳糯,直接訪問IP)
Http耗時(shí) = TCP握手
HTTPS耗時(shí) = TCP握手 + SSL握手
13篇梭、如何保持應(yīng)用的穩(wěn)定性
需要借助內(nèi)存分析工具防止內(nèi)存泄漏。
14结窘、RecyclerView和ListView的性能對(duì)比
http://www.reibang.com/p/171b20389634
15很洋、ListView的優(yōu)化
convertView的使用,主要優(yōu)化加載布局問題隧枫。
內(nèi)部類ViewHolder的使用喉磁。
16、RecycleView優(yōu)化
給item設(shè)置點(diǎn)擊事件和長按事件官脓。
給item中的控件設(shè)置點(diǎn)擊事件和長按事件协怒。
17、View渲染
https://blog.csdn.net/csdn1125550225/article/details/80401365
18卑笨、Bitmap如何處理大圖孕暇,如一張30M的大圖,如何預(yù)防OOM
需要將這張大圖進(jìn)行壓縮赤兴。
使用圖片緩存妖滔。
https://blog.csdn.net/guolin_blog/article/details/9316683
19、java中的四種引用的區(qū)別以及使用場景
強(qiáng)引用:如果一個(gè)對(duì)象具有強(qiáng)引用桶良,那么垃圾回收器絕不會(huì)回收它座舍。
軟引用:如果一個(gè)對(duì)象具有軟引用,則內(nèi)存空間足夠陨帆,垃圾回收器不會(huì)回收它曲秉,如果內(nèi)存空間不足了采蚀,就會(huì)回收這些對(duì)象。
弱引用:弱引用與軟引用的區(qū)別在于承二,只具有弱引用的對(duì)象擁有更短暫的生命周期榆鼠。
虛引用:如果一個(gè)對(duì)象僅持有虛引用,那么它就和沒有任何引用一樣亥鸠,在任何時(shí)候都可能被垃圾回收器回收妆够。
總結(jié):弱引用和軟引用都可以用來保存對(duì)象的實(shí)例引用,這兩個(gè)類與垃圾回收有關(guān)读虏。
弱引用其中保存的對(duì)象實(shí)例可以被GC回收掉责静。這個(gè)類通常用于在某處保存對(duì)象的引用,而又不干擾該對(duì)象被GC回收盖桥,通常用于Debug灾螃、內(nèi)存監(jiān)視工具等程序中。
強(qiáng)引用保存的對(duì)象實(shí)例揩徊,除非JVM即將OutOfMemory腰鬼,否則就不會(huì)被GC回收。
20塑荒、強(qiáng)引用置為null熄赡,會(huì)不會(huì)被回收?
會(huì)齿税,GC執(zhí)行時(shí)彼硫,就會(huì)被回收掉,前提是沒有被引用的對(duì)象凌箕。
https://blog.csdn.net/qq_33048603/article/details/52727991
(八)NDK拧篮、jni、Binder牵舱、AIDL串绩、進(jìn)程通信有關(guān)
1、請介紹一下NDK
Native Development Kit芜壁,是Android的開發(fā)工具包礁凡。
作用:快速開發(fā)C/C++的動(dòng)態(tài)庫,并自動(dòng)將so和應(yīng)用一起打包成apk慧妄。
即可通過NDK在Android中使用JNI與本地代碼(C/C++)交互顷牌。
2、什么是NDK庫?
Native Development Kit塞淹,是Android的開發(fā)工具包韧掩。
版本一般使用:android-ndk-r14b-darwin-x86_64 或16版本的。
3窖铡、jni用過嗎疗锐?
用過
4、如何在jni中注冊native函數(shù)费彼,有幾種注冊方式?
靜態(tài)方法:這種方法比較常見滑臊,大致流程如下:
(1)、先創(chuàng)建java類箍铲,聲明Native方法雇卷,編譯成.class文件
(2)、使用javah命令生成C/C++的頭文件颠猴。
(3)关划、創(chuàng)建.h的源文件,實(shí)現(xiàn)對(duì)應(yīng)的native方法翘瓮。
動(dòng)態(tài)注冊:
JNI中有一個(gè)叫JNINativeMethod的結(jié)構(gòu)體來保存這個(gè)對(duì)應(yīng)的關(guān)系贮折,實(shí)現(xiàn)動(dòng)態(tài)注冊就需要這個(gè)結(jié)構(gòu)體。
https://blog.csdn.net/wwj_748/article/details/52347341
5资盅、Java如何調(diào)用c调榄、c++語言?
直接調(diào)用java中的native方法即可呵扛。
6每庆、jni如何調(diào)用java層代碼?
C調(diào)用java中的方法使用的是反射
(1)今穿、獲取字節(jié)碼文件(jclass(FindClass)(JNIEnv,const char*);)
(2)缤灵、通過字節(jié)碼對(duì)象找到方法對(duì)象(jmethodID(GetMethodID)(JNIEnv,jclass,const char,const char);)
(3)、通過字節(jié)碼文件創(chuàng)建一個(gè)object對(duì)象(該方法可選蓝晒,方法中已經(jīng)傳遞了一個(gè)object腮出,如果需要調(diào)用的方法與本地方法不在同一個(gè)文件夾則需要?jiǎng)?chuàng)建新的object(jobject(AllocObject)(JNIEvn,jclass);),如果需要反射調(diào)用的java方法與本地方法不在同一個(gè)類中拔创,需要?jiǎng)?chuàng)建該方法利诺,但是如果是這樣,并且需要更新UI操作剩燥,這個(gè)時(shí)候就會(huì)報(bào)空指針異常慢逾,因?yàn)檫@個(gè)時(shí)候調(diào)用的方法只是一個(gè)方法,沒有Activity聲明周期)灭红。
(4)侣滩、通過對(duì)象調(diào)用方法,可以調(diào)用空參數(shù)方法变擒,也可以調(diào)用有參數(shù)的方法君珠,并將參數(shù)通過調(diào)用的方法傳入(void(CallVoidMethod)(JNIEvn,jobject,jmethodID,...))。
7娇斑、進(jìn)程間通信的方式策添?
(1)材部、AIDL:功能強(qiáng)大,支持進(jìn)程間一對(duì)多的實(shí)時(shí)并發(fā)通信唯竹,并可實(shí)現(xiàn)RPC(遠(yuǎn)程過程調(diào)用)
(2)乐导、Messenger:支持一對(duì)多的串行實(shí)時(shí)通信,AIDL的簡化版本浸颓。
(3)物臂、Bundle:四大組件的進(jìn)程通信方式,只能傳輸Bundle支持的數(shù)據(jù)類型产上。
(4)棵磷、ContentProvider:強(qiáng)大的數(shù)據(jù)源訪問支持,主要支持CRUD操作晋涣,一對(duì)多進(jìn)程間數(shù)據(jù)共享仪媒。
(5)、Broadcast Receiver:廣播姻僧,但只能單向通信规丽,接收者只能被動(dòng)接受信息。
(6)撇贺、文件共享:在非高并發(fā)的情況下共享簡單的數(shù)據(jù)赌莺。
(7)、Socket:通過網(wǎng)絡(luò)傳輸數(shù)據(jù)松嘶。
8艘狭、Binder機(jī)制
IPC原理:
每個(gè)Android進(jìn)程,只能運(yùn)行在自己進(jìn)程所擁有的虛擬地址空間翠订。對(duì)應(yīng)一個(gè)4GB的虛擬地址空間巢音,其中3GB是用戶空間,1GB是內(nèi)核空間尽超,當(dāng)然內(nèi)核空間的大小可以通過參數(shù)配置進(jìn)行調(diào)整官撼。對(duì)于用戶空間,不同進(jìn)程之間彼此是不共享的似谁,而內(nèi)核空間確實(shí)可共享的戚丸。Client進(jìn)程向Server進(jìn)程通信窖逗,恰恰是利用了進(jìn)程間可共享內(nèi)核空間來完成底層通信工作的,Client端與Server端進(jìn)程往往采用ioctl等方法跟內(nèi)核空間的驅(qū)動(dòng)進(jìn)行交互。
Binder原理:
Binder通信采用C/S架構(gòu)寥裂,從組件視角來說捧弃,包含Client叠洗、Server愧膀、ServiceManager以及binder驅(qū)動(dòng),其中ServerManager用于管理系統(tǒng)中的各種服務(wù)。
Binder通信的四個(gè)角色:
Client進(jìn)程:使用服務(wù)的進(jìn)程毅往。
Server進(jìn)程:提供服務(wù)的進(jìn)程牵咙。
ServiceManager進(jìn)程:ServiceManager的作用是將字符串形式的Binder名字轉(zhuǎn)化成Client中對(duì)該Binder的引用,使得Client能夠通過Binder名字獲得對(duì)Server中Binder實(shí)體的引用攀唯。
Binder驅(qū)動(dòng):驅(qū)動(dòng)負(fù)責(zé)進(jìn)程之間Binder通信的建立霜大,Binder在進(jìn)程之間的傳遞,Binder引用計(jì)數(shù)管理革答,數(shù)據(jù)包在進(jìn)程間的傳遞交互等一系列底層支持。
http://www.reibang.com/p/4920c7781afe?from=jiantop.com
9曙强、簡述IPC残拐?
IPC是Interface Process Connection的縮寫,含義為進(jìn)程間通信或跨進(jìn)程通信碟嘴,指兩個(gè)進(jìn)程間進(jìn)行數(shù)據(jù)交換的過程溪食。
10、什么是AIDL娜扇?
AIDL是Android中IPC的方式的一種错沃。AIDL的作用是讓你可以在自己的APP里綁定一個(gè)其他的APP的Service,這樣你的APP可以與其他APP交互雀瓢。
11枢析、AIDL解決了什么問題?
只有當(dāng)你允許來自不同的客戶端訪問你的服務(wù)并且需要處理多線程問題時(shí)才必須用AIDL刃麸。
12醒叁、AIDL如何使用?
服務(wù)端:
(1)泊业、定義一個(gè)*.aidl的文件
(2)把沼、實(shí)現(xiàn)AIDL文件生成的java接口
(3)、定義一個(gè)自己的Service吁伺,在實(shí)現(xiàn)Service時(shí)饮睬,為了其他應(yīng)用可以通過bindService來和我們的Service進(jìn)行交互,我們都要實(shí)現(xiàn)Service中的onBind()方法篮奄,并且返回一個(gè)繼承了Binder的內(nèi)部類捆愁。
(4)、同一應(yīng)用中的Activity為該Service賦值宦搬,使用Service
客戶端:
(1)牙瓢、客戶端要想使用該服務(wù),需要知道服務(wù)在aidl文件中提供了什么服務(wù)间校,所以需要將服務(wù)端的aidl文件拷貝到客戶端矾克,且包名和文件名需要與服務(wù)端一致。
(2)憔足、通過bindService方法與Service交互胁附,該方法中有一個(gè)ServiceConnection類型的參數(shù)酒繁,主要代碼便是在該接口中實(shí)現(xiàn)。
(3)控妻、在ServiceConnection實(shí)現(xiàn)類中onServiceConnected方法中通過*.asInterface(service)獲取一個(gè)aidl接口的實(shí)例州袒。
https://www.cnblogs.com/yoyohong/p/5660406.html
13、Android 上的 Inter-Process-Communication 跨進(jìn)程通信時(shí)如何工作的弓候?
Client進(jìn)程向Server進(jìn)程通信郎哭,恰恰是利用了進(jìn)程間可共享內(nèi)核空間來完成底層通信工作的,Client端與Server端進(jìn)程往往采用ioctl等方法跟內(nèi)核空間的驅(qū)動(dòng)進(jìn)行交互菇存。
14夸研、多進(jìn)程場景遇見過么?
遇見過
15依鸥、Android進(jìn)程分類亥至?
前臺(tái)進(jìn)程:需要用戶當(dāng)前正在進(jìn)行的操作
可視進(jìn)程:做用戶當(dāng)前意識(shí)到的工作。
服務(wù)進(jìn)程:含有以startService方法啟動(dòng)的Service
緩存/后臺(tái)進(jìn)程:系統(tǒng)如有內(nèi)存需要贱迟,可隨意殺死姐扮。
16、進(jìn)程和 Application 的生命周期衣吠?
進(jìn)程的生命周期茶敏,優(yōu)先級(jí)從高到底
(1)、前臺(tái)進(jìn)程蒸播,比如Activity的Resume狀態(tài)睡榆。
(2)、可見進(jìn)程袍榆,比如主Activity上彈出一個(gè)對(duì)話框胀屿,該Activity的進(jìn)程狀態(tài)就為可見進(jìn)程。
(3)包雀、服務(wù)進(jìn)程宿崭,比如正在運(yùn)行的Service的狀態(tài)。
(4)才写、后臺(tái)進(jìn)程葡兑,比如Activity,按Home鍵之后的狀態(tài)赞草。
(5)讹堤、空進(jìn)程,該進(jìn)程狀態(tài)主要用來緩存進(jìn)程厨疙,保存一些進(jìn)程的數(shù)據(jù)洲守,方便下次啟動(dòng)的時(shí)候,直接從緩存讀取數(shù)據(jù)。
Application的生命周期:
(1)梗醇、onCreate在創(chuàng)建應(yīng)用程序時(shí)調(diào)用知允。可以重寫這個(gè)方法來實(shí)現(xiàn)實(shí)例化應(yīng)用程序單態(tài)叙谨,以及創(chuàng)建和實(shí)例化任何程序狀態(tài)變量和共享資源温鸽。
(2)、onLowMemory當(dāng)系統(tǒng)處于資源匱乏的時(shí)候手负,具有良好行為的應(yīng)用程序可以釋放額外的內(nèi)存涤垫。這個(gè)方法一般只會(huì)在后臺(tái)進(jìn)程已經(jīng)終止,但是前臺(tái)應(yīng)用程序仍然缺少內(nèi)存時(shí)調(diào)用竟终”㈡ⅲ可以重寫這個(gè)處理程序來清空緩存或釋放不必要的資源。
(3)衡楞、onTrimMemory作為onLowMemory的一個(gè)特定于應(yīng)用程序的替代選擇,在Android4.0時(shí)引入敦姻。當(dāng)運(yùn)行時(shí)決定當(dāng)前應(yīng)用程序應(yīng)該嘗試減少其內(nèi)存開銷時(shí)調(diào)用瘾境,它包含一個(gè)level參數(shù),用于提供請求的上下文镰惦。
(4)迷守、onConfigurationChanged與Activity不同,在配置改變時(shí)旺入,應(yīng)用程序?qū)ο蟛粫?huì)被終止和重啟兑凿。如果應(yīng)用程序使用的值依賴于特定的配置,則重寫這個(gè)方法來重新加載這些值茵瘾,或在應(yīng)用程序級(jí)別處理配置改變礼华。
17、進(jìn)程調(diào)度
(1)拗秘、優(yōu)先級(jí)調(diào)度
(2)圣絮、組優(yōu)先級(jí)調(diào)度
(3)、調(diào)度策略
(4)雕旨、進(jìn)程adj調(diào)度
http://www.51testing.com/html/96/n-3723996-2.html
18扮匠、談?wù)剬?duì)進(jìn)程共享和線程安全的認(rèn)識(shí)
可以通過uid實(shí)現(xiàn)進(jìn)程共享。
線程安全:如果代碼所在的進(jìn)程中有多個(gè)線程在同時(shí)運(yùn)行凡涩,而這些線程有可能同時(shí)運(yùn)行這段代碼棒搜。如果每次運(yùn)行結(jié)果和單線程運(yùn)行結(jié)果是一樣的,而且其他變量的值也和預(yù)期的是一樣的活箕,就是線程安全的力麸。
19、談?wù)剬?duì)多進(jìn)程開發(fā)的理解以及多進(jìn)程應(yīng)用場景
在開發(fā)中,我們通常會(huì)使用修改清單文件的android:process來達(dá)到多進(jìn)程的目的末盔。如果android:process的value值以冒號(hào)開頭的話筑舅,那么該進(jìn)程就是私有進(jìn)程,如果以其他字符開頭陨舱,則是公有進(jìn)程翠拣,這樣擁有相同ShareUID的不同應(yīng)用可以跑在同一進(jìn)程中。
多進(jìn)程應(yīng)用場景:做音樂播放器(在新的進(jìn)程中游盲,啟動(dòng)前臺(tái)Service误墓,播放音樂);多模塊應(yīng)用益缎。
20谜慌、什么是協(xié)程?
協(xié)程提供了一種新的異步執(zhí)行方式莺奔。
(九)framework層欣范、ROM定制、Ubuntu令哟、Linux之類的問題
1恼琼、java虛擬機(jī)的特性
2、談?wù)剬?duì)jvm的理解
JVM是java的核心和基礎(chǔ)屏富,在java編譯器和os平臺(tái)之間的虛擬處理器晴竞。
JVM的執(zhí)行過程:
(1)、加載.class文件
(2)狠半、管理并分配內(nèi)存噩死。
(3)、執(zhí)行垃圾收集神年。
3已维、JVM內(nèi)存區(qū)域,開線程影響哪塊內(nèi)存
每當(dāng)有線程創(chuàng)建的時(shí)候已日,JVM就需要為其在內(nèi)存中分配虛擬機(jī)棧和本地方法棧來記錄調(diào)用方法的內(nèi)容衣摩,分配程序計(jì)數(shù)器記錄指令執(zhí)行的位置,這樣的內(nèi)存消耗就是創(chuàng)建線程的內(nèi)存代價(jià)捂敌。
4艾扮、對(duì)Dalvik、ART虛擬機(jī)有什么了解占婉?
JVM執(zhí)行的是.class文件
DVM執(zhí)行的是由.class文件轉(zhuǎn)化來的dex文件
DVM可執(zhí)行文件更小泡嘴,JVM基于棧,DVM基于寄存器
ART虛擬機(jī)執(zhí)行的是本地機(jī)器碼
5逆济、Art和Dalvik對(duì)比
DVM運(yùn)行的是dex文件酌予,ART運(yùn)行的是本地機(jī)器碼
ART在應(yīng)用第一次安裝的時(shí)候字節(jié)碼就會(huì)預(yù)編譯成機(jī)器碼磺箕,使其成為真正的本地應(yīng)用。這個(gè)過程叫做預(yù)編譯抛虫。這樣應(yīng)用的啟動(dòng)(首次)和執(zhí)行都會(huì)更快
dex不能直接被ART虛擬機(jī)執(zhí)行松靡,Google已經(jīng)放棄了DVM,可以直接研究ART建椰。
6雕欺、虛擬機(jī)原理,如何自己設(shè)計(jì)一個(gè)虛擬機(jī)(內(nèi)存管理棉姐,類加載屠列,雙親委派)
7、談?wù)勀銓?duì)雙親委派模型理解
上圖中類加載器之間的這種層次關(guān)系伞矩,稱為類加載器的雙親委派模型笛洛。雙親委派模型要求除了頂層的啟動(dòng)類加載器,其余的類加載器都應(yīng)該有自己的父類加載器乃坤。這里類加載器之間的父子關(guān)系一般不會(huì)以繼承關(guān)系來實(shí)現(xiàn)苛让,而是使用組合關(guān)系來復(fù)用父加載器的代碼。
雙親委托模型的工作過程是:如果一個(gè)類加載器收到了類加載器的請求湿诊,它首先不會(huì)自己嘗試加載這個(gè)類蝌诡,而是把這個(gè)請求委托給父類加載器去完成,每一個(gè)層次的類加載器都是如此枫吧,因此所有的加載請求最后都應(yīng)該傳送到頂層的啟動(dòng)類加載器中,只有當(dāng)父類加載器反饋?zhàn)约簾o法完成這個(gè)加載請求(它的搜索范圍內(nèi)沒有找到所需的類時(shí))宇色,子類才會(huì)嘗試自己去加載九杂。
8、JVM內(nèi)存模型宣蠕,內(nèi)存區(qū)域
9例隆、類加載機(jī)制
類從被加載到虛擬機(jī)的內(nèi)存開始,到卸載出內(nèi)存為止抢蚀,整個(gè)生命周期包括:加載镀层、驗(yàn)證、準(zhǔn)備皿曲、解析唱逢、初始化、使用和卸載七大階段屋休。
10坞古、談?wù)剬?duì)ClassLoader(類加載器)的理解
程序啟動(dòng)的時(shí)候,并不會(huì)一次性加載程序所要用的所有的class文件劫樟,而是根據(jù)程序需要痪枫,通過java的類加載機(jī)制(ClassLoader)來動(dòng)態(tài)的加載某個(gè)class文件到內(nèi)存當(dāng)中去织堂,從而只有class文件被加載到內(nèi)存之后,才能被其他的class所引用奶陈。所以ClassLoader就是動(dòng)態(tài)的加載class文件到內(nèi)存中的易阳。
11、談?wù)剬?duì)動(dòng)態(tài)加載(OSGI)的理解
12吃粒、內(nèi)存對(duì)象的循環(huán)引用及避免
兩個(gè)實(shí)例對(duì)象相互引用就會(huì)造成循環(huán)引用潦俺。
13、內(nèi)存回收機(jī)制声搁、GC回收策略黑竞、GC原理時(shí)機(jī)以及GC對(duì)象
對(duì)象回收使用引用計(jì)數(shù)法和可達(dá)性算法
GC回收策略:
新生代可用GC策略:
標(biāo)記--清除算法
復(fù)制算法
標(biāo)記--整理算法
分代收集算法
GC原理時(shí)機(jī):為新對(duì)象分配內(nèi)存時(shí),Eden區(qū)沒有足夠空間時(shí)會(huì)發(fā)生MinorGC疏旨。
老年代沒有足夠空間時(shí)很魂,會(huì)進(jìn)行Full GC
14、垃圾回收機(jī)制與調(diào)用System.gc()區(qū)別
System.gc()顯示的通知jvm進(jìn)行一次垃圾回收檐涝,但垃圾回收機(jī)制具體在什么時(shí)間運(yùn)行是無法預(yù)知的遏匆。
15、Ubuntu編譯安卓系統(tǒng)
https://www.cnblogs.com/chenfeifen/p/9864517.html
16谁榜、系統(tǒng)啟動(dòng)流程是什么幅聘?(提示:Zygote進(jìn)程 –> SystemServer進(jìn)程 –> 各種系統(tǒng)服務(wù) –> 應(yīng)用進(jìn)程)
17、大體說清一個(gè)應(yīng)用程序安裝到手機(jī)上時(shí)發(fā)生了什么
18窃植、簡述Activity啟動(dòng)全部過程
http://www.reibang.com/p/10effba8eed6
19帝蒿、App啟動(dòng)流程,從點(diǎn)擊桌面開始
20巷怜、邏輯地址與物理地址葛超,為什么使用邏輯地址?
邏輯地址:在具有地址變換功能的計(jì)算機(jī)中延塑,訪問指令給出的操作數(shù)绣张。
物理地址:用于內(nèi)存芯片級(jí)單元尋址,與CPU連接的地址總線相對(duì)應(yīng)关带。
任何一個(gè)獨(dú)立運(yùn)行的程序侥涵,都需要系統(tǒng)分配單獨(dú)的內(nèi)存空間,大多數(shù)情況下這個(gè)工作是由系統(tǒng)完成的宋雏,方便程序訪問變量芜飘,程序不需要關(guān)心變量的物理地址。現(xiàn)代操作系統(tǒng)都提供了一種內(nèi)存管理的抽象磨总,即虛擬內(nèi)存燃箭。進(jìn)程使用虛擬內(nèi)存的邏輯地址范文,操作系統(tǒng)協(xié)助轉(zhuǎn)換成真正的物理地址舍败。
21招狸、Android為每個(gè)應(yīng)用程序分配的內(nèi)存大小是多少敬拓?
默認(rèn)是16M
22、Android中進(jìn)程內(nèi)存的分配裙戏,能不能自己分配定額內(nèi)存乘凸?
23、進(jìn)程崩郯瘢活的方式
黑色庇冢活:不同app進(jìn)程,用廣播相互喚醒(包括利用系統(tǒng)提供的廣播進(jìn)行喚醒)壹罚。
白色备鹱鳎活:啟動(dòng)前臺(tái)Service
灰色保活:利用系統(tǒng)漏洞啟動(dòng)前臺(tái)Service
http://www.reibang.com/p/63aafe3c12af
24猖凛、如何保證一個(gè)后臺(tái)服務(wù)不被殺死赂蠢?(相同問題:如何保證service在后臺(tái)不被kill?)比較省電的方式是什么辨泳?
(1)虱岂、提升進(jìn)程的優(yōu)先級(jí),降低進(jìn)程被殺死的概率菠红。
(2)第岖、在進(jìn)程被殺死后,進(jìn)行拉活
https://blog.csdn.net/u011622280/article/details/52311344
25试溯、App中喚醒其他進(jìn)程的實(shí)現(xiàn)方式
(1)蔑滓、通過Intent喚醒
(2)、通過Uri換起app
(3)遇绞、直接通過包名喚起app
https://blog.csdn.net/jimtrency/article/details/78720611
附键袱;性能調(diào)優(yōu)+前沿技術(shù)+NDK技術(shù)大綱