前言
- git基礎(chǔ)指令
- Android單元測(cè)試
- 打包工具Walle使用及原理
- TV項(xiàng)目的基本結(jié)構(gòu)
1、git基礎(chǔ)指令
git的工作流程中主要途徑4個(gè)區(qū)域:
- Workspace(工作區(qū))
- Index (暫存區(qū))
- Repository(本地倉(cāng)庫(kù))
- Remote(遠(yuǎn)程倉(cāng)庫(kù))
4個(gè)區(qū)域的具體的工作流程如下圖所示:

git里面的操作有許多的指令,這里先簡(jiǎn)單羅列一下最為基礎(chǔ)的指令:

2、Android單元測(cè)試
2.1、單元測(cè)試概述
所謂單元測(cè)試是測(cè)試應(yīng)用程序的功能是否能夠按需要正常運(yùn)行,并且確保是在開(kāi)發(fā)人員的水平上,單元測(cè)試生成圖片。單元測(cè)試是一個(gè)對(duì)單一實(shí)體(類(lèi)或方法)的測(cè)試。單元測(cè)試是每個(gè)軟件公司提高產(chǎn)品質(zhì)量、滿足客戶需求的重要環(huán)節(jié)。
2.2、JUnit
JUnit 是一個(gè) Java 編程語(yǔ)言的單元測(cè)試框架。它促進(jìn)了“先測(cè)試后編碼”的理念,強(qiáng)調(diào)建立測(cè)試數(shù)據(jù)的一段代碼,可以先測(cè)試,然后再應(yīng)用。這個(gè)方法就好比“測(cè)試一點(diǎn),編碼一點(diǎn),測(cè)試一點(diǎn),編碼一點(diǎn)……”,增加了程序員的產(chǎn)量和程序的穩(wěn)定性,可以減少程序員的壓力和花費(fèi)在排錯(cuò)上的時(shí)間。
2.3、JUnit的基本使用
Android項(xiàng)目里面其實(shí)已經(jīng)內(nèi)含了JUnit,我們直接創(chuàng)建一個(gè)Android project,然后工程目錄如下:

上圖中標(biāo)紅的地方就是Android自動(dòng)為我們創(chuàng)建的存放測(cè)試程序的地方。而在build.gradle當(dāng)中,也會(huì)發(fā)現(xiàn)AS已經(jīng)自動(dòng)引入了JUnit包:

這里我們先來(lái)簡(jiǎn)單的感受一下JUnit,首先我們來(lái)創(chuàng)建一個(gè)被測(cè)試類(lèi)Calculator,然后簡(jiǎn)單的實(shí)現(xiàn)一個(gè)加法的函數(shù):
public class Calculator {
public int add(int x,int y) {
return x + y;
}
}
接著我們就來(lái)創(chuàng)建該類(lèi)的一個(gè)測(cè)試類(lèi),右鍵我們的類(lèi)名,然后找到Go To,選擇Test:

接著我們?cè)诔鰜?lái)的面板上面進(jìn)行如下的配置:

然后點(diǎn)擊ok,選擇完路徑之后就會(huì)自動(dòng)創(chuàng)建一個(gè)測(cè)試類(lèi):

