2019年Android面試必問:Java+效能優化+APP開發+NDK+跨平臺技術

Android入墳之路發表於2019-03-29

前言

金三四銀的春天,三月份的尾巴,你是否面上了自己理想的公司,薪資達到心中理想的高度?

還在為理想的生活而奔波在面試的路上嗎?

今天給大家分享下我整理的Android面試專題及答案,其中大部分都是大企業面試常問的面試題,可以對照這查漏補缺,當然了,這裡所列的肯定不可能覆蓋全部方式,不過也希望能對即將找工作的朋友起到一些幫助!

面試常問的面試專題

一、Java篇

1.多執行緒併發;

  • sleep 和 wait 區別
  • join 的用法
  • 執行緒同步:synchronized 關鍵字等
  • 執行緒通訊
  • 執行緒池
  • 手寫死鎖

2.Java 中的引用方式,及各自的使用場景
3.HashMap 的原始碼
4.GC(垃圾回收)是什麼?如何工作的?回收演算法有哪些
5.Error 和 Exception 區別?
6.反射和註解瞭解嗎?專案中有使用過嗎?
7.網路相關:

  • http 狀態碼
  • http 與 https 的區別?https 是如何工作的?

8.Java 中 LRUCache 是如何實現的(原始碼角度)?為什麼要用 LinkedHashmap?
9.設計模式:

  • 手寫單例,volitate 關鍵字的原理
  • 手寫生產者消費者模式
  • 專案中都使用過哪些設計模式?
  • 編碼常遵循的設計原則:單一職責、開閉原則、里氏替換等

10.ArrayList 和 LinkedList 區別?

二、Android

1.原始碼相關:

  • Activity 啟動過程
  • 事件分發原始碼,以及由此衍生的事件攔截如何實現
  • 訊息機制:Handler 原始碼(結合Looper、MessageQueue),以及取不到訊息時會怎樣?
  • View.post 為什麼可以拿到寬高?

2.自定義 View;

  • 流程:onMeasure, onLayout, onDraw
  • onMeasure 中的 MeasureSpec 是如何計算的?

3.Dalvik執行的是自定義的.dex位元組碼格式。
4.如何捕獲應用全域性異常?
5.Service 是使用,bind 和 start 的區別?
6.Android 中的 IPC 機制有哪些?(接著往下問)
7.屬性動畫原始碼?
8.大圖載入
9.ANR 如何定位,如何分析?(trace 日誌)
10.專案中使用了哪些開源庫?挑一個說說原始碼?
11.MVC 和 MVP 區別?
12.Activity:

  • A 啟動 B,生命週期是怎麼走的?(注意區分B是否是透明的)
  • 啟動模式

13.AsyncTask 原理?

三、效能優化

1.Android UI適配;

字型使用sp,使用dp,多使用match_parent,wrap_content,weight

圖片資源,不同圖片的的解析度,放在相應的資料夾下可使用百分比代替。

2.app優化:(工具:Hierarchy Viewer 分析佈局 工具:TraceView 測試分析耗時的)
3.App啟動優化
4.佈局優化(儘量不要過於複雜的巢狀。)
5.響應優化

  • Android系統每隔16ms會發出VSYNC訊號重繪我們的介面(Activity)
  • 頁面卡頓的原因:(1)過於複雜的佈局.(2)UI執行緒的複雜運算(3)頻繁的GC
  • 導致頻繁GC有兩個原因:
    (1)、記憶體抖動, 即大量的物件被建立又在短時間內馬上被釋放.(2)、瞬間產生大量的物件會嚴重佔用記憶體區域。

6.記憶體優化:參考記憶體洩露和記憶體溢位部分

7.電池使用優化(使用工具:Batterystats & bugreport);

  • 優化網路請求

  • 定位中使用GPS, 請記得及時關閉

8.網路優化(網路連線對使用者的影響:流量,電量,使用者等待)可在Android studio下方logcat旁邊那個工具Network Monitor檢測

  • API設計:App與Server之間的API設計要考慮網路請求的頻次, 資源的狀態等. 以便App可以以較少的請求來完成業務需求和介面的展示.
  • Gzip壓縮:使用Gzip來壓縮request和response, 減少傳輸資料量, 從而減少流量消耗.
  • 圖片的Size:可以在獲取圖片時告知伺服器需要的圖片的寬高, 以便伺服器給出合適的圖片, 避免浪費.
  • 網路快取:適當的快取, 既可以讓我們的應用看起來更快, 也能避免一些不必要的流量消耗.

