2025年android自學(xué)難嗎!我離職后面試收割小米等大廠offer詳細(xì)的Android學(xué)習(xí)指南-學(xué)android開發(fā)一加還是小米_第1頁
2025年android自學(xué)難嗎!我離職后面試收割小米等大廠offer詳細(xì)的Android學(xué)習(xí)指南-學(xué)android開發(fā)一加還是小米_第2頁
2025年android自學(xué)難嗎!我離職后面試收割小米等大廠offer詳細(xì)的Android學(xué)習(xí)指南-學(xué)android開發(fā)一加還是小米_第3頁
2025年android自學(xué)難嗎!我離職后面試收割小米等大廠offer詳細(xì)的Android學(xué)習(xí)指南-學(xué)android開發(fā)一加還是小米_第4頁
2025年android自學(xué)難嗎!我離職后面試收割小米等大廠offer詳細(xì)的Android學(xué)習(xí)指南-學(xué)android開發(fā)一加還是小米_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

2025年android自學(xué)難嗎!我離職后面試收割小米等大廠offer詳細(xì)的Android學(xué)習(xí)指南-學(xué)android開發(fā)一加還是小米.docx 免費(fèi)下載

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

先自我介紹下,作者浙大畢業(yè),去過小公司,也曾任職華為、字節(jié)跳動等大廠,現(xiàn)為阿里技術(shù)專家。專注移動開發(fā)領(lǐng)域,尤其擅長Android技術(shù)棧與跨平臺解決方案。我收集整理了一份《2025年最新Android移動開發(fā)全套學(xué)習(xí)資料》,希望能夠幫助到想自學(xué)提升又不知道該從何學(xué)起的朋友??體系化內(nèi)容?:覆蓋Android開發(fā)95%核心知識點(diǎn),包含零基礎(chǔ)入門到高級進(jìn)階課程?實(shí)戰(zhàn)資源?:整合大廠面經(jīng)、源碼項(xiàng)目、性能優(yōu)化方案及持續(xù)更新技術(shù)棧?附加服務(wù)?:提供技術(shù)交流/職場規(guī)劃/內(nèi)推機(jī)會,助力開發(fā)者突破成長瓶頸需要的朋友可以十我徽心獲取全套資料:vip204888(備注Android)##開頭移動應(yīng)用開發(fā)從逐漸開始火爆到如今也有小十年了,大部分的學(xué)校還是沒有開放專門的課程。目前市場上的大部分Android開發(fā)工程師大多數(shù)是自學(xué)或者是培訓(xùn)出身,用一段時(shí)間上手Android開發(fā)技能(暢銷書作家JoshKaufman提出,掌握正確的方法后,可以在短期內(nèi)上手任何技能),而后進(jìn)入一家公司或者接手一個(gè)項(xiàng)目培養(yǎng)實(shí)操能力、積累實(shí)戰(zhàn)經(jīng)驗(yàn)。再之后呢,Android開發(fā)初期之后怎么提升?怎么才能叫精通?方向在哪?通常情況下,Android工程師1-3年時(shí)間應(yīng)該能從初級上升到中高級工程師,這個(gè)階段主要就是技術(shù)的提升和經(jīng)驗(yàn)的積累。之后1-3年持續(xù)做到高級工程師,這個(gè)位置要求能獨(dú)立完成整個(gè)模塊,對項(xiàng)目架構(gòu)有比較深入的了解,能夠設(shè)計(jì)復(fù)雜模塊的程序方案。同時(shí)需要一定的管理能力,能夠帶新同事快速入手項(xiàng)目,所以這時(shí)候一般同時(shí)也擔(dān)任了主程或者TeamLeader,部分參與項(xiàng)目的管理工作。最近很多人說,Android越來越不好找工作了,學(xué)習(xí)NDK開發(fā)會不會好點(diǎn),今天就聊聊這個(gè)問題。是否應(yīng)該選擇學(xué)NDK?1.哪些場景下要用到NDK開發(fā)?跨平臺的庫,如FFmpeg,skip,weex,

加固,防逆向

簽名校驗(yàn)

圖片壓縮

音視頻解碼

