Android阿面试积累,讲的真透彻
基本上稍微大點(diǎn)的公司都會(huì)問到,不過我的回答始終如一:我只能看懂C的代碼,項(xiàng)目中沒有用過JNI,當(dāng)然這個(gè)屬于加分項(xiàng),因?yàn)槲耶?dāng)時(shí)的選擇是把我用過熟悉的東西研究地滾瓜爛熟,而不是在自己平時(shí)很少接觸到的東西上面搞個(gè)一知半解。
Binder
Binder系列,各種AMS,WMS,PWS,常問到的有APP的啟動(dòng)流程,然后兩個(gè)Activity相互跳轉(zhuǎn)的時(shí)候的生命周期,Activity的生命周期。
心態(tài)
不要想著什么都會(huì),那樣不現(xiàn)實(shí),比如說我對(duì)Binder機(jī)制以及熱修復(fù),插件化這塊兒確實(shí)了解地比較淺顯,也跟高德,愛奇藝等公司的面試官聊過這個(gè)話題,這些屬于加分項(xiàng),不會(huì)影響到最終的面試結(jié)果,還有就是算法,面試最多考一道或者兩道算法,所以沒必要在這方面花太多的時(shí)間,掌握好常見的數(shù)組跟鏈表,二叉樹/堆了解一下,基本就夠了,公司看重的是你解決問題的能力,你把原理掌握好,常見地基本上都沒什么問題。
當(dāng)你基礎(chǔ)知識(shí)OK,自己用過的東西的理解地有深度,解決問題的能力OK,如果面試官想要你,那么他會(huì)去找你的優(yōu)點(diǎn),反之他會(huì)去找你的缺點(diǎn)。所以如果你想進(jìn)某家公司,那么你就按照他們的要求去面,就算面不上那么也沒什么,只能說不合適,然后查漏補(bǔ)缺繼續(xù)面,不要因?yàn)槟骋淮位蛘邘状蔚牟豁樉头穸ㄗ约?#xff0c;有些公司的面試官就是喜歡裝,而且還是大公司的。
學(xué)歷很重要,我的學(xué)校只是個(gè)普通一本,相對(duì)一般,所以投了很多知名互聯(lián)網(wǎng)公司簡(jiǎn)歷都過不了,就連好大夫在邀請(qǐng)我面試的時(shí)候特意問了我是不是統(tǒng)招一本,任何行業(yè)都看重學(xué)歷,不僅僅是IT,那些說學(xué)歷不重要的基本上都是一些學(xué)歷比較好的或者是在Android比較火地那個(gè)階段開始搞地Android,他們這批人往往會(huì)覺得在03年跟18年加入的阿里的難度是一樣的,那些覺得學(xué)歷不重要的可以去看看張雪峰老在《演說家》中的演講,不要說什么3年以后公司就不看學(xué)歷了,學(xué)歷是一輩子的事情,那些高考能夠碾壓你的人,出了社會(huì)只要他們?cè)敢?#xff0c;照樣能碾壓你,你努力,你拼命,別人也不會(huì)睡大覺等你。
科班很重要,如果你本科學(xué)地是非計(jì)算機(jī)專業(yè),任何一個(gè)面試官或者HR都會(huì)認(rèn)為你基礎(chǔ)不行,你需要花很多的時(shí)間去精力去補(bǔ)基礎(chǔ),然后再花時(shí)間跟精力在HR不Pass掉你簡(jiǎn)歷的情況下摘掉基礎(chǔ)不行這頂帽子。
工作背景很重要,如果你有大公司背景給你背書,相同的崗位,你進(jìn)入的門檻比有大公司背景的人要高地多,如果你有大公司背景,不管是面試官還是HR都會(huì)在你面試前給你打一個(gè)較高的基本分,這個(gè)是很有利于你通過面試的。
不過上面都是既定的事實(shí),你沒法改變,所以當(dāng)我意識(shí)到這些問題的時(shí)候,我只能去不斷地提升自己的能力,去花更多地代價(jià)去獲得一個(gè)面試機(jī)會(huì),去證明自己的能力進(jìn)而進(jìn)入到一個(gè)比較好的平臺(tái)。
面試公司
公司一(Offer)
面試機(jī)會(huì)來自于V2EX
一面:
- 如何開啟多進(jìn)程?應(yīng)用是否可以開啟N個(gè)進(jìn)程?
- Activity的啟動(dòng)模式、任務(wù)棧以及使用場(chǎng)景?
- Volley能否進(jìn)行數(shù)據(jù)量很大的請(qǐng)求,比如說加載100M的圖片?
- 手寫快速排序
- Volley的優(yōu)缺點(diǎn)
- final修飾一個(gè)對(duì)象,能否調(diào)用對(duì)象修改屬性的方法
- 子線程中如何使用Handler
- 如何進(jìn)行單元測(cè)試,如何保證APP穩(wěn)定。
二面:
- TabLayout如何設(shè)置指示器的寬度包裹內(nèi)容?
- 公差為1的等差數(shù)列求和,如何優(yōu)化
- 自己的優(yōu)勢(shì)在哪里
- 注解如何獲取,反射為何耗性能?
- Java的GC機(jī)制,分代回收策略
- Binder機(jī)制:ServiceManager什么時(shí)候注冊(cè)的?
- int,long的取值范圍以及BigDecimal,數(shù)值越界了如何處理?
- ConcurrentHashMap的原理,分的段數(shù)是多少?
- APP是如何適配的?
- Android中如何查看一個(gè)對(duì)象的回收情況?
- 最大一次線上Bug處理措施
三面:
- APK的大小如何壓縮
- APP的崩潰率,多渠道包
- 自己做過的APP用戶量
- 能否接受加班
公司二(Offer)
面試機(jī)會(huì)來自于拉勾網(wǎng)
一面:
- MVP如何管理Presenter的生命周期,何時(shí)取消網(wǎng)絡(luò)請(qǐng)求
- 用過的框架及原理
- 天貓的Tangram布局,vLayout原理
二面:
- APP的啟動(dòng)流程
- 回形打印二維數(shù)組
- Java為何引入泛型,泛型邊界
- 常見的Java數(shù)據(jù)結(jié)構(gòu)
- ArrayMap跟SparseArray在HashMap上面的改進(jìn)
- Java的四種引用及使用場(chǎng)景
- Webview性能優(yōu)化
公司三(Over)
面試機(jī)會(huì)來自于Android Weekly
一面:
- Binder機(jī)制
- ClassLoader的理解
- Arouter的原理
- 組件化原理,組件化中路由的實(shí)現(xiàn)
- 熱修復(fù)跟插件化的原理
- 線程池的幾個(gè)參數(shù)的理解,四種線程池的使用場(chǎng)景
- 常用的設(shè)計(jì)模式,手寫DCL單例模式
- 進(jìn)程間為什么不能直接進(jìn)行通信
- 應(yīng)用跟系統(tǒng)之間通信什么時(shí)候用Socket什么時(shí)候用Binder
二面:
面試官是做IOS的,基本上是處于聊天的狀態(tài),反正聊地很開心的,然后對(duì)我評(píng)價(jià)很好,他說他不懂Android,但是能感受到我的技術(shù)好奇心,聽了還是很開心的,反正基本上沒怎么聊具體的技術(shù),主要是聊了聊IOS的Hook以及熱修復(fù)相關(guān)的技術(shù),問他們是怎么實(shí)現(xiàn)的,因?yàn)槲抑繧OS在這個(gè)上面比Android要復(fù)雜一些,反正整體就是很放松。
三面:
三面是產(chǎn)品總監(jiān),基本上就是談古論今了,讓我說說對(duì)Android以及IOS的看法,我說谷歌未來肯定會(huì)在人工智能上干掉IOS,然后他說為什么,我說因?yàn)楣雀枵莆樟怂阉鞯拇髷?shù)據(jù),Android產(chǎn)品接入的成本低等等,然后我跟他說我希望產(chǎn)品在設(shè)計(jì)原型的時(shí)候需要考慮一下Android跟IOS兩個(gè)平臺(tái)的差異,不能一刀切,他說是應(yīng)該這樣,但是有很多時(shí)候需要保持平臺(tái)一致性就需要做一些妥協(xié)之類,最后其實(shí)還聊到了錘子,聊了聊對(duì)老羅以及錘子的看法,產(chǎn)品總監(jiān)說錘子的發(fā)布會(huì)每場(chǎng)他都會(huì)看,然后他還給他家人買了一部堅(jiān)果Pro,反正想著肯定會(huì)掛掉,索性就不那么拘束了,就是一種很放松的狀態(tài)。
四面:
四面是CTO面,當(dāng)時(shí)有點(diǎn)緊張,CTO很有紳士風(fēng)度,一上來主動(dòng)跟我握手,當(dāng)時(shí)我有些緊張,手心都出汗了,他說我是不是很熱,我說是的。然后說自己從網(wǎng)易出來之后就開始創(chuàng)業(yè)了,一直是在做提高企業(yè)生產(chǎn)效率相關(guān)的產(chǎn)品,現(xiàn)在做的GrowingIO也是的,然后問了我很多問題,主要是我在上一份工作中的成長跟收貨,未來的規(guī)劃等等,以及在項(xiàng)目中遇到問題是如何進(jìn)行團(tuán)隊(duì)協(xié)作的,問地很細(xì),可以看地出來公司對(duì)這款產(chǎn)品非常重視,像滴滴企業(yè)版,陌陌等都是他們的客戶,感覺這家公司會(huì)發(fā)展很不錯(cuò),最后我也問他為什么會(huì)嘗試做那么多產(chǎn)品而不是專注于某一款產(chǎn)品等等,然后他也給了詳細(xì)的解答。
沒有給我Offer的原因在于我的薪資可能開地過高,一面基本上是處于被淘汰的局面,但是我跟后面的面試官都聊地很好,晚上還在那兒吃了頓飯,最后CTO還跟我聊了很久,我覺得他們應(yīng)該是覺得我可以培養(yǎng),但是薪資要低偏高,所以就最終放棄了我,因?yàn)閷?duì)于創(chuàng)業(yè)公司,我的薪資都開地高一些,不管結(jié)果怎么樣,還是挺感謝這家公司的,希望他們發(fā)展地越來越好。
公司四(Offer)
面試機(jī)會(huì)來自于拉勾網(wǎng)
一面:
- Debug跟Release的APK的區(qū)別
- 軟引用跟弱引用的區(qū)別
- ConcurrentHashmap的原理
- Listview跟Recyclerview的區(qū)別(刷新,緩存,各自的使用場(chǎng)景)
- 對(duì)谷歌新推出的Room架構(gòu)
- 動(dòng)畫的兩種實(shí)現(xiàn):setX跟setTranslationX區(qū)別
- 事件分發(fā):Activity跟window依次到viewgroup
- Volley源碼,優(yōu)缺點(diǎn)
- Picasso傳入的Activity跟Application的context的區(qū)別
二面:
- 數(shù)據(jù)庫的升級(jí),表結(jié)構(gòu)的修改
- 常見的排序算法,手寫二分查找,二分查找的復(fù)雜度分析
- 點(diǎn)擊APP圖標(biāo)啟動(dòng)APP的大致流程
- SplashActivity中進(jìn)行初始化MainActivity的參數(shù),Splash沒有初始化,AMS直接啟動(dòng)了MainActivity怎么辦
- 設(shè)計(jì)一個(gè)多線程,可以同時(shí)讀,讀的時(shí)候不能寫,寫的時(shí)候不能讀(讀寫鎖)
- 設(shè)計(jì)斷點(diǎn)續(xù)傳,如何判斷服務(wù)端是否支持?jǐn)帱c(diǎn)續(xù)傳
- Binder機(jī)制:Binder內(nèi)核所在的進(jìn)程是如何找到到Server跟Client進(jìn)行通信的
- 對(duì)JNI是否了解
- 組件化的原理,組件間通信
公司五:京東
面試機(jī)會(huì)來自于Boss直聘
京東到家(電面):
- GitHub上面的開源項(xiàng)目
- 一個(gè)線程能否創(chuàng)建多個(gè)Handler,Handler跟Looper之間的對(duì)應(yīng)關(guān)系
- ArrayList跟HashMap是夠線程安全,如何保證線程安全
- Volley返回?cái)?shù)據(jù)量比較大的請(qǐng)求時(shí)怎么辦
- ListView跟RecyclerView刷新數(shù)據(jù)原理,使用到的設(shè)計(jì)模式
- 適配如何做,有沒有適配過全面屏
- Fragment跟Activity的通信方式,你知道幾種?
京東商城(電面):
- 內(nèi)存泄露的種類
- ActivityA啟動(dòng)ActivityB時(shí)生命周期的變化
- AMS是如何管理Activity的
- JVM中的GC回收機(jī)制
- 常見的跨進(jìn)程通信方式,AIDL的實(shí)現(xiàn)原理
- APP以及Activity的啟動(dòng)流程
- Hook以及插樁技術(shù)
公司六:京東金融(Offer)
一面:
- 從長度為m的int數(shù)組中隨機(jī)取出n個(gè)元素,每次取的元素都是之前未取過的,如何優(yōu)化
- https是如何保證安全的,證書如何校驗(yàn)
- Android的簽名機(jī)制,APK包含哪些東西
- 是否遇到過OOM,如何解決
- 是否做過逆向
- 對(duì)JNI了解多少
- 手寫單例(DCL)
- 是否寫過so文件
- 熱修復(fù)原理,如何進(jìn)行dex替換的
二面:
- 簡(jiǎn)單說下項(xiàng)目
- 內(nèi)存泄露,如何檢測(cè)以及檢測(cè)的原理
- 點(diǎn)擊Launcher跟點(diǎn)擊微信支付啟動(dòng)微信有什么區(qū)別
- 逆序一個(gè)字符串,不能調(diào)用String的reverse方法(考察編碼風(fēng)格)
- 組件化原理,模塊化機(jī)制
- 沒有給權(quán)限如何定位,特定機(jī)型定位失敗,如何解決
- 同步跟異步機(jī)制(是業(yè)務(wù)上的,不知道他想問什么)
- 線程池中核心線程數(shù)跟最大線程數(shù)如何定義
公司七:(Over)
面試機(jī)會(huì)來自于拉勾
一面:
- StringBuffer跟StringBuilder之間的區(qū)別
- 并發(fā)相關(guān),各種鎖
- View的繪制流程,事件分發(fā)
- Hashmap,Arraymap,SparseArray
- 四種引用
- MVP跟MVC的區(qū)別
- LV跟RV之間的區(qū)別
- Service相關(guān),startService以及bindService
- Fragment不同于Activity的生命周期
- 生產(chǎn)者消費(fèi)者問題:一對(duì)多,多對(duì)多情況
- 常見的設(shè)計(jì)模式,并選擇一種描述一下
- Scroller的使用
二面:
- Gradle生命周期
- Java&Android關(guān)于Classloader源碼解析
- Python的class文件
- DCL中Volatile的作用,如何防止反射實(shí)例化單例對(duì)象
- 抽象類能否實(shí)例化,理論依據(jù)是什么?
- 如何通過Gradle配置差異較大(20%差異)的多渠道包
- class文件如何轉(zhuǎn)化成dex
- Service先start再bind如何關(guān)閉service,為什么bindService可以跟Activity生命周期聯(lián)動(dòng)?
- JVM相關(guān),DVM以及ART是如何進(jìn)行優(yōu)化的,具體步驟
- 長連接常見的庫,短鏈接
- 靜態(tài)同步鎖與普通同步鎖的區(qū)別
- 直接在Activity中創(chuàng)建一個(gè)thread跟在service中創(chuàng)建一個(gè)thread之間恩區(qū)別
高德—汽車事業(yè)部(Over)
面試機(jī)會(huì)來自于Boss
一面:
- View的生命周期
- View的繪制流程跟事件分發(fā)
- Activity跟Window之間的關(guān)系
- 對(duì)C跟JNI是否熟悉
- 熱修復(fù)原理,插件化是如何進(jìn)行加載插件的
- Java中的鎖,各種同步方式之間的區(qū)別
- ANR在四大組件中的時(shí)間,場(chǎng)景
- OOM,如何避免
- 內(nèi)存泄露原理,如何避免
- MVC跟MVP之間的區(qū)別
- ListView針對(duì)多種item的緩存是如何實(shí)現(xiàn)的
- Android繪制二維跟三維的View的區(qū)別
- 是否了解硬件加速
- ListView是如何實(shí)現(xiàn)對(duì)不同type的item的管理的
二面:
- Android中IPC方式,各種方式優(yōu)缺點(diǎn),為什么選擇用Binder
- 主流的熱修復(fù)框架流派,原理,是否研究過classloader源碼
- Android為什么要設(shè)計(jì)兩種classloader,為什么不用一種,通過type來區(qū)分
- Bundle傳遞數(shù)據(jù)為什么需要序列化
- 手寫一個(gè)快排,分析原理
- 廣播傳輸?shù)臄?shù)據(jù)是否有限制,是多少,為什么要限制?
- Activity啟動(dòng)時(shí)生命周期是如何回調(diào)的?
- MVP.MVC.MVVM之間對(duì)比分析
- 組件化通訊:有幾種通信方式,Arouter原理
- 插件化加載流程,原理
- 關(guān)于反射混淆,耗性能的解決方式
- 天貓七巧板布局原理
- 熱修復(fù)流派,原理
高德—地圖事業(yè)部(Over):
面試機(jī)會(huì)來自于Trinea內(nèi)推
一面:
- RecyclerView的itemdecoration如何處理點(diǎn)擊事件
- 單例模式如何修改數(shù)據(jù)
- android事件傳遞,非常細(xì)
- 多線程
**二面:
- JVM內(nèi)存分布,Classloader
- 靜態(tài)代理跟動(dòng)態(tài)代理
- 線程的生命周期
- 是否用過DataBinding
- 是否接觸過JNI
- 對(duì)熱修復(fù)跟插件化了解多少
- 對(duì)RN了解多少
- 二分查找
- 說下多態(tài)
- 編譯期注解跟運(yùn)行時(shí)注解
- 線程跟進(jìn)程間通信
- Android中的IPC
- java中的傳遞
- equals跟==
- Picasso的存儲(chǔ)
- 項(xiàng)目中的難點(diǎn)
- 項(xiàng)目中用到了哪些第三方
- MVC,MVVM,Clean架構(gòu)
- 抽象類跟接口的區(qū)別,接口的默認(rèn)修飾符
掌閱科技(Over)
面試機(jī)會(huì)來自于Boss
一面:
- Canvas.save()跟Canvas.restore()的調(diào)用時(shí)機(jī)
- 程序A能否接收到程序B的廣播?接入微信支付的時(shí)候,微信是如何跟當(dāng)前程序進(jìn)行通信?
- 對(duì)Java.nio了解多少
- ConcurrentHashMap是如何實(shí)現(xiàn)分段鎖?
- 現(xiàn)在需要遍歷SD卡下所有的文件打印出后綴名為.txt文件名稱,如何提高時(shí)間效率?
- 為什么復(fù)寫equals方法的同時(shí)需要復(fù)寫hashcode方法,前者相同后者是否相同,反過來呢?為什么?
- Android4.0~8.0之間大的變化,如何處理?
- 說一下Measurespec這個(gè)類
- ViewHolder有什么用?
- Gradle的Flavor能否配置sourceset?
- 線程池核心線程數(shù)一般定義多少,為什么?
- Intentservice有什么用
- 弱引用什么時(shí)候被回收
- Android中提供了哪些類來幫忙處理線程
- http的狀態(tài)碼,常見的請(qǐng)求頭,http緩存協(xié)議https如何加密
- 多進(jìn)程的優(yōu)缺點(diǎn),多線程的優(yōu)缺點(diǎn)
- 熱修復(fù)如何修復(fù)資源文件?
- 有沒有遇到64k問題,為什么,如何解決?
- httpUrlconnection跟httpClient有什么區(qū)別
馬蜂窩(Over)
面試機(jī)會(huì)來自于Boss
一面:
- 兩個(gè)非基本數(shù)據(jù)類型數(shù)組: array1=[x1,x2,x3,x4,x5,x6,x7,x8,x9,x10,×11] array2=[x6,x3,x10,x5] 計(jì)算結(jié)果:[x6,x7,x8,x9,x1,x2,x3,x4,x10,x11,x5],寫出你的算法
- 類的初始化過程
- 點(diǎn)擊事件穿透原則
- 線程池使用的是哪一種,使用原則
- LeakedCanary原理
- LinerLayout跟RelativeLayout的繪制原理
- Android新版本的一些新特性6.0,7.0,8.0
- 類的初始化順序依次是(靜態(tài)變量、靜態(tài)代碼塊)>(變量、代碼塊)>構(gòu)造方法
二面:
- 看了看項(xiàng)目提了問題如何進(jìn)行優(yōu)化
- 如何實(shí)現(xiàn)馬蜂窩中的一個(gè)動(dòng)畫效果
- 軟鍵盤頂起布局
- 組件化通信方案
愛奇藝(Offer)
面試機(jī)會(huì)來自于拉勾
一面:
- 聊聊RecyclerView,動(dòng)畫,緩存,數(shù)據(jù)綁定底層是如何實(shí)現(xiàn)的。
- 聊了聊我的開源項(xiàng)目實(shí)現(xiàn)原理
- View在屏幕中的移動(dòng)底層是如何實(shí)現(xiàn)的
- Binder跟Socket之間的區(qū)別,什么時(shí)候用哪一個(gè),Binder的底層實(shí)現(xiàn)
- Activity,Window跟View之間的關(guān)系
- setContentView都干了啥
- Activity的啟動(dòng)模式
- MVC跟MVP之間的區(qū)別
- 算法:將一個(gè)有序數(shù)組去重得到一個(gè)新數(shù)組(空間復(fù)雜度為O(N))
總結(jié)
以上是生活随笔為你收集整理的Android阿面试积累,讲的真透彻的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: json数组的遍历(获取属性名和属性值)
- 下一篇: 哈工大计统实验