




2025年android自學難嗎!我離職后面試收割小米等大廠offer詳細的Android學習指南-學android開發一加還是小米.docx 免費下載
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
先自我介紹下,作者浙大畢業,去過小公司,也曾任職華為、字節跳動等大廠,現為阿里技術專家。專注移動開發領域,尤其擅長Android技術棧與跨平臺解決方案。我收集整理了一份《2025年最新Android移動開發全套學習資料》,希望能夠幫助到想自學提升又不知道該從何學起的朋友??體系化內容?:覆蓋Android開發95%核心知識點,包含零基礎入門到高級進階課程?實戰資源?:整合大廠面經、源碼項目、性能優化方案及持續更新技術棧?附加服務?:提供技術交流/職場規劃/內推機會,助力開發者突破成長瓶頸需要的朋友可以十我徽心獲取全套資料:vip204888(備注Android)##開頭移動應用開發從逐漸開始火爆到如今也有小十年了,大部分的學校還是沒有開放專門的課程。目前市場上的大部分Android開發工程師大多數是自學或者是培訓出身,用一段時間上手Android開發技能(暢銷書作家JoshKaufman提出,掌握正確的方法后,可以在短期內上手任何技能),而后進入一家公司或者接手一個項目培養實操能力、積累實戰經驗。再之后呢,Android開發初期之后怎么提升?怎么才能叫精通?方向在哪?通常情況下,Android工程師1-3年時間應該能從初級上升到中高級工程師,這個階段主要就是技術的提升和經驗的積累。之后1-3年持續做到高級工程師,這個位置要求能獨立完成整個模塊,對項目架構有比較深入的了解,能夠設計復雜模塊的程序方案。同時需要一定的管理能力,能夠帶新同事快速入手項目,所以這時候一般同時也擔任了主程或者TeamLeader,部分參與項目的管理工作。最近很多人說,Android越來越不好找工作了,學習NDK開發會不會好點,今天就聊聊這個問題。是否應該選擇學NDK?1.哪些場景下要用到NDK開發?跨平臺的庫,如FFmpeg,skip,weex,
加固,防逆向
簽名校驗
圖片壓縮
音視頻解碼
OpenGLES高級特效
熱修復andfix
人臉識別face++
加密算法
微信apk中的so文件目錄:1.網絡
2.Java基礎&容器&同步&設計模式
3.Java虛擬機&內存結構&GC&類加載&四種引用&動態代理
4.Android基礎&性能優化&Framwork
5.Android模塊化&熱修復&熱更新&打包&混淆&壓縮
6.音視頻&FFmpeg&播放器1、網絡網絡協議模型應用層:負責處理特定的應用程序細節
HTTP、FTP、DNS傳輸層:為兩臺主機提供端到端的基礎通信
TCP、UDP網絡層:控制分組傳輸、路由選擇等
IP鏈路層:操作系統設備驅動程序、網卡相關接口TCP和UDP區別TCP連接;可靠;有序;面向字節流;速度慢;較重量;全雙工;適用于文件傳輸、瀏覽器等全雙工:A給B發消息的同時,B也能給A發半雙工:A給B發消息的同時,B不能給A發UDP無連接;不可靠;無序;面向報文;速度快;輕量;適用于即時通訊、視頻通話等TCP三次握手A:你能聽到嗎?
B:我能聽到,你能聽到嗎?
A:我能聽到,開始吧A和B兩方都要能確保:我說的話,你能聽到;你說的話,我能聽到。所以需要三次握手TCP四次揮手A:我說完了
B:我知道了,等一下,我可能還沒說完
B:我也說完了
A:我知道了,結束吧B收到A結束的消息后B可能還沒說完,沒法立即回復結束標示,只能等說完后再告訴A:我說完了。POST和GET區別Get參數放在url中;Post參數放在requestBody中
Get可能不安全,因為參數放在url中HTTPSHTTP是超文本傳輸協議,明文傳輸;HTTPS使用SSL協議對HTTP傳輸數據進行了加密HTTP默認80端口;HTTPS默認443端口優點:安全
缺點:費時、SSL證書收費,加密能力還是有限的,但是比HTTP強多了2、Java基礎&容器&同步&設計模式StringBuilder、StringBuffer、+、String.concat鏈接字符串:StringBuffer線程安全,StringBuilder線程不安全+實際上是用StringBuilder來實現的,所以非循環體可以直接用+,循環體不行,因為會頻繁創建StringBuilderString.concat實質是newString,效率也低,耗時排序:StringBuilder<StringBuffer<concat<+Java泛型擦除修飾成員變量等類結構相關的泛型不會被擦除容器類泛型會被擦除ArrayList、LinkedListArrayList基于數組實現,查找快:o(1),增刪慢:o(n)
初始容量為10,擴容通過System.arrayCopy方法LinkedList基于雙向鏈表實現,查找慢:o(n),增刪快:o(1)
封裝了隊列和棧的調用HashMap、HashTableHashMap基于數組和鏈表實現,數組是HashMap的主體;鏈表是為解決哈希沖突而存在的當發生哈希沖突且鏈表size大于閾值時會擴容,JAVA8會將鏈表轉為紅黑樹提高性能
允許key/value為nullHashTable數據結構和HashMap一樣不允許value為null線程安全ArrayMap、SparseArrayArrayMap1.基于兩個數組實現,一個存放hash;一個存放鍵值對。擴容的時候只需要數組拷貝,不需要重建哈希表
2.內存利用率高
3.不適合存大量數據,因為會對key進行二分法查找(1000以下)SparseArray1.基于兩個數組實現,int做key
2.內存利用率高
3.不適合存大量數據,因為會對key進行二分法查找(1000以下)volatile關鍵字只能用來修飾變量,適用修飾可能被多線程同時訪問的變量相當于輕量級的synchronized,volatitle能保證有序性(禁用指令重排序)、可見性;后者還能保證原子性變量位于主內存中,每個線程還有自己的工作內存,變量在自己線程的工作內存中有份拷貝,線程直接操作的是這個拷貝被volatile修飾的變量改變后會立即同步到主內存,保持變量的可見性。雙重檢查單例,為什么要加volatile?1.volatile想要解決的問題是,在另一個線程中想要使用instance,發現instance!=null,但是實際上instance還未初始化完畢這個問題2.將instance=newInstance();拆分為3句話是。1.分配內存2.初始化3.將instance指向分配的內存空3.volatile可以禁止指令重排序,確保先執行2,后執行3wait和sleepsleep是Thread的靜態方法,可以在任何地方調用wait是Object的成員方法,只能在synchronized代碼塊中調用,否則會報IllegalMonitorStateException非法監控狀態異常sleep不會釋放共享資源鎖,wait會釋放共享資源鎖lock和synchronizedsynchronized是Java關鍵字,內置特性;Lock是一個接口synchronized會自動釋放鎖;lock需要手動釋放,所以需要寫到trycatch塊中并在finally中釋放鎖synchronized無法中斷等待鎖;lock可以中斷Lock可以提高多個線程進行讀/寫操作的效率競爭資源激烈時,lock的性能會明顯的優于synchronized可重入鎖定義:已經獲取到鎖后,再次調用同步代碼塊/嘗試獲取鎖時不必重新去申請鎖,可以直接執行相關代碼ReentrantLock和synchronized都是可重入鎖公平鎖定義:等待時間最久的線程會優先獲得鎖非公平鎖無法保證哪個線程獲取到鎖,synchronized就是非公平鎖ReentrantLock默認時非公平鎖,可以設置為公平鎖樂觀鎖和悲觀鎖悲觀鎖:線程一旦得到鎖,其他線程就掛起等待,適用于寫入操作頻繁的場景;synchronized就是悲觀鎖樂觀鎖:假設沒有沖突,不加鎖,更新數據時判斷該數據是否過期,過期的話則不進行數據更新,適用于讀取操作頻繁的場景樂觀鎖CAS:CompareAndSwap,更新數據時先比較原值是否相等,不相等則表示數據過去,不進行數據更新樂觀鎖實現:AtomicInteger、AtomicLong、AtomicBoolean死鎖4個必要條件互斥占有且等待不可搶占循環等待synchronized原理每個對象都有一個監視器鎖:monitor,同步代碼塊會執行monitorenter開始,motnitorexit結束wait/notify就依賴monitor監視器,所以在非同步代碼塊中執行會報IllegalMonitorStateException異常3、Java虛擬機&內存結構&GC&類加載&四種引用&動態代理JVMKotlin就是能解釋成Class文件,所以可以跑在JVM上JVM內存模型Java多線程之間是通過共享內存來通信的,每個線程都有自己的本地內存共享變量存放于主內存中,線程會拷貝一份共享變量到本地內存volatile關鍵字就是給內存模型服務的,用來保證內存可見性和順序性JVM內存結構線程私有:1.程序計數器:記錄正在執行的字節碼指令地址,若正在執行Native方法則為空
2.虛擬機棧:執行方法時把方法所需數據存為一個棧幀入棧,執行完后出棧
3.本地方法棧:同虛擬機棧,但是針對的是Native方法線程共享:1.堆:存儲Java實例,GC主要區域,分代收集GC方法會吧堆劃分為新生代、老年代
2.方法區:存儲類信息,常量池,靜態變量等數據GC回收區域:只針對堆、方法區;線程私有區域數據會隨線程結束銷毀,不用回收回收類型:1.堆中的對象分代收集GC方法會吧堆劃分為新生代、老年代新生代:新建小對象會進入新生代;通過復制算法回收對象老年代:新建大對象及老對象會進入老年代;通過標記-清除算法回收對象2.方法區中的類信息、常量池判斷一個對象是否可被回收:1.引用計數法
缺點:循環引用2.可達性分析法
定義:從GCROOT開始搜索,不可達的對象都是可以被回收的GCROOT1.虛擬機棧/本地方法棧中引用的對象
2.方法區中常量/靜態變量引用的對象四種引用強引用:不會被回收軟引用:內存不足時會被回收弱引用:gc時會被回收虛引用:無法通過虛引用得到對象,可以監聽對象的回收ClassLoader類的生命周期:1.加載;2.驗證;3.準備;4.解析;5.初始化;6.使用;7.卸載類加載過程:1.加載:獲取類的二進制字節流;生成方法區的運行時存儲結構;在內存中生成Class對象
2.驗證:確保該Class字節流符合虛擬機要求
3.準備:初始化靜態變量
4.解析:將常量池的符號引用替換為直接引用
5.初始化:執行靜態塊代碼、類變量賦值類加載時機:1.實例化對象
2.調用類的靜態方法
3.調用類的靜態變量(放入常量池的常量除外)類加載器:負責加載class文件分類:1.引導類加載器-沒有父類加載器
2.拓展類加載器-繼承自引導類加載器
3.系統類加載器-繼承自拓展類加載器雙親委托模型:當要加載一個class時,會先逐層向上讓父加載器先加載,加載失敗才會自己加載為什么叫雙親?不考慮自定義加載器,系統類加載器需要網上詢問兩層,所以叫雙親判斷是否是同一個類時,除了類信息,還必須時同一個類加載器優點:防止重復加載,父加載器加載過了就沒必要加載了安全,防止篡改核心庫類動態代理原理及實現InvocationHandler接口,動態代理類需要實現這個接口Proxy.newProxyInstance,用于動態創建代理對象Retrofit應用:Retrofit通過動態代理,為我們定義的請求接口都生成一個動態代理對象,實現請求4、Android基礎&性能優化&FramworkActivity啟動模式standard標準模式singleTop棧頂復用模式,推送點擊消息界面singleTask棧內復用模式,首頁singleInstance單例模式,單獨位于一個任務棧中撥打電話界面
細節:taskAffinity:任務相關性,用于指定任務棧名稱,默認為應用包名allowTaskReparenting:允許轉移任務棧View工作原理DecorView(FrameLayout)LinearLayouttitlebarContent調用setContentView設置的ViewViewRoot的performTraversals方法調用觸發開始View的繪制,然后會依次調用:performMeasure:遍歷View的measure測量尺寸performLayout:遍歷View的layout確定位置performDraw:遍歷View的draw繪制事件分發機制一個MotionEvent產生后,按Activity->Window->decorView->View順序傳遞,View傳遞過程就是事件分發,主要依賴三個方法:dispatchTouchEvent:用于分發事件,只要接受到點擊事件就會被調用,返回結果表示是否消耗了當前事件onInterceptTouchEvent:用于判斷是否攔截事件,當ViewGroup確定要攔截事件后,該事件序列都不會再觸發調用此ViewGroup的onInterceptonTouchEvent:用于處理事件,返回結果表示是否處理了當前事件,未處理則傳遞給父容器處理細節:一個事件序列只能被一個View攔截且消耗View沒有onIntercept方法,直接調用onTouchEvent處理OnTouchListener優先級比OnTouchEvent高,onClickListener優先級最低requestDisallowInterceptTouchEvent可以屏蔽父容器onIntercet方法的調用Window、WindowManager、WMS、SurfaceFlingerWindow:抽象概念不是實際存在的,而是以View的形式存在,通過PhoneWindow實現WindowManager:外界訪問Window的入口,內部與WMS交互是個IPC過程WMS:管理窗口Surface的布局和次序,作為系統級服務單獨運行在一個進程SurfaceFlinger:將WMS維護的窗口按一定次序混合后顯示到屏幕上View動畫、幀動畫及屬性動畫View動畫:作用對象是View,可用xml定義,建議xml實現比較易讀支持四種效果:平移、縮放、旋轉、透明度幀動畫:通過AnimationDrawable實現,容易OOM屬性動畫:可作用于任何對象,可用xml定義,Android3引入,建議代碼實現比較靈活包括ObjectAnimator、ValuetAnimator、AnimatorSet時間插值器:根據時間流逝的百分比計算當前屬性改變的百分比系統預置勻速、加速、減速等插值器類型估值器:根據當前屬性改變的百分比計算改變后的屬性值系統預置整型、浮點、色值等類型估值器使用注意事項:避免使用幀動畫,容易OOM界面銷毀時停止動畫,避免內存泄漏開啟硬件加速,提高動畫流暢性,硬件加速:將cpu一部分工作分擔給gpu,使用gpu完成繪制工作從工作分攤和繪制機制兩個方面優化了繪制速度Handler、MessageQueue、LooperHandler:開發直接接觸的類,內部持有MessageQueue和LooperMessageQueue:消息隊列,內部通過單鏈表存儲消息Looper:內部持有MessageQueue,循環查看是否有新消息,有就處理,沒就阻塞如何實現阻塞:通過nativePollOnce方法,基于Linuxepoll事件管理機制為什么主線程不會因為Looper阻塞:系統每16ms會發送一個刷新UI消息喚醒MVC、MVP、MVVMMVP:Model:處理數據;View:控制視圖;Presenter:分離Activity和ModelMVVM:Model:處理獲取保存數據;View:控制視圖;ViewModel:數據容器使用Jetpack組件架構的LiveData、ViewModel便捷實現MVVMSerializable、ParcelableSerializable:Java序列化方式,適用于存儲和網絡傳輸,serialVersionUID用于確定反序列化和類版本是否一致,不一致時反序列化回失敗Parcelable:Android序列化方式,適用于組件通信數據傳遞,性能高,因為不像Serializable一樣有大量反射操作,頻繁GCBinderAndroid進程間通信的中流砥柱,基于客戶端-服務端通信方式使用mmap一次數據拷貝實現IPC,傳統IPC:用戶A空間->內核->用戶B空間;mmap將內核與用戶B空間映射,實現直接從用戶A空間->用戶B空間BinderPool可避免創建多ServiceIPC方式Intentextras、Bundle:要求傳遞數據能被序列化,實現Parcelable、Serializable,適用于四大組件通信文件共享:適用于交換簡單的數據實時性不高的場景AIDL:AIDL接口實質上是系統提供給我們可以方便實現BInder的工具AndroidInterfaceDefinitionLanguage,可實現跨進程調用方法服務端:將暴漏給客戶端的接口聲明在AIDL文件中,創建Service實現AIDL接口并監聽客戶端連接請求客戶端:綁定服務端Service,綁定成功后拿到服務端Binder對象轉為AIDL接口調用RemoteCallbackList實現跨進程接口監聽,同個Binder對象做key存儲客戶端注冊的listener監聽Binder斷開:1.Binder.linkToDeath設置死亡代理;2.onServiceDisconnected回調Messenger:基于AIDL實現,服務端串行處理,主要用于傳遞消息,適用于低并發一對多通信ContentProvider:基于Binder實現,適用于一對多進程間數據共享Socket:TCP、UDP,適用于網絡數據交換Android系統啟動流程按電源鍵->加載引導程序BootLoader到RAM->執行BootLoader程序啟動內核->啟動init進程->啟動Zygote和各種守護進程->啟動SystemServer服務進程開啟AMS、WMS等->啟動Launcher應用進程App啟動流程Launcher中點擊一個應用圖標->通過AMS查找應用進程,若不存在就通過Zygote進程fork進程保活進程優先級:1.前臺進程;2.可見進程;3.服務進程;4.后臺進程;5.空進程進程被kill場景:1.切到后臺內存不足時被殺;2.切到后臺廠商省電機制殺死;3.用戶主動清理保活方式:1.Activity提權:掛一個1像素Activity將進程優先級提高到前臺進程2.Service提權:啟動一個前臺服務(API>18會有正在運行通知欄)3.廣播拉活4.Service拉活5.JobScheduler定時任務拉活6.雙進程拉活網絡優化及檢測成功率:1.失敗重試策略;協議層的優化,比如更優的http版本等監控:Charles抓包、NetworkMonitor監控流量UI卡頓優化減少布局層級及控件復雜度,避免過度繪制使用include、merge、viewstub優化繪制過程,避免在Draw中頻繁創建對象、做耗時操作內存泄漏場景及規避1.靜態變量、單例強引跟生命周期相關的數據或資源,包括EventBus
2.游標、IO流等資源忘記主動釋放
3.界面相關動畫在界面銷毀時及時暫停
4.內部類持有外部類引用導致的內存泄漏handler內部類內存泄漏規避:1.使用靜態內部類+弱引用2.界面銷毀時清空消息隊列檢測:AndroidStudioProfilerLeakCanary原理通過弱引用和引用隊列監控對象是否被回收比如Activity銷毀時開始監控此對象,檢測到未被回收則主動gc,然后繼續監控OOM場景及規避加載大圖:減小圖片內存泄漏:規避內存泄漏5、Android模塊化&熱修復&熱更新&打包&混淆&壓縮Dalvik和ARTDalvik谷歌設計專用于Android平臺的Java虛擬機,可直接運行.dex文件,適合內存和處理速度有限的系統JVM指令集是基于棧的;Dalvik指令集是基于寄存器的,代碼執行效率更優ARTDalvik每次運行都要將字節碼轉換成機器碼;ART在應用安裝時就會轉換成機器碼,執行速度更快ART存儲機器碼占用空間更大,空間換時間APK打包流程1.aapt打包資源文件生成R.java文件;aidl生成java文件
2.將java文件編譯為class文件
3.將工程及第三方的class文件轉換成dex文件
4.將dex文件、so、編譯過的資源、原始資源等打包成apk文件
5.簽名
6.資源文件對齊,減少運行時內存App安裝過程首先要解壓APK,資源、so等放到應用目錄Dalvik會將dex處理成ODEX;ART會將dex處理成OAT;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 財務會計習題與實訓 2第二章貨幣資金答案
- 河北省邯鄲市曲周縣2024-2025學年七年級下學期期中生物試題(含答案)
- 2024-2025學年統編版語文七年級下冊期末復習第六單元練習題(含答案)
- 幼兒園安全第一課安全教育課件
- 大班幼兒在五大領域中的成長軌跡與教育方法探討
- 【高中語文】浙江省+高一下學期期中語文試題
- 【高中語文】《念奴嬌+過洞庭》課件++統編版高一語文必修下冊
- 沙龍大賽題目大全及答案
- 三創賽題目及答案
- 日語演講題目及答案
- 醫院結核感染培訓
- 大學生應急救護知到智慧樹章節測試課后答案2024年秋西安歐亞學院
- 臨床心內科主任競聘稿
- 電動工器具安全使用培訓
- 防水工程專項施工方案
- 日本建設項目可視化、安全文明、工藝管理總結
- 【MOOC】思想道德與法治-南開大學 中國大學慕課MOOC答案
- 網絡管理與維護綜合實訓課程
- 遼寧大學《材料力學》2021-2022學年第一學期期末試卷
- 新安全生產法圖文培訓
- 2年級關聯詞專項練習題含答案
評論
0/150
提交評論