OpenGLES高級特效

熱修復(fù)andfix

人臉識別face++

加密算法

微信apk中的so文件目錄:1.網(wǎng)絡(luò)

2.Java基礎(chǔ)&容器&同步&設(shè)計(jì)模式

3.Java虛擬機(jī)&內(nèi)存結(jié)構(gòu)&GC&類加載&四種引用&動態(tài)代理

4.Android基礎(chǔ)&性能優(yōu)化&Framwork

5.Android模塊化&熱修復(fù)&熱更新&打包&混淆&壓縮

6.音視頻&FFmpeg&播放器1、網(wǎng)絡(luò)網(wǎng)絡(luò)協(xié)議模型應(yīng)用層:負(fù)責(zé)處理特定的應(yīng)用程序細(xì)節(jié)

HTTP、FTP、DNS傳輸層:為兩臺主機(jī)提供端到端的基礎(chǔ)通信

TCP、UDP網(wǎng)絡(luò)層:控制分組傳輸、路由選擇等

IP鏈路層:操作系統(tǒng)設(shè)備驅(qū)動程序、網(wǎng)卡相關(guān)接口TCP和UDP區(qū)別TCP連接;可靠;有序;面向字節(jié)流;速度慢;較重量;全雙工;適用于文件傳輸、瀏覽器等全雙工:A給B發(fā)消息的同時(shí),B也能給A發(fā)半雙工:A給B發(fā)消息的同時(shí),B不能給A發(fā)UDP無連接;不可靠;無序;面向報(bào)文;速度快;輕量;適用于即時(shí)通訊、視頻通話等TCP三次握手A:你能聽到嗎?

B:我能聽到,你能聽到嗎?

A:我能聽到,開始吧A和B兩方都要能確保:我說的話,你能聽到;你說的話,我能聽到。所以需要三次握手TCP四次揮手A:我說完了

B:我知道了,等一下,我可能還沒說完

B:我也說完了

A:我知道了,結(jié)束吧B收到A結(jié)束的消息后B可能還沒說完,沒法立即回復(fù)結(jié)束標(biāo)示,只能等說完后再告訴A:我說完了。POST和GET區(qū)別Get參數(shù)放在url中;Post參數(shù)放在requestBody中

Get可能不安全,因?yàn)閰?shù)放在url中HTTPSHTTP是超文本傳輸協(xié)議,明文傳輸;HTTPS使用SSL協(xié)議對HTTP傳輸數(shù)據(jù)進(jìn)行了加密HTTP默認(rèn)80端口;HTTPS默認(rèn)443端口優(yōu)點(diǎn):安全

缺點(diǎn):費(fèi)時(shí)、SSL證書收費(fèi),加密能力還是有限的,但是比HTTP強(qiáng)多了2、Java基礎(chǔ)&容器&同步&設(shè)計(jì)模式StringBuilder、StringBuffer、+、String.concat鏈接字符串:StringBuffer線程安全,StringBuilder線程不安全+實(shí)際上是用StringBuilder來實(shí)現(xiàn)的,所以非循環(huán)體可以直接用+,循環(huán)體不行,因?yàn)闀l繁創(chuàng)建StringBuilderString.concat實(shí)質(zhì)是newString,效率也低,耗時(shí)排序:StringBuilder<StringBuffer<concat<+Java泛型擦除修飾成員變量等類結(jié)構(gòu)相關(guān)的泛型不會被擦除容器類泛型會被擦除ArrayList、LinkedListArrayList基于數(shù)組實(shí)現(xiàn),查找快:o(1),增刪慢:o(n)

初始容量為10,擴(kuò)容通過System.arrayCopy方法LinkedList基于雙向鏈表實(shí)現(xiàn),查找慢:o(n),增刪快:o(1)

封裝了隊(duì)列和棧的調(diào)用HashMap、HashTableHashMap基于數(shù)組和鏈表實(shí)現(xiàn),數(shù)組是HashMap的主體;鏈表是為解決哈希沖突而存在的當(dāng)發(fā)生哈希沖突且鏈表size大于閾值時(shí)會擴(kuò)容,JAVA8會將鏈表轉(zhuǎn)為紅黑樹提高性能

