七、自定義View
問題:自定義view效率高于xml定義嗎?說明理由。
自定義view效率高于xml定義
1.少了解析xml
2. 自定義View 減少了ViewGroup與View之間的測量,包括父量子,子量自身,子在父中位置擺放,當(dāng)子view變化時,父的某些屬性都會跟著變化.
3. 效率就是一個View的 `測量`,`擺放`,`畫`的次數(shù)問題,與多個View的.
問題:如何自定義ViewGroup
問題:如何畫出一個印章的圖案
問題:如何實現(xiàn)一個字體的描邊與陰影效果
問題:自定義View如何考慮機型適配
問題:自定義View如何提供獲取View屬性的接口;
declare-styleable
八、開源庫
九、JNI開發(fā)及Framework開發(fā)
1、JNI系列問題
問題:如何使用JNI
JAVA中聲明native 方法如private native String printJNI(String inputStr);
使用javah工具生成.h頭文件這時候頭文件中就會自動生成對應(yīng)的函數(shù)JNIEXPORT jstring JNICALL Java_com_wenming_HelloWorld_printJNI
實現(xiàn)JNI原生函數(shù)源文件,新建HelloWorld.c文件,對剛才自動生成的函數(shù)進(jìn)行具體的邏輯書寫,例如返回一個java叫做HelloWorld的字符串等
編譯生成動態(tài)鏈接so文件**
Java中調(diào)用Sysytem.load方法把剛才的so庫加載進(jìn)來,就可以調(diào)用native方法了
問題:如何通過JNI傳遞String對象
Java的String和C++的string是不能對等起來的,所以當(dāng)我們拿到.h文件下面的jstring對象,會做一次轉(zhuǎn)換我們把jstring轉(zhuǎn)換為C下面的char*類型, 獲取值
constchar* str;
str = env->GetStringUTFChars(prompt,false);
賦予值
char* tmpstr ="return string succeeded";
jstring rtstr = env->NewStringUTF(tmpstr);
問題:JNI 調(diào)用過程中 混淆問題
不混淆jni回調(diào)的類
十、實現(xiàn)解決方案及所遇知識難點
MS思考:Android面試一天一題(Day 31:Android技術(shù)難題解決方案)
MS思考:Android面試一天一題(吹牛題)
問題:如何實現(xiàn)一個網(wǎng)絡(luò)框架(參考Volley)
1.緩存隊列,以url為key緩存內(nèi)容可以參考Bitmap的處理方式,這里單獨開啟一個線程。
2.網(wǎng)絡(luò)請求隊列,使用線程池進(jìn)行請求。
3.提供各種不同類型的返回值的解析如String,Json,圖片等等。
問題:設(shè)計一個從網(wǎng)絡(luò)請求數(shù)據(jù),圖片,并加載到列表的系統(tǒng),畫出客戶端架構(gòu)并簡單的分析下;
問題:設(shè)計一個文件的斷點續(xù)傳系統(tǒng);
問題:設(shè)計一個圖片緩存加載機制;
分析篇:Android 緩存機制
Bitmap的處理:
1.當(dāng)使用ImageView的時候,可能圖片的像素大于ImageView,此時就可以通過BitmapFactory.Option來對圖片進(jìn)行壓縮,inSampleSize表示縮小2^(inSampleSize-1)倍。
2.BitMap的緩存:
1.使用LruCache進(jìn)行內(nèi)存緩存。
2.使用DiskLruCache進(jìn)行硬盤緩存。
3.實現(xiàn)一個ImageLoader的流程:同步異步加載、圖片壓縮、內(nèi)存硬盤緩存、網(wǎng)絡(luò)拉取
1.同步加載只創(chuàng)建一個線程然后按照順序進(jìn)行圖片加載
2.異步加載使用線程池,讓存在的加載任務(wù)都處于不同線程
3.為了不開啟過多的異步任務(wù),只在列表靜止的時候開啟圖片加載
十一、綜合知識點
1、目錄相關(guān)
問題:Asset目錄與res目錄的區(qū)別
問題:Android一個應(yīng)用的工程目錄結(jié)構(gòu)是什么樣的? src/res/assets/gen/bin/raw/目錄分別是什么?proguard-project.txt/project.properties兩個文件是什么?/res/assets/raw目錄有什么異同?
2、適配相關(guān)
MS思考:Android面試一天一題(12 Day):語言切換
問題:Android的機型種類繁多,你是怎么適配的?
問題:dp, dip, dpi, px, sp是什么意思以及他們的換算公式?layout-sw400dp, layout-h400dp分別代表什么意思;
3、安全相關(guān)
問題:請解釋安卓為啥要加簽名機制。
問題:你知道的安全加密有哪些?? (如果你說了一個加密,面試官就會接著跟進(jìn)提問,所以之前你必須要會,不會的話背也要背下來)(安全加密)
問題:安卓權(quán)限管理,為何在清單中注冊權(quán)限,安卓APP就可以使用,反之不可以(操作系統(tǒng))
4、機制相關(guān)
問題:android中弱引用與軟引用的應(yīng)用場景
問題:android長連接,怎么處理心跳機制
5、更新修復(fù)相關(guān)
問題:multidex解決方法數(shù)過大的問題
問題:什么是65535? 解決方法是什么?
問題:對于應(yīng)用更新這塊是如何做的?(灰度,強制更新,分區(qū)域更新)
灰度:
(1)找單一渠道投放特別版本。
(2)做升級平臺的改造,允許針對部分用戶推送升級通知甚至版本強制升級。
(3)開放單獨的下載入口。
(4)是兩個版本的代碼都打到app包里,然后在app端植入測試框架,用來控制顯示哪個版本。測試框架負(fù)責(zé)與服務(wù)器端api通信,由服務(wù)器端控制app上A/B版本的分布,可以實現(xiàn)指定的一組用戶看到A版本,其它用戶看到B版本。服務(wù)端會有相應(yīng)的報表來顯示A/B版本的數(shù)量和效果對比。最后可以由服務(wù)端的后臺來控制,全部用戶在線切換到A或者B版本~
無論哪種方法都需要做好版本管理工作,分配特別的版本號以示區(qū)別。
當(dāng)然,既然是做灰度,數(shù)據(jù)監(jiān)控(常規(guī)數(shù)據(jù)、新特性數(shù)據(jù)、主要業(yè)務(wù)數(shù)據(jù))還是要做到位,該打的數(shù)據(jù)樁要打。
還有,灰度版最好有收回的能力,一般就是強制升級下一個正式版
強制更新:點擊打開鏈接
增量更新:bsdiff:二進(jìn)制差分工具bspatch是相應(yīng)的補丁合成工具,根據(jù)兩個不同版本的二進(jìn)制文件,生成補丁文件.patch文件。通過bspatch使舊的apk文件與不定文件合成新的apk。 不足:要區(qū)分版本,內(nèi)置及版本相同破解版apk無法增量更新,最好進(jìn)行sha1sum校驗,保證基礎(chǔ)包的一致性。
問題:幾種常用的熱修復(fù)及大概原理
熱修復(fù):Andfix為例子
1.大致原理:apkpatch將兩個apk做一次對比,然后找出不同的部分??梢钥吹缴傻腶patch了文件,后綴改成zip再解壓開,里面有一個dex文件。通過jadx查看一下源碼,里面就是被修復(fù)的代碼所在的類文件,這些更改過的類都加上了一個_CF的后綴,并且變動的方法都被加上了一個叫@MethodReplace的annotation,通過clazz和method指定了需要替換的方法。然后客戶端sdk得到補丁文件后就會根據(jù)annotation來尋找需要替換的方法。最后由JNI層完成方法的替換。
2.無法添加新類和新的字段、補丁文件很容易被反編譯、加固平臺可能會使熱補丁功能失效
問題:CrashHandler:獲取app crash的信息保存在本地然后在下一次打開app的時候發(fā)送到服務(wù)器。
問題:插件化框架描述:dynamicLoadApk為例子
1.可以通過DexClassLoader來對apk中的dex包進(jìn)行加載訪問
2.如何加載資源是個很大的問題,因為宿主程序中并沒有apk中的資源,所以調(diào)用R資源會報錯,所以這里使用了Activity中的實現(xiàn)ContextImpl的getAssets()和getResources()再加上反射來實現(xiàn)。
3.由于系統(tǒng)啟動Activity有很多初始化動作要做,而我們手動反射很難完成,所以可以采用接口機制,將Activity的大部分生命周期提取成接口,然后通過代理Activity去調(diào)用插件Activity的生命周期。同時如果像增加一個新生命周期方法的時候,只需要在接口中和代理中聲明一下就行。
4.缺點:
1.慎用this,因為在apk中使用this并不代表宿主中的activity,當(dāng)然如果this只是表示自己的接口還是可以的。除此之外可以使用that代替this。
2.不支持Service和靜態(tài)注冊的Broadcast
3.不支持LaunchMode和Apk中Activity的隱式調(diào)用。
問題:你覺得安卓開發(fā)最關(guān)鍵的技術(shù)在哪里?
問題:gradle、ant分別為是什么?具體能否會使用?
問題:混合開發(fā),RN,weex,H5,小程序(做Android的了解一些前端js等還是很有好處的)
問題:說一款你認(rèn)為當(dāng)前比較火的應(yīng)用并設(shè)計(直播APP)
十二、Android版本相關(guān)
問題:Android的各版本變化?