1:svn在什么情況下會(huì)導(dǎo)致一個(gè)文件提交不了
2:git分支的原理,和svn有什么區(qū)別
3:LeakCanary是哪個(gè)開發(fā)的
4:什么是注解
5:Butter Knife中最新的采用的是什么原理?
6:rx+retrofit在網(wǎng)絡(luò)請(qǐng)求后返回的格式是什么格式?怎么用rx統(tǒng)一封裝后臺(tái)返回的{result:200,data:xxxx},表單提交時(shí)候的關(guān)鍵字是什么
7:反射時(shí)候是否可以反射到私有屬性?
8:自定義控件中分為哪幾種,android內(nèi)核啟動(dòng)的原理過程描述.
9:熱修復(fù)的原理
10:減小apk的方法有哪些
1:svn在什么情況下會(huì)導(dǎo)致一個(gè)文件提交不了?
假設(shè)a,b用戶和服務(wù)器,服務(wù)器對(duì)于text.class文件的版本號(hào)是20,然后a,b用戶也是版本為20的text.class,這時(shí)候如果b用戶在text.class中添加了文件,然后提交服務(wù)器,此時(shí)服務(wù)器的text.class版本為21,當(dāng)a用戶執(zhí)行修改本地text.class時(shí)候然后提交就是提示沖突,因?yàn)閍用戶當(dāng)面的text.class為20,解決辦法就是update或者對(duì)當(dāng)前文件revert.
2:git分支的原理,和svn有什么區(qū)別
通過可變指針來實(shí)現(xiàn)對(duì)提交數(shù)據(jù)的歷史版本的控制,每當(dāng)我們提交新的更新,當(dāng)前分支(設(shè)為master)則指向最后一個(gè)提交更新A,而最后一個(gè)提交對(duì)象則存在一個(gè)指針指向前一次的提交更新Q。如果我們創(chuàng)建一個(gè)新的分支,child,它和master共同指向A,這時(shí),如果我們向child分支提交更新B,我們會(huì)發(fā)現(xiàn)child指向B,而master依然指向A。無(wú)論我們?cè)赾hild分支進(jìn)行了任何開發(fā),只要回到master分支,就能恢復(fù)到更新A的數(shù)據(jù)狀態(tài)了。區(qū)別就是1.GIT是分布式的,SVN不是;2.GIT把內(nèi)容按元數(shù)據(jù)方式存儲(chǔ),而SVN是按文件;3:GIT分支和SVN的分支不同;4.GIT沒有一個(gè)全局的版本號(hào),而SVN有;5.GIT的內(nèi)容完整性要優(yōu)于SVN
3:LeakCanary是哪個(gè)開發(fā)的
LeakCanary項(xiàng)目是square公司為Java&Android開發(fā)提供的一個(gè)自動(dòng)檢測(cè)內(nèi)存泄漏的工具
4:什么是注解
用來對(duì)這些元素進(jìn)行說明,注釋,注解是以‘@注解名’在代碼中存在的,1:【生成文檔doc文檔】2:【使用反射】3:實(shí)現(xiàn)基本的編譯檢查【Override】
5:Butter Knife中最新的采用的是什么原理?
Butter Knife最新version:8.2.1,以前的版本通過反射,大量使用反射會(huì)影響App的運(yùn)行性能,造成卡頓以及生成很多臨時(shí)Java對(duì)象更容易觸發(fā)GC,現(xiàn)在通過Java Annotation Processing技術(shù),就是在Java代碼編譯成Java字節(jié)碼的時(shí)候就已經(jīng)處理了@Bind、@OnClick(ButterKnife還支持很多其他的注解)這些注解了.
6:rx+retrofit在網(wǎng)絡(luò)請(qǐng)求后返回的格式是什么格式?怎么用rx統(tǒng)一封裝后臺(tái)返回的{result:200,data:xxxx},表單提交時(shí)候的關(guān)鍵字是什么
rxjava中統(tǒng)一的返回對(duì)象都是Subscriber對(duì)象
public classBase CallModel {
public int errno;
public String?msg;
public T?data;
}
@GET("user/login")
Calll? <CallModel<User>>?doLogin(@Query("email") String email,@Query("password") String pwd);
多文件上傳:
@Multipart
@POST("upload")
xxx
多參數(shù)表單:
@FormUrlEncoded
@POST("login")
xxx
7:反射時(shí)候是否可以反射到私有屬性?
可以;在訪問前防止檢查訪問權(quán)限.
Method method = classType.getDeclaredMethod("sayHello",newClass[] { String.class});
method.setAccessible(true);//抑制Java的訪問控制檢查
8:自定義控件中分為哪幾種,android內(nèi)核啟動(dòng)的原理過程描述.
1:自繪控件,實(shí)現(xiàn)ondraw()
2:組合控件
3:繼承控件
啟動(dòng)原理:
ActivityManagerServices,簡(jiǎn)稱AMS,服務(wù)端對(duì)象,負(fù)責(zé)系統(tǒng)中所有Activity的生命周期
ActivityThread,App的真正入口。當(dāng)開啟App之后,會(huì)調(diào)用main()開始運(yùn)行,開啟消息循環(huán)隊(duì)列,這就是傳說中的UI線程或者叫主線程。與ActivityManagerServices配合,一起完成Activity的管理工作
ApplicationThread,用來實(shí)現(xiàn)ActivityManagerService與ActivityThread之間的交互。在ActivityManagerService需要管理相關(guān)Application中的Activity的生命周期時(shí),通過ApplicationThread的代理對(duì)象與ActivityThread通訊。
ApplicationThreadProxy,是ApplicationThread在服務(wù)器端的代理,負(fù)責(zé)和客戶端的ApplicationThread通訊。AMS就是通過該代理與ActivityThread進(jìn)行通信的。
Instrumentation,每一個(gè)應(yīng)用程序只有一個(gè)Instrumentation對(duì)象,每個(gè)Activity內(nèi)都有一個(gè)對(duì)該對(duì)象的引用。Instrumentation可以理解為應(yīng)用進(jìn)程的管家,ActivityThread要?jiǎng)?chuàng)建或暫停某個(gè)Activity時(shí),都需要通過Instrumentation來進(jìn)行具體的操作。
ActivityStack,Activity在AMS的棧管理,用來記錄已經(jīng)啟動(dòng)的Activity的先后關(guān)系,狀態(tài)信息等。通過ActivityStack決定是否需要啟動(dòng)新的進(jìn)程。
ActivityRecord,ActivityStack的管理對(duì)象,每個(gè)Activity在AMS對(duì)應(yīng)一個(gè)ActivityRecord,來記錄Activity的狀態(tài)以及其他的管理信息。其實(shí)就是服務(wù)器端的Activity對(duì)象的映像。
TaskRecord,AMS抽象出來的一個(gè)“任務(wù)”的概念,是記錄ActivityRecord的棧,一個(gè)“Task”包含若干個(gè)ActivityRecord。AMS用TaskRecord確保Activity啟動(dòng)和退出的順序。如果你清楚Activity的4種launchMode,那么對(duì)這個(gè)概念應(yīng)該不陌生。
9:熱修復(fù)的原理
資源替換
類替換(四大組件、類)
SO補(bǔ)丁
PathClassLoader:通過Context getClassLoader()獲取。
DexClassLoader:通過構(gòu)造函數(shù)new DexClassLoader()獲取。
10:減小apk的方法有哪些

壓縮圖片,對(duì)圖片進(jìn)行有損壓縮;
放棄一些圖片資源;
so在gradle中配置
開啟gradle minifyenabled:ture
....................