MS(5):android之進(jìn)階篇

七、自定義View

MS思考:Android面試一天一題(Day 30:老外的自定義View面試題)

MS思考:老外的自定義View面試題實現(xiàn)篇

MS思考:Android面試一天一題(5 Day):自定義View的狀態(tài)是如何保存的?

分析篇:Android 自定義View入門

分析篇:Android 自定義ViewGroup入門實踐

四種常用的標(biāo)準(zhǔn)自定義View方法(上)

四種常用的標(biāo)準(zhǔn)自定義View方法(下)

問題:自定義view效率高于xml定義嗎?說明理由。

自定義view效率高于xml定義

1.少了解析xml

2. 自定義View 減少了ViewGroup與View之間的測量,包括父量子,子量自身,子在父中位置擺放,當(dāng)子view變化時,父的某些屬性都會跟著變化.

3. 效率就是一個View的 `測量`,`擺放`,`畫`的次數(shù)問題,與多個View的.

問題:如何自定義ViewGroup

問題:如何畫出一個印章的圖案

android自定義view實現(xiàn)公章效果

問題:如何實現(xiàn)一個字體的描邊與陰影效果

問題:自定義View如何考慮機型適配

問題:自定義View如何提供獲取View屬性的接口;

declare-styleable




八、開源庫

MS思考:Android面試一天一題(Day 32:談?wù)勈褂眠^的第三方開源庫)

這么多開源框架,該用哪個好?





九、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)

MS思考:Android面試一天一題(Day 21:res目錄-細(xì)節(jié)處見真章)

問題:Asset目錄與res目錄的區(qū)別

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的機型種類繁多,你是怎么適配的?

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中弱引用與軟引用的應(yīng)用場景

問題:android長連接,怎么處理心跳機制

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等還是很有好處的)

MS思考:Android面試一天一題(Day 23:當(dāng)Android遇上JavaScript)

問題:說一款你認(rèn)為當(dāng)前比較火的應(yīng)用并設(shè)計(直播APP)





十二、Android版本相關(guān)

問題:Android的各版本變化?

分析篇:Android5.0、6.0、7.0新特性




十三、工具相關(guān)

MS思考:Android面試一天一題(Day 17:老外的面試題)

1、git

git命令使用

Android Studio上git的使用

Android Studio上git的使用(2)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、簡歷準(zhǔn)備 1、個人技能 (1)自定義控件、UI設(shè)計、常用動畫特效 自定義控件 ①為什么要自定義控件? Andr...
    lucas777閱讀 5,378評論 2 54
  • 所有知識點已整理成app app下載地址 J2EE 部分: 1.Switch能否用string做參數(shù)? 在 Jav...
    侯蛋蛋_閱讀 2,706評論 1 4
  • 基礎(chǔ) 不管是Android基礎(chǔ)還是Java基礎(chǔ)以及常見的數(shù)據(jù)結(jié)構(gòu),這些是無原則地必須要熟練掌握的,尤其是非計算機專...
    JxMY閱讀 2,863評論 2 48
  • 移步系列Android跨進(jìn)程通信IPC系列 1 相關(guān)代碼 1.1 代碼位置 1.2 代碼鏈接 AndroidRun...
    凱玲之戀閱讀 1,784評論 0 7
  • 0.Android手機操作系統(tǒng)的四層架構(gòu)? Applications , Application Framewor...
    lucas777閱讀 8,138評論 0 16

友情鏈接更多精彩內(nèi)容