允許key/value為nullHashTable數(shù)據(jù)結(jié)構(gòu)和HashMap一樣不允許value為null線程安全ArrayMap、SparseArrayArrayMap1.基于兩個(gè)數(shù)組實(shí)現(xiàn),一個(gè)存放hash;一個(gè)存放鍵值對。擴(kuò)容的時(shí)候只需要數(shù)組拷貝,不需要重建哈希表

2.內(nèi)存利用率高

3.不適合存大量數(shù)據(jù),因?yàn)闀ey進(jìn)行二分法查找(1000以下)SparseArray1.基于兩個(gè)數(shù)組實(shí)現(xiàn),int做key

2.內(nèi)存利用率高

3.不適合存大量數(shù)據(jù),因?yàn)闀ey進(jìn)行二分法查找(1000以下)volatile關(guān)鍵字只能用來修飾變量,適用修飾可能被多線程同時(shí)訪問的變量相當(dāng)于輕量級的synchronized,volatitle能保證有序性(禁用指令重排序)、可見性;后者還能保證原子性變量位于主內(nèi)存中,每個(gè)線程還有自己的工作內(nèi)存,變量在自己線程的工作內(nèi)存中有份拷貝,線程直接操作的是這個(gè)拷貝被volatile修飾的變量改變后會立即同步到主內(nèi)存,保持變量的可見性。雙重檢查單例,為什么要加volatile?1.volatile想要解決的問題是,在另一個(gè)線程中想要使用instance,發(fā)現(xiàn)instance!=null,但是實(shí)際上instance還未初始化完畢這個(gè)問題2.將instance=newInstance();拆分為3句話是。1.分配內(nèi)存2.初始化3.將instance指向分配的內(nèi)存空3.volatile可以禁止指令重排序,確保先執(zhí)行2,后執(zhí)行3wait和sleepsleep是Thread的靜態(tài)方法,可以在任何地方調(diào)用wait是Object的成員方法,只能在synchronized代碼塊中調(diào)用,否則會報(bào)IllegalMonitorStateException非法監(jiān)控狀態(tài)異常sleep不會釋放共享資源鎖,wait會釋放共享資源鎖lock和synchronizedsynchronized是Java關(guān)鍵字,內(nèi)置特性;Lock是一個(gè)接口synchronized會自動釋放鎖;lock需要手動釋放,所以需要寫到trycatch塊中并在finally中釋放鎖synchronized無法中斷等待鎖;lock可以中斷Lock可以提高多個(gè)線程進(jìn)行讀/寫操作的效率競爭資源激烈時(shí),lock的性能會明顯的優(yōu)于synchronized可重入鎖定義:已經(jīng)獲取到鎖后,再次調(diào)用同步代碼塊/嘗試獲取鎖時(shí)不必重新去申請鎖,可以直接執(zhí)行相關(guān)代碼ReentrantLock和synchronized都是可重入鎖公平鎖定義:等待時(shí)間最久的線程會優(yōu)先獲得鎖非公平鎖無法保證哪個(gè)線程獲取到鎖,synchronized就是非公平鎖ReentrantLock默認(rèn)時(shí)非公平鎖,可以設(shè)置為公平鎖樂觀鎖和悲觀鎖悲觀鎖:線程一旦得到鎖,其他線程就掛起等待,適用于寫入操作頻繁的場景;synchronized就是悲觀鎖樂觀鎖:假設(shè)沒有沖突,不加鎖,更新數(shù)據(jù)時(shí)判斷該數(shù)據(jù)是否過期,過期的話則不進(jìn)行數(shù)據(jù)更新,適用于讀取操作頻繁的場景樂觀鎖CAS:CompareAndSwap,更新數(shù)據(jù)時(shí)先比較原值是否相等,不相等則表示數(shù)據(jù)過去,不進(jìn)行數(shù)據(jù)更新樂觀鎖實(shí)現(xiàn):AtomicInteger、AtomicLong、AtomicBoolean死鎖4個(gè)必要條件互斥占有且等待不可搶占循環(huán)等待synchronized原理每個(gè)對象都有一個(gè)監(jiān)視器鎖:monitor,同步代碼塊會執(zhí)行monitorenter開始,motnitorexit結(jié)束wait/notify就依賴monitor監(jiān)視器,所以在非同步代碼塊中執(zhí)行會報(bào)IllegalMonitorStateException異常3、Java虛擬機(jī)&內(nèi)存結(jié)構(gòu)&GC&類加載&四種引用&動態(tài)代理JVMKotlin就是能解釋成Class文件,所以可以跑在JVM上JVM內(nèi)存模型Java多線程之間是通過共享內(nèi)存來通信的,每個(gè)線程都有自己的本地內(nèi)存共享變量存放于主內(nèi)存中,線程會拷貝一份共享變量到本地內(nèi)存volatile關(guān)鍵字就是給內(nèi)存模型服務(wù)的,用來保證內(nèi)存可見性和順序性JVM內(nèi)存結(jié)構(gòu)線程私有:1.程序計(jì)數(shù)器:記錄正在執(zhí)行的字節(jié)碼指令地址,若正在執(zhí)行Native方法則為空