這里出現(xiàn)了兩個(gè)注解@Before和@After。首先是@Before,它的主要作用是來(lái)對(duì)對(duì)象進(jìn)行初始化,而@After就是用來(lái)清理一些資源。它們會(huì)在運(yùn)行每個(gè)@Test方法前后自動(dòng)運(yùn)行。
然后我們就可以來(lái)對(duì)我們的類(lèi)進(jìn)行測(cè)試了,具代碼如下:
public class CalculatorTest {
private Calculator calculator;
@Before
public void setUp() throws Exception {
calculator = new Calculator();
}
@After
public void tearDown() throws Exception {
}
@Test
public void test1() {
assertEquals(5,calculator.add(2,3));
assertEquals(7,calculator.add(3,4));
assertEquals(9,calculator.add(5,5));
}
}
我們使用@Test注解來(lái)表明該方法是一個(gè)測(cè)試方法,在測(cè)試方法中我們使用到了assertEquals(5,calculator.add(2,3));表示期望我們的add方法能夠返回5,assertEquals(expected, actual)是最常用的測(cè)試方法,同時(shí)Junit中還定義了其他的一些方法:
- assertTrue(): 期待結(jié)果為true
- assertFalse(): 期待結(jié)果為false
- assertNotNull(): 期待結(jié)果為非null
- assertArrayEquals(): 期待結(jié)果為數(shù)組并與期望數(shù)組每個(gè)元素的值均相等
在創(chuàng)建完我們的Junit方法之后就可以來(lái)單獨(dú)運(yùn)行,對(duì)我們的測(cè)試類(lèi)右鍵,然后找到run的選項(xiàng)運(yùn)行即可:


運(yùn)行結(jié)果如上可以看出,前兩個(gè)沒(méi)有問(wèn)題,輸出正確,但是第三個(gè)出現(xiàn)了錯(cuò)誤,我們希望函數(shù)返回值是9,但是函數(shù)卻返回了10,所以報(bào)錯(cuò)。
推薦閱讀: JUnit教程+實(shí)踐
3、打包工具Walle使用及原理
3.1、Walle概述
Walle(瓦力):Android Signature V2 Scheme簽名下的新一代渠道包打包神器
瓦力通過(guò)在Apk中的APK Signature Block區(qū)塊添加自定義的渠道信息來(lái)生成渠道包,從而提高了渠道包生成效率,可以作為單機(jī)工具來(lái)使用,也可以部署在HTTP服務(wù)器上來(lái)實(shí)時(shí)處理渠道包Apk的升級(jí)網(wǎng)絡(luò)請(qǐng)求。
3.2、Walle配置
首先在項(xiàng)目的build.gradle文件中添加Walle插件依賴

然后在app的build.gradle中添加一個(gè)用于讀取渠道名的依賴庫(kù):

接著我們來(lái)創(chuàng)建一個(gè)config,將我們的簽名配置上去:

配置完成之后,會(huì)在app 下的
build.gradle里面自動(dòng)生成配置信息:
然后,我們?cè)赼pp的build.gradle中添加如下信息:

具體條目解釋可見(jiàn):Walle-GitHub
到這里如果點(diǎn)擊sync now還是會(huì)報(bào)配置 app 項(xiàng)目出現(xiàn)問(wèn)題,具體原因是出現(xiàn)在我們 build.gradle中buildTypes{} 這樣的一個(gè)閉包中,我們需要在閉包中添加如下信息:

到這里,基本上就能添加依賴成功。
推薦閱讀: 導(dǎo)入Walle 時(shí)報(bào)錯(cuò)
3.3、Walle打包
生成渠道包的方式是和assemble${variantName}Channels指令結(jié)合,渠道包的生成目錄默認(rèn)存放在 build/outputs/apk/,也可以通過(guò)walle閉包中的apkOutputFolder參數(shù)來(lái)指定輸出目錄
用法示例:
生成渠道包 gradlew clean assembleReleaseChannels
支持 productFlavors gradlew clean assembleMeituanReleaseChannels
生成單個(gè)渠道包 gradlew clean assembleReleaseChannels -PchannelList=anzhuo
生成多個(gè)渠道包 gradlew clean assembleReleaseChannels -PchannelList=wandoujia,baidu
在打包過(guò)程中可能會(huì)報(bào)錯(cuò):