9.圖片優化;

  • 對圖片本身進行操作。儘量不要使用setImageBitmap、setImageResource、BitmapFactory.decodeResource來設定一張大圖,因為這些方法在完成decode後,最終都是通過java層的createBitmap來完成的,需要消耗更多記憶體.
  • 圖片進行縮放的比例,SDK中建議其值是2的指數值,值越大會導致圖片不清晰。
  • 不用的圖片記得呼叫圖片的recycle()方法

四、NDK和前沿技術
1.談談你對 JNI 和 NDK 的理解;

  • JNI 是 Java Native Interface 的縮寫,即 Java 的本地介面。
  • 目的是使得 Java 與本地其他語言(如 C/C++)進行互動。
  • JNI 是屬於 Java 的,與 Android 無直接關係。
  • NDK 是 Native Development Kit 的縮寫,是 Android 的工具開發包。
  • 作用是更方便和快速開發 C/C++ 的動態庫,並自動將動態庫與應用一起打包到 apk。
  • NDK是屬於 Android 的,與 Java 無直接關係。
    總結:
    JNI 是實現的目的,NDK 是 Android 中實現 JNI 的手段。

2.談談你對 JNIEnv 和 JavaVM 理解;

  • JavaVM 是虛擬機器在 JNI 層的代表
  • 一個程式只有一個 JavaVM。(重要!)
  • 所有的執行緒共用一個 JavaVM。(重要!)
  • JNIEnv 表示 Java 呼叫 native 語言的環境,封裝了幾乎全部 JNI 方法的指標。
  • JNIEnv 只在建立它的執行緒生效,不能跨執行緒傳遞,不同執行緒的 JNIEnv 彼此獨立。(重要!)
    注意:
    在 native 環境下建立的執行緒,要想和 java 通訊,即需要獲取一個 JNIEnv 物件。我們通過 AttachCurrentThread 和 DetachCurrentThread 方法將 native 的執行緒與 JavaVM 關聯和解除關聯。

3.怎麼定位 NDK 中的問題和錯誤;

  • 一般在開發階段的話,我們可以通過 log 來定位和分析問題
  • 如果是上線狀態(即關閉了基本的 log),我們可以藉助 NDK 提供的 addr2line 工具和 objdump 工具來定位錯誤
  • 其它還可以使用 C/C++ 的一些分析工具
  1. 靜態註冊和動態註冊;
  • 靜態註冊;通過 JNIEXPORTJNICALL 兩個巨集定義宣告,Java + 包名 + 類名 + 方法名 形式的函式名。不好的地方就是方法名太長了。
  • 動態註冊;通常在 JNI_OnLoad 方法中通過 RegisterNatives 方法註冊,可以不再遵從固定的命名寫法(當然為了程式碼容易理解,名稱還是儘量和 Java 中保持一致)

5.API

有的變態題目還是會考驗你一些 API 的運用,比如怎麼在 JNI 裡面呼叫 Java 的方法,怎麼在 JNI 裡面拋異常等等。所以一些 API 還是要熟悉一下的,大致都是什麼功能,名字大致是啥呀,這個太多了,就不詳細介紹了。

五、跨平臺混合開發
1.weex框架;

  • 如何搭建weex的開發環境(node,webpack,Android,iOS,weextoolkit)
  • 構建的工具和基礎用法(npm的使用,webpack基礎用法)
  • 編寫ui介面的幾種方式(vuejs指令碼編寫,css樣式編寫,tpl模板編寫)
  • weex的內建能力?(weex例項子變數,weex內建元件,weex內建模組,weex事件,有無此方面的專案實戰?)
  • weex ui架構(weex ui安裝與配置,使用layout佈局元件,使用navigator導航元件,使用utils工具方法)

2.flutter;

  • flutter開發環境的搭建

  • flutter編碼語言dart的認識?
    dart物件導向的原理
    dart中變數,函式,操作符,異常語法與Java原理的異同
    類的機制
    初始化列表的規則
    命名構造方法
    mixin

  • flutter框架的原理,以及使用技巧(佈局分析,如何自定義view? 動畫/手勢互動,多執行緒開發原理,有無實戰釋出過自己的flutter庫)


相關文章