2.虛擬機(jī)棧:執(zhí)行方法時(shí)把方法所需數(shù)據(jù)存為一個(gè)棧幀入棧,執(zhí)行完后出棧

3.本地方法棧:同虛擬機(jī)棧,但是針對的是Native方法線程共享:1.堆:存儲Java實(shí)例,GC主要區(qū)域,分代收集GC方法會吧堆劃分為新生代、老年代

2.方法區(qū):存儲類信息,常量池,靜態(tài)變量等數(shù)據(jù)GC回收區(qū)域:只針對堆、方法區(qū);線程私有區(qū)域數(shù)據(jù)會隨線程結(jié)束銷毀,不用回收回收類型:1.堆中的對象分代收集GC方法會吧堆劃分為新生代、老年代新生代:新建小對象會進(jìn)入新生代;通過復(fù)制算法回收對象老年代:新建大對象及老對象會進(jìn)入老年代;通過標(biāo)記-清除算法回收對象2.方法區(qū)中的類信息、常量池判斷一個(gè)對象是否可被回收:1.引用計(jì)數(shù)法

缺點(diǎn):循環(huán)引用2.可達(dá)性分析法

定義:從GCROOT開始搜索,不可達(dá)的對象都是可以被回收的GCROOT1.虛擬機(jī)棧/本地方法棧中引用的對象

2.方法區(qū)中常量/靜態(tài)變量引用的對象四種引用強(qiáng)引用:不會被回收軟引用:內(nèi)存不足時(shí)會被回收弱引用:gc時(shí)會被回收虛引用:無法通過虛引用得到對象,可以監(jiān)聽對象的回收ClassLoader類的生命周期:1.加載;2.驗(yàn)證;3.準(zhǔn)備;4.解析;5.初始化;6.使用;7.卸載類加載過程:1.加載:獲取類的二進(jìn)制字節(jié)流;生成方法區(qū)的運(yùn)行時(shí)存儲結(jié)構(gòu);在內(nèi)存中生成Class對象

2.驗(yàn)證:確保該Class字節(jié)流符合虛擬機(jī)要求

3.準(zhǔn)備:初始化靜態(tài)變量

4.解析:將常量池的符號引用替換為直接引用

5.初始化:執(zhí)行靜態(tài)塊代碼、類變量賦值類加載時(shí)機(jī):1.實(shí)例化對象

2.調(diào)用類的靜態(tài)方法

3.調(diào)用類的靜態(tài)變量(放入常量池的常量除外)類加載器:負(fù)責(zé)加載class文件分類:1.引導(dǎo)類加載器-沒有父類加載器

2.拓展類加載器-繼承自引導(dǎo)類加載器

