Android面試指南-麵霸之路08-android常見面試題05
- Android自定義許可權的作用
- 什麼時候使用自定義許可權?
- 和android:exported有什麼區別?
- 為什麼很多第三方服務整合,都需要你自己定義許可權?比如小米推送,為什麼你要加上permission和use-permission兩項?
1.自定義許可權主要是用來限制對本應用程式或者其他應用程式的特殊元件或功能的訪問,如果startActivity()或者startActivityForResult()的呼叫者沒有授予相應許可權,那麼啟動會失敗。自定義許可權的節點詳細資訊可以參考官方API Guide Permission,完成許可權自定義後可以在和、、、分別設定(PS:每個元件的許可權設定還有些不一樣),表示客戶端與應用程式互動的許可權許可,如果沒有設定許可權,那麼預設許可權為中的許可權,如果兩個都沒有設定那麼該Activity不會被許可權保護。總結一下,自定義許可權主要還是保護某些元件和功能的可訪問性。
2.首先說一下android:exported = [true | false]的功能主要是該元件是否可以被其他應用程式啟動或者互動,既然是元件的屬性那麼就可以分別應用到、、、,更詳細說明可以參考API Guide App Manifeset,當然官方最後說了要完成保護元件也可以使用自定義許可權。
3.不加許可權就無法訪問或者呼叫對應元件。
- 如何縮減APK包大小
程式碼
保持良好的程式設計習慣,不要重複或者不用的程式碼,謹慎新增libs,移除使用不到的libs。
使用proguard混淆程式碼,它會對不用的程式碼做優化,並且混淆後也能夠減少安裝包的大小。
native code的部分,大多數情況下只需要支援armabi與x86的架構即可。如果非必須,可以考慮拿掉x86的部分。
資源
使用Lint工具查詢沒有使用到的資源。去除不使用的圖片,String,XML等等。
assets目錄下的資源請確保沒有用不上的檔案。
生成APK的時候,aapt工具本身會對png做優化,但是在此之前還可以使用其他工具如tinypng對圖片進行進一步的壓縮預處理。
jpeg還是png,根據需要做選擇,在某些時候jpeg可以減少圖片的體積。
對於9.png的圖片,可拉伸區域儘量切小,另外可以通過使用9.png拉伸達到大圖效果的時候儘量不要使用整張大圖。
策略
有選擇性的提供hdpi,xhdpi,xxhdpi的圖片資源。建議優先提供xhdpi的圖片,對於mdpi,ldpi與xxxhdpi根據需要提供有差異的部分即可。
儘可能的重用已有的圖片資源。例如對稱的圖片,只需要提供一張,另外一張圖片可以通過程式碼旋轉的方式實現。
能用程式碼繪製實現的功能,儘量不要使用大量的圖片。例如減少使用多張圖片組成animate-list的AnimationDrawable,這種方式提供了多張圖片
- 記憶體洩露檢測有什麼好方法?
檢測: 1、DDMS Heap發現記憶體洩露 dataObject totalSize的大小,是否穩定在一個範圍內,如果操作程式,不斷增加,說明記憶體洩露 2、使用Heap Tool進行記憶體快照前後對比 BlankActivity手動觸發GC進行前後對比,物件是否被及時回收
定位: 1、MAT外掛開啟.hprof具體定位記憶體洩露: 檢視histogram項,選中某一個物件,檢視它的GC引用鏈,因為存在GC引用鏈的,說明無法回收 2、AndroidStudio的Allocation Tracker: 觀測到期間的記憶體分配,哪些物件被建立,什麼時候建立,從而準確定位
- Android開發中XML解析方式的比較 ,及優缺點
DOM,SAX,Pull解析。
SAX解析器的優點是解析速度快,佔用記憶體少;
DOM在記憶體中以樹形結構存放,因此檢索和更新效率會更高。但是對於特別大的文件,解析和載入整個文件將會很耗資源,不適合移動端;
PULL解析器的執行方式和SAX類似,都是基於事件的模式,PULL解析器小巧輕便,解析速度快,簡單易用,非常適合在Android移動裝置中使用,Android系統內部在解析各種XML時也是用PULL解析器。
- HttpURLConnection和HttpClient他們各自的優缺點是什麼
HttpUrlConnection 在 2.3 以前的版本是有 bug 的,所以之前的版本推薦使用 HttpClient,但是 google 現在已經不維護 HttpClient 了,5.1裡面已經把 HttpClient 標過期。另外 HttpURLConnection 支援gzip壓縮等,推薦首選它。
- 談談你在工作中是怎樣解決一個bug的
思路大體和上面差不多, 1. 異常附近多列印log資訊; 2. 分析log日誌,實在不行的話進行斷點除錯; 3. 除錯不出結果,上Stack Overflow貼上異常資訊,請教大牛(我是不會說百度的,^_^) 4. 再多看看程式碼,或者從原始碼中查詢相關資訊 5. 實在不行就GG了,找師傅來解決! 以上
- 在Handler機制如果MessageQueue佇列為空,loop()方法中死迴圈while(true){...}是否會退出,為什麼
如果MessageQueue為空,取訊息時就阻塞了,不會繼續執行,直到佇列中有訊息。
https://github.com/futurice/android-best-practices/blob/master/translations/Chinese/README.cn.md
- 好的程式設計習慣
- 宣告ViewHolder內部類時,為什麼建議使用static關鍵字
這個是考靜態內部類和非靜態內部類的主要區別之一。非靜態內部類會隱式持有外部類的引用,就像大家經常將自定義的adapter在Activity類裡,然後在adapter類裡面是可以隨意呼叫外部activity的方法的。當你將內部類定義為static時,你就調用不了外部類的例項方法了,因為這時候靜態內部類是不持有外部類的引用的。宣告ViewHolder靜態內部類,可以將ViewHolder和外部類解引用。大家會說一般ViewHolder都很簡單,不定義為static也沒事吧。確實如此,但是如果你將它定義為static的,說明你懂這些含義。萬一有一天你在這個ViewHolder加入一些複雜邏輯,做了一些耗時工作,那麼如果ViewHolder是非靜態內部類的話,就很容易出現記憶體洩露。如果是靜態的話,你就不能直接引用外部類,迫使你關注如何避免相互引用。 所以將 ViewHolder內部類 定義為靜態的,是一種好習慣
- Android系統的啟動過程
1,通過開啟adb shell 然後執行ps命令,我們可以看到首先執行的是init方法!然後我們找到init.c這個檔案, 2,然後走init裡面的main方法,在這main方法裡面執行mkdir進行建立很多的資料夾,和掛載一些目錄, 3,然後回去初始化init.rc這個配置檔案!在這個配置檔案裡面回去啟動孵化器這個服務,這個服務會去啟動app_process這個資料夾,這個資料夾裡面有個app_main.cpp這個檔案! 4,然後在app_main.cpp這個c檔案裡面在main方法裡面它會去啟動安卓的虛擬機器,然後安卓虛擬機器會去啟動os.zygoteinit這個服務! 5,zygoteinit這是個java程式碼寫的,然後我們找到了main方法,在這個方法裡面我們看到他首先設定虛擬機器的最小堆記憶體為5兆,然後走到preloadclasses()這個方法來載入安卓系統所有的2000多個類通過類載入器載入進來,比如activity,contentx,http,...(其實沒有必要一下子全部載入下來,我們可以等用到的時候在載入也可以!) 6,然後又走preloadresources()這個方法來預載入安卓中定義好的資源比如顏色,圖片,系統的id等等。。。都載入了!(其實這也是沒必要的! ) 7,然後又走startSystemServer(),這個方法來載入系統的服務!他會先使用natvieJNI去呼叫C去初始化介面和聲音的服務,這就是我們為什麼先聽到聲音和介面的原因! 8,最後等服務載入完成後也就啟動起來了! 簡之: linux啟動->init程序啟動(載入init.rc配置)->zygote啟動->systemServer啟動,systemServer會通過init1和init2啟動navite世界和java世界。
- Android應用方法數量超過65K個怎麼辦
使用Android Studio 的gradle 可以構建MutilDex
- 談談你對StrongReference、WeakReference和SoftReference的認識
強引用(StrongReference):就是在程式碼中普遍存在的,類似Object obj = new Object()這類的引用,只要強引用還存在,GC永遠不會回收掉被引用的物件。
軟引用(SoftReference):用來描述一些還有用但非必須的物件。對於軟引用關聯著的物件,在系統將要發生記憶體溢位異常時,將會把這些物件列入回收範圍之中進行第二次回收。如果這次回收還沒有足夠的記憶體,才會丟擲記憶體溢位異常。在JDK 1.2之後,提供了SoftReference類來實習軟引用。
弱引用(WeakReference):也是用來描述非必須物件的,但是它的強度比軟引用更弱一些,被弱引用關聯的物件只能生存到了下一次GC發生之前。當GC工作時,無論當時記憶體是否足夠,都會回收只被弱引用關聯的物件。在JDK 1.2之後,提供了WeakReference類來實現弱引用。
虛引用(PhantomReference):
這個引用po主沒有提到,不過也可以順帶了解一下。虛引用也稱幽靈引用或者幻影引用,它是最弱的一種引用關係。一個物件是否有虛引用的存在,完全不會對其生存時間構成影響,也無法通過虛引用來取得一個物件例項。為一個物件設定虛引用的唯一目的就是在這個物件被GC回收是收到一個系統通知。在JDK 1.2之後提供了PhantomReference類來實現虛引用。
- 你應用中的網路層是怎麼設計的?
用現成的一些框架 然後根據專案需要自己再封裝下,比如說你的互動資料是JSON格式的,你就可以用一個網路請求框架+fastjson ,然後寫一些Bean 在Work執行緒把資料用fastjson 直接解析成物件返回,最後對一些錯誤統一處理
我用的是 android-async-http. 封裝了下常用的方法,get post 上傳 下載 ,所有的請求我都是用的同步請求. 具體的用法一般都是和業務邏輯在一起,而我的業務邏輯是用非同步去處理的. 關於網路請求結果的快取,我是單獨處理的.並沒有放在網路層.