騰訊實(shí)習(xí)| 總結(jié)(1)

前言

  • 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工作流程

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


git指令

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,然后工程目錄如下:

Android工程目錄

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

build.gradle

這里我們先來(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:

Test

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

配置面板

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


測(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)行即可:

run
運(yùn)行結(jié)果

運(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,將我們的簽名配置上去:

配置config

配置完成之后,會(huì)在app 下的 build.gradle里面自動(dòng)生成配置信息:
image.png

然后,我們?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ò):


報(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ū)別,用一張圖概括如下:


區(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 DirectoryZIP 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>

4.3、TV項(xiàng)目的創(chuàng)建

推薦閱讀: Android TV 應(yīng)用開(kāi)發(fā)教程

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

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