3.系統(tǒng)類加載器-繼承自拓展類加載器雙親委托模型:當(dāng)要加載一個(gè)class時(shí),會先逐層向上讓父加載器先加載,加載失敗才會自己加載為什么叫雙親?不考慮自定義加載器,系統(tǒng)類加載器需要網(wǎng)上詢問兩層,所以叫雙親判斷是否是同一個(gè)類時(shí),除了類信息,還必須時(shí)同一個(gè)類加載器優(yōu)點(diǎn):防止重復(fù)加載,父加載器加載過了就沒必要加載了安全,防止篡改核心庫類動態(tài)代理原理及實(shí)現(xiàn)InvocationHandler接口,動態(tài)代理類需要實(shí)現(xiàn)這個(gè)接口Proxy.newProxyInstance,用于動態(tài)創(chuàng)建代理對象Retrofit應(yīng)用:Retrofit通過動態(tài)代理,為我們定義的請求接口都生成一個(gè)動態(tài)代理對象,實(shí)現(xiàn)請求4、Android基礎(chǔ)&性能優(yōu)化&FramworkActivity啟動模式standard標(biāo)準(zhǔn)模式singleTop棧頂復(fù)用模式,推送點(diǎn)擊消息界面singleTask棧內(nèi)復(fù)用模式,首頁singleInstance單例模式,單獨(dú)位于一個(gè)任務(wù)棧中撥打電話界面

