Android知識點歸納總結提綱
阿新 • • 發佈:2018-11-14
文章目錄
- 一、Android四大元件
- 二、Fragment相關
- 三、動畫相關
- 四、佈局相關
- 五、資料儲存
- 六、執行緒、程序
- 七、網路
- 八、WebView
- 九、圖片
- 十、Camera相關
- 十一、音視訊相關
- 十二、ViewPager相關
- 十三、RecyclerView相關
- 十四、Canvas相關
- 十五、感測器相關
- 十六、效能優化
- 十七、UI適配
- 十八、Android中的Context
- 十九、序列化與反序列化
- 二十、JSON解析
- 二十一、二維碼
- 二十二、Permission許可權
- 二十三、Activity工作原理
- 二十四、View事件分發機制
- 二十五、View的繪製流程
- 二十六、自定義view基本流程
- 二十七、Apk的打包/安裝過程
- 二十八、App混淆
- 二十九、App冷啟動優化
- 三十、子執行緒不能更新UI
- 三十一、Android Studio Gradle
- 三十二、adb相關
- 三十三、逆向安全
- 三十四、NDK開發
- 三十五、設計模式
- 三十六、架構模式
- RxJava
- Kotlin
- Flutter
- Hybrid 混合開發
- OpenGL
- 其他冷門知識
- 其他補充:
- Java部分
一、Android四大元件
- Activity相關, Activity生命週期理解,Activity啟動另一個Activity返回的完整生命週期, Activity四種啟動模式,Activity任務棧理解(先進後出),Activity的顯示隱式啟動,Activity的隱式啟動(理解Scheme跳轉協議),Activity之間的跳轉與回撥,Activity之間的intent資料傳遞,理解Activity工作原理Activity與Window之間的關係,Activity和dectorView等
- Service相關, Service生命週期方法,Service的兩種啟動方式的使用,start與bind的區別,何時需要停止Service, Service的使用場景理解, 後臺Service與前臺Service,如何提高後臺服務的存活率,如何保證一個後臺服務不被kill, IntentService的使用等
- BroadcastReceiver相關,廣播的兩種註冊方式(隱式/顯示廣播),廣播的註冊/反註冊注意事項,有序廣播、本地廣播,接收到廣播Action後的處理方法等
- ContentProvider相關,ContentProvider的使用,如何使用ContentProvider實現應用間的資料共享,ContentProvider使用的content URI形式的理解等
二、Fragment相關
雖然Fragment不屬於Android四大元件(也有人說它是第五大元件),但是作為Android日常開發使用的高頻元件之一,必須要了解Fragment的使用方法和注意事項
- Fragment的生命週期,以及Fragment生命週期與其宿主Activity生命週期的對應關係
- 如何通過FragmentTransaction實現Fragment的新增、移除、替換、顯示、隱藏等
- Fragment之間的跳轉,Fragment如何與Activity互動
- 如何管理Fragment回退棧
- 沒有檢視的Fragment的用處
- FragmentManager可提供使用的方法
- v4包與app包提供的Fragment使用的區別注意項
- Fragment使用的其他坑
三、動畫相關
- 幀動畫(FrameAnimation),幀動畫的使用方式,xml和程式碼兩種實現方式,幀動畫使用注意事項,利弊等
- 補間動畫(TweenAnimation), 四種常用的補間動畫:alpha(淡入淡出),translate(位移),scale(縮放大小),rotate(旋轉)的使用方式,xml和程式碼兩種實現方式,相關屬性的理解與注意事項,動畫的監聽設定,使用AnimatorSet播放多個組合動畫等
- 屬性動畫(PropertyAnimation), 屬性動畫的使用方法,ValueAnimator與ObjectAnimator的使用,相關屬性的理解,AnimatorSet同時播放多個動畫,Interpolator(動畫差值器)的理解與使用,AnimatorListener的設定,屬性動畫的工作原理等
- 如何利用Canvas繪製動畫
- 瞭解Android 向量動畫實現
- 轉場動畫,觸控反饋動畫,其他自定義動畫
四、佈局相關
- 常用佈局LinearLayout、RelativeLayout、FrameLayout, xml與程式碼兩種使用方式,相關屬性的理解,會在程式碼中動態的設定與改變LayoutParams的相關屬性控制view
- 非常用佈局AbsoluteLayout、TableLayout、GridLayout的使用
- 百分比佈局,PercentRelativeLayout、PercentLinearLayout、PercentFrameLayout的瞭解與使用
- ConstraintLayout(約束佈局)的使用,相關屬性的理解
- FlexboxLayout(流動佈局)的使用,相關屬性的理解
- CoordinatorLayout的使用,會使用support.design庫提供的CoordinatorLayout佈局來實現常見的滑動摺疊/展開浸入式聯動特效,理解Behavior解決巢狀滑動衝突與事件攔截處理的原理,理解NestedScroll機制
- 介面佈局型別的選擇和效能優化
五、資料儲存
- SharedPreferences,sp的使用場景,sp的常用方法,sp能儲存的資料型別,sp的儲存位置,注意事項等
- 檔案儲存,常規檔案操作(I/O讀寫操作、檔案的建立/刪除/複製)、外接sdcard卡的檔案儲存,讀寫許可權, 如何使用FileProvider適配Android 7.0 (file uri exposed問題),應用目錄下檔案的建立存取(應用私有檔案),壓縮檔案(zip/rar)的壓縮與解壓縮
- SQLite資料庫儲存,SQLiteOpenHelper的使用,資料庫需要升級時的注意事項(新老資料的保留),資料庫表的建立/刪除/清空,SQL語句語法(增刪改查、排序、多表聯查),利用execSql和系統提供的增刪改查api兩種方式操作,多執行緒操作資料庫安全問題(加鎖同步),大量頻繁資料庫操作使用事務,第三方的基於資料庫的開源庫方案
- ContentProvider,自定義ContentProvider的使用,ContentProvider的抽象方法增刪改查的實現,ContentProvider如何在應用間共享資料,ContentProvider涉及的Uri概念理解,有哪些系統的ContentUrl,什麼是ContentResolver,如何用ContentResolver查詢手機的儲存資訊(如聯絡人、多媒體圖片、音視訊等)
- 網路儲存,如何讀取檔案流上傳檔案(表單方式),如何下載檔案並儲存,如何提交json格式的資料,如何解析伺服器返回的json資料,網路傳輸資料的加密解密,常規的資料提交方式(GET/POST)以及 Content-type的幾種常見方式的理解(具體參考網路部分總結)
六、執行緒、程序
- 什麼是程序,什麼是執行緒,理解程序和執行緒的區別和聯絡(預設一個android應用是系統的一個程序,執行緒共享程序的所有資源,app的預設工作執行緒是主執行緒UI執行緒)
- 如何在app建立多程序/子程序,子程序與主程序的關係,程序間通訊方式IPC(檔案共享/Messenger/AIDL/ContentProvider/餓了麼HermesEventBus等),app開啟多程序有哪些好處/壞處,Android程序的優先順序(前臺/可見/服務/後臺/空),如何提升app自身的程序優先順序,程序保活方案,多程序情況下Application建立的區別(onCreate)
- 如何在app建立子執行緒,子執行緒與主執行緒的通訊方式(共享記憶體變數/Handler/runOnUiThread/EventBus等),執行緒池的使用,如何手動建立執行緒池,執行緒池各個引數的合理設定,系統提供的四種執行緒池的使用,Thread和Runnable的區別,如何安全的取消/終止一個執行緒的執行(有幾種方式),Thread類的wait() sleep() notify(),執行緒/執行緒池有上限嗎
- 執行緒同步,多執行緒訪問共享資源會帶來的安全問題,執行緒死鎖,執行緒同步的幾種方式(同步方法/同步程式碼塊/volatile/ThreadLocal/阻塞佇列/原子變數)
- AsyncTask的使用,AsyncTask三個方法的解析,AsyncTask原始碼實現原理解析,什麼情況下AsyncTask的doInBackground會不被執行,為什麼new AsyncTask只能執行一次,如何避免AsyncTask導致記憶體洩露、銷燬Activity後它內部的AsyncTask一定會終止執行嗎,如何取消AsyncTask
- Handler, Handler發訊息的所有使用方式及區別,為什麼不能直接在子執行緒中直接new Handler ,如何Handler實現主執行緒給子執行緒發訊息,Handler的訊息佇列實現原理,Handler與Looper、Message的關係,如何避免Handler記憶體洩漏,HandlerThread的使用
- AIDL的實現使用,AIDL的原理分析(Binder機制)
- EventBus實現原理分析
七、網路
- 七層網路結構OSI,每層的含義理解
- 域名解析的過程,一次網路請求的完整流程
- HTTP協議,什麼是HTTP協議,HTTP1.0與2.0的區別,http完整報文的格式(請求頭、請求正文、響應頭、響應正文),請求頭和響應頭中常用欄位的含義解析,GET/POST,上傳檔案、上傳json格式與普通文字資料的get/post方式的區別(報文角度解析),HTTP響應頭各個狀態碼的含義, 常見網路框架是如何解析響應頭/響應正文的,可以自定義響應頭中的ResponseCode嗎, Cookie和Session, 長連線和短連線
- TCP三次握手, TCP與UDP的區別,Android程式碼實現TCP和UDP通訊(Socket api實現),Socket,如何使用Socket自定義協議(如可以用Socket api實現http協議,或任何雙方約定好的自定義協議),使用Websocket實現收發訊息等
- 常見網路請求庫(OkHttp3/Volley/Retrofit)及實現原理解析,原生的網路請求使用,理解非同步請求和同步請求
- Https安全通訊,與Http的區別,TSL/SSL加密協議,CA證書,防止運營商劫持
- 如何自己實現一個網路請求框架
八、WebView
- WebView的基本使用和設定方法
- WebView JS與原生程式碼互動的幾種方式(方法互調、傳參、返回值),優缺點/安全性,JSBridge, 如何自定義協議實現一個JSBridge
- WebView的各種坑,避免WebView記憶體洩漏
- WebView安全漏洞,不同Android版本的差異,如何避免WebView安全漏洞
- Hybrid App混合開發的原理,Hybrid與原生開發有哪些優勢與不足,H5/CSS/JS語法瞭解
九、圖片
- 主流圖片格式(png jpg gif bmp wbmp )的區別,ARGB_8888,RGB_888,RGB_565, RGB_444等色彩格式的區別
- 如何計算一張圖片(Bitmap)在Android中佔用的記憶體大小分析(載入網路/sdcard圖片與載入drawable下的圖片兩種),
- 圖片的壓縮,從圖片尺寸(節約記憶體),圖片大小(節約流量),圖片格式(色彩畫素大小)三方面考慮
- 載入大圖注意事項,OOM
- 圖片快取,三級快取,LRU Cache原理,快取大小是如何調整的,Android提供的LRUCache解析
- 圖片載入庫(Glide/Picasso/Fresco)的使用方法,實現原理(如何做到保證跟Activity/Fragment生命週期一致的),使用的快取策略,記憶體策略,如何自己實現一個圖片載入庫
- 如何從圖片檔案/資源圖片檔案載入Bitmap. Bitmap壓縮儲存到檔案
- 圖片剪裁、旋轉、縮放
- 圓角圖片的實現(幾種方式)以及其他各種形狀圖片
- 圖片選擇庫,第三方開源的與呼叫系統的
十、Camera相關
- 利用系統Camera api自定義一個Camera的流程,如何配合Surfaceview/TextureView使用,Camera引數的設定,Camera預覽,預覽大小拍照大小的選擇,預覽畫面旋轉角度問題的處理,閃光燈,前置攝像頭與後置攝像頭切換,自動對焦問題,Camera座標系,如何捕獲Camera預覽資料儲存為圖片(拍照功能的實現),儲存圖片時旋轉角度問題的處理,何時需要釋放Camera資源(不釋放會導致什麼問題),如何開啟系統相機進行拍照/錄視訊(需要注意什麼),Camera錄製視訊(配置MediaRecorder使用)
- Camera2,Camera2與Camera的區別,Camera2中常用的類,如何利用Camera2實現預覽、拍照等功能
十一、音視訊相關
- 使用MediaRecorder錄製音訊
- 使用MediaRecorder錄製視訊(配合Camera使用)
- 使用AudioRecord錄製音訊,特殊格式如Mp3格式的錄製,Android常見哪些音訊格式, 哪些是同時可以相容IOS平臺的
- 使用MediaPlayer播放視訊/音訊
- 使用AudioTrack播放音訊
- 音視訊編解碼,常見的音視訊的編碼格式,硬解與軟解/硬編與軟編的區別及常用解決方案(目前硬體編解碼主要是用Android的MediaCodec,軟解編解碼一般是採用開源庫FFMpeg)
- 視訊的特效實現(如濾鏡、合成、轉場、塗鴉、水印、美顏、疊加等),美拍、抖音、直播等視訊特效,市場主流的短視訊SDK
- Android視訊直播的實現(推流、播放),流媒體,主要的流媒體協議(RTMP、RTSP等),跟HTTP區別是什麼,市場主流的直播SDK
- 視訊播放器,自定義實現播放功能(MediaPlayer或VideoView), 播放本地視訊/線上視訊,常見開源播放器引擎(如bilibili的ijkPlayer的,Google的ExoPlayer)的學習使用原始碼解析,如何實現常見視訊app軟體的彈幕、音量調節、亮度調節、 倍速調節、 清晰度切換等功能(可以參考主流開源庫GSYVideoPlayer、JiaoZiVideoPlayer等的實現)
- 錄屏(視訊/Gif),截圖
十二、ViewPager相關
- ViewPager + PagerAdapter+View的使用方式
- ViewPager + FragmentPagerAdapter + Fragment的使用方式
- ViewPager的頁面預載入特性,如何防止/進行資料預載入(View和Fragment兩種),PagerAdapter/FragmentPagerAdapter 的缺陷,ViewPager重新整理問題(PagerAdapter/FragmentPagerAdapter), POSITION_NONE問題
- ViewPager的常見特效實現,如無限迴圈滑動的Banner廣告條,單頁顯示3個Item的ViewPager炫酷切換效果,ViewPager換頁滑動特效(PageTransformer應用動畫效果)
- ViewPager的左右滑動監聽,PageChangeListener中的幾個方法解析,ViewPager指示器,自定義實現,常見開源庫(ViewPagerIndicator、MagicIndicator)
十三、RecyclerView相關
- RecyclerView的基本使用方式,如何使用RecyclerView的三種佈局管理器LinearLayoutManager、GridLayoutManager、StaggeredGridLayoutManager實現以前ListView、GridView以及瀑布流的效果,RecyclerViewAdapter的使用,多型別佈局的、分組佈局的Adapter使用(可以參考RecyclerViewAdapter簡化使用開源庫BRVAH),RecyclerView設定header/footer, RecyclerView上拉重新整理、下拉重新整理(配合SwipeRefreshLayout),RecyclerView設定分割線(ItemDecoration),RecyclerView點選事件
- RecyclerView的原始碼解析,與ListView相比的差異, ViewHolder
- RecyclerView的區域性重新整理,如何只重新整理某一項,只重新整理某一項中的某個控制元件,與ListView的區域性重新整理比較
十四、Canvas相關
- Canvas基本使用方法,畫筆Paint的使用,Canvas繪製各種形狀、文字、圖片、曲線,Canvas畫筆設定,Canvas剪裁,Canvas的現場儲存/恢復,Canvas的變換、平移、縮放、旋轉等
- Canvas在自定義View當中的使用
十五、感測器相關
- GPS, 如何使用Android原始程式碼實現GPS定位的獲取(LocationManager),許可權,注意事項(耗電量高,不能一直開著),拓展:LBS基站定位(國內常用的地圖SDK高德/百度等定位都是以上兩種方式的組合)
- 其他手機支援的常見感測器,如加速度感測器、方向感測器、陀螺儀感測器、重力感測器、加速度感測器、距離感測器、計步感測器、光線感測器等,如何程式碼中設定監聽器實時監聽這些感測器的變化引數值,SensorManager,註冊/反註冊監聽
十六、效能優化
- ANR, 什麼是ANR, Activity/BroadcastReceiver/Service對ANR的響應時間,ANR產生的根本原因是什麼,如何避免ANR, 如何避免在UI執行緒執行耗時任務,哪些日常操作任務是耗時任務(檔案I/O、資料庫、網路、解析等等)、有哪些方式可以非同步處理耗時任務(執行緒、Aynctask等),區分UI執行緒和子執行緒,哪些日常場景是在UI執行緒中執行的(如四大元件都是在UI執行緒執行的),在不確定是UI還是非UI執行緒的執行環境中如何判斷當前是否是主執行緒?(有幾種方法)
- OOM,什麼是OOM, 哪些情況容易產生OOM,如何避免OOM
- ListView優化,理解ListView的重用item機制原理,利用ViewHolder快取view減少getView的執行時間,減少ItemView的佈局層次,減少getView方法中的判斷/計算/耗時邏輯,item中的圖片避免每次都重新載入,做好圖片快取(使用圖片載入庫),快速滑動時不載入圖片, 資料分頁載入,圖片錯亂問題
- UI 卡頓,UI 卡頓的原因,幀率,16ms, 過渡繪製,耗時任務,如何佈局優化,減少佈局巢狀
- 記憶體洩漏,GC垃圾回收機制,可能造成Android記憶體洩漏的幾種情況,如何避免記憶體洩漏,Java記憶體分配管理的機制,堆記憶體和棧記憶體的區別,Android系統會為一個應用分配多大記憶體,如何提高應用記憶體,記憶體洩漏的排查方法/工具
- 記憶體優化,弱引用與軟引用(Weakreference、Softreference), 避免對Activity作為Context的長時間引用或靜態引用(如建立Handler AsyncTask的正確姿勢),SparseArray, 為什麼Android推薦使用SparseArray來替代HashMap? 優越在哪裡
- Crash崩潰異常,ForceClose,各種執行時異常(如空指標),如何避免,發生Crash時如何在app中捕獲並儲存本地或上傳伺服器
- 廣播和Service中可以進行網路請求嗎,可以執行耗時任務嗎
- AS哪些工具可以用來排查效能問題
- 電池優化,網路優化 (快取/離線)
十七、UI適配
- px、dp、sp、畫素密度density和螢幕解析度以及螢幕尺寸之間的關係,res/drawable-xxx各個資料夾與螢幕畫素密度之間的關係
- 保證不同螢幕展示的效果最好用Android系統提供的佈局屬性,不要寫死固定大小,圖片按照比例放在不同密度的drawable檔案下或只用一套
- 使用百分比佈局(PercentxxxLayout)
- 使用約束佈局(ConstraintLayout)
- 目前主流適配方案,今日頭條螢幕適配方案和smallestWidth限定符適配方案分析
- 目前市面上流行的劉海螢幕適配方法目前市面上流行的劉海螢幕適配方法
十八、Android中的Context
- 理解Context的含義,Activity、Context、Application的區別和使用場景, ContextWrapper解析,getActivity()/getContext()/getApplication()/getApplicationContext()的區別
- 避免Context靜態持有,避免記憶體洩漏
十九、序列化與反序列化
- Serializable實現,實現方法,Intent傳遞與獲取Serializable的方法
- Parcelable實現,實現方法,,Intent傳遞與獲取Parcelable的方法
- Serializable和Parcelable區別,適合的使用場景(儲存在記憶體中,推薦使用parcelable,儲存在硬碟上,推薦使用Serializable)
二十、JSON解析
- 理解json格式的定義,什麼是合法/不合法的json格式,什麼樣的json格式利於/不利於客戶端開發的解析
- Json的解析,使用原生程式碼解析,使用第三方庫解析(Gson、FastJson、Jackson),Java類與Json字串互轉,注意事項,同一個欄位多型別的json解析
二十一、二維碼
- 二維碼掃描,基於ZXing或Zbar開源庫的開發(如開源庫BGAQRCode-Android),如何提高二維碼掃描的識別率,生成二維碼
二十二、Permission許可權
- Android 6.0以後的許可權適配,動態檢查是否有某項許可權,動態申請許可權,申請許可權的回撥處理(有哪些第三方庫可簡化處理)、明確哪些行為是危險許可權需要動態申請的,6.0以前的許可權處理方式對比
二十三、Activity工作原理
- 從手指點選桌面的app開始到介面呈現發生了哪些過程,第一個Activity物件是如何被建立的,Application物件是如何被建立的,預設的工作執行緒(UI執行緒)是如何建立的,主執行緒Looper的如何建立的,Activity與Window的關係,WindowManager解析,Android系統是如何通過WindowManager管理視窗的
二十四、View事件分發機制
- Touch事件的各個Action含義,何時會被觸發
- Touch事件在View之間的傳遞過程(View、ViewGroup、Activity),分發與處理的流程,何時會被消費,何時會被攔截,如何解決滑動衝突, onTouch 和 onTouchEvent區別,onClick與onTouch的關係
- Android手勢處理,雙指縮放、雙擊、單擊,多點觸控
二十五、View的繪製流程
- Activity的setContentView()做了什麼,Window&PhoneWindow&DectorView&ViewRoot&contentView之間的關係
- View繪製的三個階段measure,layout, draw的解析
- requestLayout,onLayout, onDraw, drawChild的區別與聯絡
- invalidate與postInvalidate的區別與聯絡
二十六、自定義view基本流程
- 自定義屬性,onMesure(),onLayout(ViewGroup) , onDraw(), TouchEvent的處理
- 組合控制元件的自定義方式
二十七、Apk的打包/安裝過程
- apk的打包過程,經過哪些步驟,每個步驟做了什麼,AS的打包過程執行哪些task,每個task幹了什麼,apk簽名(簽名檔案生成,AS打包apk時v1與v2選項的區別),apk對齊,apk加固(第三方都是如何實現的)
- apk的安裝過程,系統在安裝之前會做哪些工作?校驗哪些資訊?(不同Android版本之間的差異),安裝apk的過程做了什麼,會生成哪些檔案,apk會被安裝到系統哪個路徑,app的私有資料(sp/資料庫/私有檔案)儲存在哪個路徑,哪些情況下安裝apk會不成功,覆蓋安裝時(app升級)與app的包名、簽名、版本號versionCode之間的關係, 什麼是ART, Android 5.0以後ART替代之前的Dalvik虛擬機器有哪些優點,AOT,為啥5.0以後安裝的時候時間特別長但是執行速度比以前快
- app的解除安裝過程發生了什麼,系統會刪除哪些與apk相關的東西
二十八、App混淆
- 混淆常用基本語法,混淆類、成員、方法,哪些類需要混淆,哪些類不能被混淆的,混淆檔案的配置
- 如何根據混淆之後的錯誤日誌定位混淆之前的程式碼
二十九、App冷啟動優化
- 冷啟動與熱啟動的區別,從點選桌面app圖示到app的第一個Activity頁面呈現經歷了什麼,優化哪個地方能加快頁面的呈現
- 如何實現app冷啟動秒開,如何避免冷啟動白屏/黑屏/緩慢,有哪些優化方案
三十、子執行緒不能更新UI
- 正常情況下子執行緒不能更新UI,“子執行緒不能更新UI”這句話是一定的嗎?什麼情況下子執行緒可以更新UI?(如這個UI控制元件是由這個執行緒建立時,SurfaceView也可以在單獨執行緒中重新整理,OpenGL可以在渲染執行緒中繪製)
- view.postDelay(Runnable r)方法是執行在子執行緒中的嗎?區分哪些場景是在主執行緒中的
三十一、Android Studio Gradle
- build.gradle常用配置,minSdkVersion、targetSdkVersion、compileSdkVersion三者的關係區別,這三個值對app程式碼開發/安裝執行/版本更新時的影響,包名/簽名/混淆/原始碼路徑的配置、如何利用BuildConfig新增自定義的屬性配置,從gradle中載入properties配置檔案,如何在gradle中開啟/關閉混淆/除錯/Log輸出,如何使用gradle任務打包,如何在dependence中新增依賴(本地jar包、aar包、so庫依賴,遠端依賴),3.0以後的implementation、api、compileOnly與3.0以前的compile provided的區別,如何配置product falvor實現Build Variant變體打包,簡單的Gradle task定義,指定task依賴任務,Android Studio的Gradle任務分析,Gradle外掛,Gradle版本/倉庫配置,groovy語法瞭解
三十二、adb相關
- 掌握常用的adb命令,如使用adb pull/push從手機中拉取/推送檔案,adb 截圖,使用adb 抓取log日誌, 使用adb 安裝/解除安裝應用,adb命令下除錯應用等等
三十三、逆向安全
- app敏感資料的儲存,如賬戶密碼,請求的祕鑰等,銀行類交易類自定義輸入鍵盤(避免攔截),裝置唯一標識(Android目前有哪幾種方式)
- 反編譯 apk, 反編譯so等, 混淆
- app加固
- 如何防止app網路請求被第三方抓包(socket/https)
- WebView開發JS互動避免遠端執行漏洞
- 加密演算法(DES,AES,RSA,MD5,SHA1,Base64),對稱加密與非對稱加密
- 視訊加密
三十四、NDK開發
- JNI基本資料型別,jni函式簽名,jni註冊native函式的兩種方式(靜態、動態)
- java與jni互調,java如何呼叫jni層,jni層如何呼叫java程式碼, JNI各種層資料型別與Java/C層各種資料型別互轉呼叫
- Android.mk檔案編寫,如何連線原始檔、.a .so庫檔案,如何編譯生成動態連結庫so檔案,編譯不同平臺的so, 編譯生成arm64位平臺so時注意什麼(指標要long型存), Application.mk, build過程解析
- Android Studio環境下如何使用CMake方式進行NDK開發
三十五、設計模式
- UML類圖、時序圖
- OO六大設計原則,面向物件的三個基本特徵
- 23種設計模式,瞭解常用常見的設計模式並在專案中實踐,Android原始碼中的設計模式
- 如何優化程式碼,如何重構程式碼,去除重複程式碼,程式碼規範
三十六、架構模式
- MVP模式, MVP、 MVC、MVVM(資料繫結式的MVP)的區別, MVP + Clean模式
- 模組化(從功能/業務上區分)
- 元件化的開發架構,元件化帶來的問題,模組之間的跳轉,路由,ARouter
- 外掛化的開發架構,外掛化的核心原理,虛擬機器(記憶體管理,類載入,雙親委派), 主流外掛化框架原理分析
- 熱修復核心原理,主流熱修復框架原理分析
RxJava
- 實現原理,什麼是響應式程式設計,觀察者/訂閱模式,RxJava是如何實現執行緒自由切換的, RxJava在空間和時間維度上重新組織事件的能力
Kotlin
- Kotlin學習瞭解,與Java的區別,哪個更好用
Flutter
- Flutter學習瞭解,跨平臺,同時支援iOS和Android
Hybrid 混合開發
- 除H5以外,有哪些混合開發方式(weex,小程式,React Native等了解)
OpenGL
- OpenGL瞭解,瞭解OpenGL 的渲染流程(頂點著色器、片元著色器、光柵化、頂點座標系、法向量、光照、投影、剪裁等等)
- 學習Android系統中OpenGL ES 2.0/3.0的Api,使用OpenGL配合GLSurfaceView、Render等繪製點、線、面、紋理貼圖等等
其他冷門知識
- Android近場通訊NFC、Wifi、藍芽、USB串列埠通訊等開發
- Android核心移植、嵌入式終端開發(非手機,如定製的平板、TV,定製的點餐平臺,顯示器等), 或基於終端系統之上的應用開發
- 手機開發(非app開發,這裡指手機廠商,如華為,小米,需要精通framework層以及Android系統底層原始碼),手機作業系統定製
- Android遊戲開發(這個不算冷門,只是平時接觸比較少)
其他補充:
- Notification
- Dialog
- Bitmap物件的理解
- AndroidManifest的作用與理解
- App中喚醒其他程序/應用的實現方式
- ButterKnife實現原理
- Dagger依賴注入
- Android 多程序和Application關係
- Android頁面恢復
- 如何監聽Home鍵和back鍵點選
- apk多入口
- 第三方訊息推送SDK
- 地圖
- 硬體加速
- Emoji
- 多國語言適配(不單單指語言strings.xml適配 佈局也可能要支援RTL)
- 正則表示式
- armeabi/armeabi-v7a/arm64-v8a等so庫相容問題
- 類的載入機制
- Android 65K問題,分包,引入第三方包衝突解決方案
- 計時器/定時任務(Android有哪幾種實現方式)
- Theme 和 Styles
- 多點觸控
- 鬧鐘
- 音樂播放器
- 輸入法軟鍵盤相關
- 分屏
- 夜間模式
- 待續…
Java部分
一、Java基礎
- Java基礎資料型別,各佔用多少位元組,資料型別之間的相互轉換,資料型別之間的比較==和equals的區別
- String、StringBuffer、StringBuilder區別,哪個是執行緒安全的,何時需要使用後面兩個(有什麼區別),String屬於Java的基礎資料型別嗎,字串操作(分隔、拼接、替換、查詢),字串比較,String與其他基礎資料型別的包裝型別之間的互轉,String與char或byte Array之間的互轉,建立字串變數有幾種方式有什麼區別,什麼是字串池,為什麼說Java字串是不可變物件
- Java集合相關,集合的排序/遍歷/複製, HashMap原理,HashMap 和 HashTable 區別,LinkedHashMap原始碼分析, HashCode 作用,如何過載hashCode方法,ArrayList與LinkList區別與聯絡, List與陣列[]相互轉換,List,Set,Map的區別,ConcurrentHashMap的實現原理,要儲存一個數據元素不重複的集合該使用哪種集合,要儲存一個數據元素是有序的集合該使用哪種集合,ArrayList和HashMap 等集合是如何擴容的
- Java反射相關,方法、成員變數
- Java註解相關
- Java執行緒同步相關,Java死鎖產生的原因及避免,方法鎖、物件鎖、類鎖的意義和區別,執行緒同步的方法:Synchronized、lock、reentrantLock分析,Synchronized原理,Volatile實現原理,ThreadLocal的原理和用法,ThreadPool的用法和示例,wait()和sleep()的區別,wait/notify關鍵字的理解
- Java列舉相關
- Java記憶體管理,虛擬機器 ,GC機制,Java引用型別,迴圈引用,Java記憶體洩漏,Java記憶體模型(堆記憶體 棧記憶體 常量池),Java中new 一個物件是存在哪裡的
- JVM類載入機制,ClassLoader(類載入器)的理解,Android中的區別
- 什麼是多型,Java封裝、繼承和多型的理解
- 什麼是內部類?內部類的作用,靜態內部類的作用
- 什麼是抽象類,抽象類和介面區別,抽象類是否可以沒有方法和屬性,介面的意義
- Java泛型相關,如何通過泛型傳遞Java類作為引數
- 序列化的方式 Serializable 和Parcelable 的區別
- 靜態屬性和靜態方法是否可以被繼承?重寫?以及原因?
- final,finally,finalize的區別
- utf-8編碼中的中文佔幾個位元組;int型幾個位元組?,java unicode編碼,中文與unicode互轉
- 什麼是深拷貝和淺拷貝
- 如何實現多執行緒斷點續傳
- Class.forName()和ClassLoader的區別
- 待續…
二、Java資料結構和演算法
- 棧和佇列,棧和佇列的概念理解,Java程式碼實現棧LIFO(後進先出)和佇列FIFO(先進先出),實現思路,入棧/出棧,棧頂/棧底,入隊/出隊,隊頭/隊尾,棧/隊的遍歷,迴圈佇列,判斷棧/佇列是否為空
- 陣列和連結串列,陣列和連結串列的特點和區別,Java程式碼實現連結串列結構,陣列和連結串列分別實現查詢、插入,刪除等操作以及各自的時間複雜度和空間複雜度,連結串列的反序,兩個有序連結串列的合併,雙向連結串列結構的實現,雙向連結串列的插入、刪除等,自定義一個動態陣列,Java 類中哪些結構屬於陣列/連結串列
- 排序演算法,Java八大排序演算法的實現思路(選擇排序,快速排序,氣泡排序,堆排序,希爾排序,歸併排序,直接插入排序,基數排序)以及各自的時間複雜度和空間複雜度,最快的排序演算法是哪個? 哪些是穩定/不穩定的排序演算法,快排的優化,手寫冒泡、快排程式碼
- 查詢演算法,Java程式碼實現順序查詢和二分查詢,實現思路
- 二叉樹,二叉樹排序,二叉樹遍歷、查詢、刪除,哈夫曼樹、紅黑樹
- Hash表,及Hash衝突的解決
- Java有向圖的遍歷,BFS遍歷和DFS遍歷(深度優先搜尋演算法和廣度優先搜尋演算法)、Prim、Dijkstra演算法
- 經典問題:海量資料的處理 (10億個數中找出最大的10000個數 TOP K問題)
- 兩個不重複的陣列集合中,兩個集合都是海量資料,記憶體中放不下,求共同元素
- 燒一根不均勻的繩,從頭燒到尾總共需要1個小時。現在有若干條材質相同的繩子,問如何用燒繩的方法來計時一個小時十五分鐘呢?
- 時針走一圈,時針分針重合幾次
- N*N的方格紙,裡面有多少個正方形
- 待續…