具體的原因是由于在使用Oracle JDK 14時(shí),所有g(shù)radle(6.2.2)任務(wù)都會(huì)失敗,所以這里我們的解決方法是要么使用低版本的JDK,要么就對(duì)Android studio里面的gradle進(jìn)行更新。
推薦閱讀: Walle打包方式 | Walle打包出錯(cuò) | gradle更新方法 | gradle版本對(duì)應(yīng)
3.4、Walle原理
Android 7.0(Nougat)引入一項(xiàng)新的應(yīng)用簽名方案APK Signature Scheme v2,它是一個(gè)對(duì)全文件進(jìn)行簽名的方案,能提供更快的應(yīng)用安裝時(shí)間、對(duì)未授權(quán)APK文件的更改提供更多保護(hù),在默認(rèn)情況下,Android Gradle 2.2.0插件會(huì)使用APK Signature Scheme v2和傳統(tǒng)簽名方案來(lái)簽署你的應(yīng)用。
關(guān)于新簽名方案和舊簽名方案的區(qū)別,用一張圖概括如下:

新的簽名方案會(huì)在ZIP文件格式的 Central Directory 區(qū)塊所在文件位置的前面添加一個(gè)APK Signing Block區(qū)塊,之前的渠道包生成方案是通過(guò)在META-INF目錄下添加空文件,用空文件的名稱(chēng)來(lái)作為渠道的唯一標(biāo)識(shí),之前在META-INF下添加文件是不需要重新簽名應(yīng)用的,這樣會(huì)節(jié)省不少打包的時(shí)間,從而提高打渠道包的速度。但在新的應(yīng)用簽名方案下META-INF已經(jīng)被列入了保護(hù)區(qū)了,也就是說(shuō)對(duì)Contents of ZIP entries,ZIP Central Directory和ZIP End of Central Directory都有影響,所以,就只能在APK Signing Block里面來(lái)做文章。
推薦閱讀: 新一代開(kāi)源 Android 渠道包生成工具 Walle
4、Android TV項(xiàng)目的基本結(jié)構(gòu)
4.1、TV項(xiàng)目概述
這里直接引用Android官網(wǎng)的話來(lái)說(shuō):
TV 應(yīng)用使用的結(jié)構(gòu)與手機(jī)和平板電腦的應(yīng)用相同。這表示您可以根據(jù)自身對(duì) Android 應(yīng)用的既有知識(shí)創(chuàng)建新的 TV 應(yīng)用,也可以擴(kuò)展現(xiàn)有應(yīng)用,使其支持 TV 設(shè)備。不過(guò),TV 與手機(jī)和平板電腦設(shè)備在用戶交互模式上差異很大。要讓您的應(yīng)用在 TV 設(shè)備上取得成功,您必須設(shè)計(jì)新的布局,使用戶在距離電視 10 英尺的地方能輕松看清楚屏幕內(nèi)容,并且只需使用方向鍵和選擇按鈕便可完成導(dǎo)航。
4.2、TV項(xiàng)目的聲明
- 聲明 Leanback 支持
聲明應(yīng)用使用 Android TV 所要求的 Leanback 界面。如果要開(kāi)發(fā)一款在移動(dòng)設(shè)備(手機(jī)、穿戴式設(shè)備、平板電腦等)以及 Android TV 上都可運(yùn)行的應(yīng)用,請(qǐng)將 required 屬性值設(shè)為 false。如果將 required 屬性值設(shè)為 true,則應(yīng)用將只能在使用 Leanback 界面的設(shè)備上運(yùn)行。
<manifest>
<uses-feature android:name="android.software.leanback"
android:required="false" />
...
</manifest>
- 將觸摸屏聲明為非必備條件
想要在 TV 設(shè)備上運(yùn)行的應(yīng)用不依賴于觸摸屏進(jìn)行輸入。需要在 TV 應(yīng)用的清單中聲明
android.hardware.touchscreen功能并非必備功能。此設(shè)置會(huì)將應(yīng)用標(biāo)識(shí)為能夠在 TV 設(shè)備上工作,也是在 Google Play 中將應(yīng)用視為 TV 應(yīng)用的必備條件。代碼如下:
<manifest>
<uses-feature android:name="android.hardware.touchscreen"
android:required="false" />
...
</manifest>
- 聲明TV Activity
在Activity中的intent 過(guò)濾器來(lái)聲明
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LEANBACK_LAUNCHER" />
</intent-filter>