細(xì)節(jié):taskAffinity:任務(wù)相關(guān)性,用于指定任務(wù)棧名稱,默認(rèn)為應(yīng)用包名allowTaskReparenting:允許轉(zhuǎn)移任務(wù)棧View工作原理DecorView(FrameLayout)LinearLayouttitlebarContent調(diào)用setContentView設(shè)置的ViewViewRoot的performTraversals方法調(diào)用觸發(fā)開始View的繪制,然后會依次調(diào)用:performMeasure:遍歷View的measure測量尺寸performLayout:遍歷View的layout確定位置performDraw:遍歷View的draw繪制事件分發(fā)機(jī)制一個(gè)MotionEvent產(chǎn)生后,按Activity->Window->decorView->View順序傳遞,View傳遞過程就是事件分發(fā),主要依賴三個(gè)方法:dispatchTouchEvent:用于分發(fā)事件,只要接受到點(diǎn)擊事件就會被調(diào)用,返回結(jié)果表示是否消耗了當(dāng)前事件onInterceptTouchEvent:用于判斷是否攔截事件,當(dāng)ViewGroup確定要攔截事件后,該事件序列都不會再觸發(fā)調(diào)用此ViewGroup的onInterceptonTouchEvent:用于處理事件,返回結(jié)果表示是否處理了當(dāng)前事件,未處理則傳遞給父容器處理細(xì)節(jié):一個(gè)事件序列只能被一個(gè)View攔截且消耗View沒有onIntercept方法,直接調(diào)用onTouchEvent處理OnTouchListener優(yōu)先級比OnTouchEvent高,onClickListener優(yōu)先級最低requestDisallowInterceptTouchEvent可以屏蔽父容器onIntercet方法的調(diào)用Window、WindowManager、WMS、SurfaceFlingerWindow:抽象概念不是實(shí)際存在的,而是以View的形式存在,通過PhoneWindow實(shí)現(xiàn)WindowManager:外界訪問Window的入口,內(nèi)部與WMS交互是個(gè)IPC過程WMS:管理窗口Surface的布局和次序,作為系統(tǒng)級服務(wù)單獨(dú)運(yùn)行在一個(gè)進(jìn)程SurfaceFlinger:將WMS維護(hù)的窗口按一定次序混合后顯示到屏幕上View動畫、幀動畫及屬性動畫View動畫:作用對象是View,可用xml定義,建議xml實(shí)現(xiàn)比較易讀支持四種效果:平移、縮放、旋轉(zhuǎn)、透明度幀動畫:通過AnimationDrawable實(shí)現(xiàn),容易OOM屬性動畫:可作用于任何對象,可用xml定義,Android3引入,建議代碼實(shí)現(xiàn)比較靈活包括ObjectAnimator、ValuetAnimator、AnimatorSet時(shí)間插值器:根據(jù)時(shí)間流逝的百分比計(jì)算當(dāng)前屬性改變的百分比系統(tǒng)預(yù)置勻速、加速、減速等插值器類型估值器:根據(jù)當(dāng)前屬性改變的百分比計(jì)算改變后的屬性值系統(tǒng)預(yù)置整型、浮點(diǎn)、色值等類型估值器使用注意事項(xiàng):避免使用幀動畫,容易OOM界面銷毀時(shí)停止動畫,避免內(nèi)存泄漏開啟硬件加速,提高動畫流暢性,硬件加速:將cpu一部分工作分擔(dān)給gpu,使用gpu完成繪制工作從工作分?jǐn)偤屠L制機(jī)制兩個(gè)方面優(yōu)化了繪制速度Handler、MessageQueue、LooperHandler:開發(fā)直接接觸的類,內(nèi)部持有MessageQueue和LooperMessageQueue:消息隊(duì)列,內(nèi)部通過單鏈表存儲消息Looper:內(nèi)部持有MessageQueue,循環(huán)查看是否有新消息,有就處理,沒就阻塞如何實(shí)現(xiàn)阻塞:通過nativePollOnce方法,基于Linuxepoll事件管理機(jī)制為什么主線程不會因?yàn)長ooper阻塞:系統(tǒng)每16ms會發(fā)送一個(gè)刷新UI消息喚醒MVC、MVP、MVVMMVP:Model:處理數(shù)據(jù);View:控制視圖;Presenter:分離Activity和ModelMVVM:Model:處理獲取保存數(shù)據(jù);View:控制視圖;ViewModel:數(shù)據(jù)容器使用Jetpack組件架構(gòu)的LiveData、ViewModel便捷實(shí)現(xiàn)MVVMSerializable、ParcelableSerializable:Java序列化方式,適用于存儲和網(wǎng)絡(luò)傳輸,serialVersionUID用于確定反序列化和類版本是否一致,不一致時(shí)反序列化回失敗Parcelable:Android序列化方式,適用于組件通信數(shù)據(jù)傳遞,性能高,因?yàn)椴幌馭erializable一樣有大量反射操作,頻繁GCBinderAndroid進(jìn)程間通信的中流砥柱,基于客戶端-服務(wù)端通信方式使用mmap一次數(shù)據(jù)拷貝實(shí)現(xiàn)IPC,傳統(tǒng)IPC:用戶A空間->內(nèi)核->用戶B空間;mmap將內(nèi)核與用戶B空間映射,實(shí)現(xiàn)直接從用戶A空間->用戶B空間BinderPool可避免創(chuàng)建多ServiceIPC方式Intentextras、Bundle:要求傳遞數(shù)據(jù)能被序列化,實(shí)現(xiàn)Parcelable、Serializable,適用于四大組件通信文件共享:適用于交換簡單的數(shù)據(jù)實(shí)時(shí)性不高的場景AIDL:AIDL接口實(shí)質(zhì)上是系統(tǒng)提供給我們可以方便實(shí)現(xiàn)BInder的工具AndroidInterfaceDefinitionLanguage,可實(shí)現(xiàn)跨進(jìn)程調(diào)用方法服務(wù)端:將暴漏給客戶端的接口聲明在AIDL文件中,創(chuàng)建Service實(shí)現(xiàn)AIDL接口并監(jiān)聽客戶端連接請求客戶端:綁定服務(wù)端Service,綁定成功后拿到服務(wù)端Binder對象轉(zhuǎn)為AIDL接口調(diào)用RemoteCallbackList實(shí)現(xiàn)跨進(jìn)程接口監(jiān)聽,同個(gè)Binder對象做key存儲客戶端注冊的listener監(jiān)聽Binder斷開:1.Binder.linkToDeath設(shè)置死亡代理;2.onServiceDisconnected回調(diào)Messenger:基于AIDL實(shí)現(xiàn),服務(wù)端串行處理,主要用于傳遞消息,適用于低并發(fā)一對多通信ContentProvider:基于Binder實(shí)現(xiàn),適用于一對多進(jìn)程間數(shù)據(jù)共享Socket:TCP、UDP,適用于網(wǎng)絡(luò)數(shù)據(jù)交換Android系統(tǒng)啟動流程按電源鍵->加載引導(dǎo)程序BootLoader到RAM->執(zhí)行BootLoader程序啟動內(nèi)核->啟動init進(jìn)程->啟動Zygote和各種守護(hù)進(jìn)程->啟動SystemServer服務(wù)進(jìn)程開啟AMS、WMS等->啟動Launcher應(yīng)用進(jìn)程App啟動流程Launcher中點(diǎn)擊一個(gè)應(yīng)用圖標(biāo)->通過AMS查找應(yīng)用進(jìn)程,若不存在就通過Zygote進(jìn)程fork進(jìn)程?;钸M(jìn)程優(yōu)先級:1.前臺進(jìn)程;2.可見進(jìn)程;3.服務(wù)進(jìn)程;4.后臺進(jìn)程;5.空進(jìn)程進(jìn)程被kill場景:1.切到后臺內(nèi)存不足時(shí)被殺;2.切到后臺廠商省電機(jī)制殺死;3.用戶主動清理?;罘绞剑?.Activity提權(quán):掛一個(gè)1像素Activity將進(jìn)程優(yōu)先級提高到前臺進(jìn)程2.Service提權(quán):啟動一個(gè)前臺服務(wù)(API>18會有正在運(yùn)行通知欄)3.廣播拉活4.Service拉活5.JobScheduler定時(shí)任務(wù)拉活6.雙進(jìn)程拉活網(wǎng)絡(luò)優(yōu)化及檢測成功率:1.失敗重試策略;協(xié)議層的優(yōu)化,比如更優(yōu)的http版本等監(jiān)控:Charles抓包、NetworkMonitor監(jiān)控流量UI卡頓優(yōu)化減少布局層級及控件復(fù)雜度,避免過度繪制使用include、merge、viewstub優(yōu)化繪制過程,避免在Draw中頻繁創(chuàng)建對象、做耗時(shí)操作內(nèi)存泄漏場景及規(guī)避1.靜態(tài)變量、單例強(qiáng)引跟生命周期相關(guān)的數(shù)據(jù)或資源,包括EventBus

2.游標(biāo)、IO流等資源忘記主動釋放

3.界面相關(guān)動畫在界面銷毀時(shí)及時(shí)暫停

4.內(nèi)部類持有外部類引用導(dǎo)致的內(nèi)存泄漏handler內(nèi)部類內(nèi)存泄漏規(guī)避:1.使用靜態(tài)內(nèi)部類+弱引用2.界面銷毀時(shí)清空消息隊(duì)列檢測:AndroidStudioProfilerLeakCanary原理通過弱引用和引用隊(duì)列監(jiān)控對象是否被回收比如Activity銷毀時(shí)開始監(jiān)控此對象,檢測到未被回收則主動gc,然后繼續(xù)監(jiān)控OOM場景及規(guī)避加載大圖:減小圖片內(nèi)存泄漏:規(guī)避內(nèi)存泄漏5、Android模塊化&熱修復(fù)&熱更新&打包&混淆&壓縮Dalvik和ARTDalvik谷歌設(shè)計(jì)專用于Android平臺的Java虛擬機(jī),可直接運(yùn)行.dex文件,適合內(nèi)存和處理速度有限的系統(tǒng)JVM指令集是基于棧的;Dalvik指令集是基于寄存器的,代碼執(zhí)行效率更優(yōu)ARTDalvik每次運(yùn)行都要將字節(jié)碼轉(zhuǎn)換成機(jī)器碼;ART在應(yīng)用安裝時(shí)就會轉(zhuǎn)換成機(jī)器碼,執(zhí)行速度更快ART存儲機(jī)器碼占用空間更大,空間換時(shí)間APK打包流程1.aapt打包資源文件生成R.java文件;aidl生成java文件

2.將java文件編譯為class文件

3.將工程及第三方的class文件轉(zhuǎn)換成dex文件

4.將dex文件、so、編譯過的資源、原始資源等打包成apk文件

5.簽名

6.資源文件對齊,減少運(yùn)行時(shí)內(nèi)存App安裝過程首先要解壓APK,資源、so等放到應(yīng)用目錄Dalvik會將dex處理成ODEX;ART會將dex處理成OAT;

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論