前言
- git基础指令
- Android单元测试
- 打包工具Walle使用及原理
- TV项目的基本结构
1、git基础指令
git的工作流程中主要途径4个区域:
- Workspace(工作区)
- Index (暂存区)
- Repository(本地仓库)
- Remote(远程仓库)
4个区域的具体的工作流程如下图所示:
git里面的操作有许多的指令,这里先简单罗列一下最为基础的指令:
2、Android单元测试
2.1、单元测试概述
所谓单元测试是测试应用程序的功能是否能够按需要正常运行,并且确保是在开发人员的水平上,单元测试生成图片。单元测试是一个对单一实体(类或方法)的测试。单元测试是每个软件公司提高产品质量、满足客户需求的重要环节。
2.2、JUnit
JUnit 是一个 Java 编程语言的单元测试框架。它促进了“先测试后编码”的理念,强调建立测试数据的一段代码,可以先测试,然后再应用。这个方法就好比“测试一点,编码一点,测试一点,编码一点……”,增加了程序员的产量和程序的稳定性,可以减少程序员的压力和花费在排错上的时间。
2.3、JUnit的基本使用
Android项目里面其实已经内含了JUnit,我们直接创建一个Android project,然后工程目录如下:
上图中标红的地方就是Android自动为我们创建的存放测试程序的地方。而在build.gradle
当中,也会发现AS已经自动引入了JUnit包:
这里我们先来简单的感受一下JUnit,首先我们来创建一个被测试类Calculator
,然后简单的实现一个加法的函数:
public class Calculator {
public int add(int x,int y) {
return x + y;
}
}
接着我们就来创建该类的一个测试类,右键我们的类名,然后找到Go To,选择Test:
接着我们在出来的面板上面进行如下的配置:
然后点击ok,选择完路径之后就会自动创建一个测试类:
这里出现了两个注解@Before
和@After
。首先是@Before
,它的主要作用是来对对象进行初始化,而@After
就是用来清理一些资源。它们会在运行每个@Test
方法前后自动运行。
然后我们就可以来对我们的类进行测试了,具代码如下:
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
注解来表明该方法是一个测试方法,在测试方法中我们使用到了assertEquals(5,calculator.add(2,3));
表示期望我们的add方法能够返回5,assertEquals(expected, actual)
是最常用的测试方法,同时Junit中还定义了其他的一些方法:
- assertTrue(): 期待结果为true
- assertFalse(): 期待结果为false
- assertNotNull(): 期待结果为非null
- assertArrayEquals(): 期待结果为数组并与期望数组每个元素的值均相等
在创建完我们的Junit方法之后就可以来单独运行,对我们的测试类右键,然后找到run的选项运行即可:
运行结果如上可以看出,前两个没有问题,输出正确,但是第三个出现了错误,我们希望函数返回值是9,但是函数却返回了10,所以报错。
推荐阅读: JUnit教程+实践
3、打包工具Walle使用及原理
3.1、Walle概述
Walle(瓦力):Android Signature V2 Scheme签名下的新一代渠道包打包神器
瓦力通过在Apk中的APK Signature Block
区块添加自定义的渠道信息来生成渠道包,从而提高了渠道包生成效率,可以作为单机工具来使用,也可以部署在HTTP服务器上来实时处理渠道包Apk的升级网络请求。
3.2、Walle配置
首先在项目的build.gradle文件中添加Walle插件依赖
然后在app的build.gradle中添加一个用于读取渠道名的依赖库:
接着我们来创建一个config,将我们的签名配置上去:
配置完成之后,会在app 下的
build.gradle
里面自动生成配置信息:
然后,我们在app的build.gradle
中添加如下信息:
具体条目解释可见:Walle-GitHub
到这里如果点击sync now
还是会报配置 app 项目出现问题,具体原因是出现在我们 build.gradle
中buildTypes{} 这样的一个闭包中,我们需要在闭包中添加如下信息:
到这里,基本上就能添加依赖成功。
推荐阅读: 导入Walle 时报错
3.3、Walle打包
生成渠道包的方式是和assemble${variantName}Channels
指令结合,渠道包的生成目录默认存放在 build/outputs/apk/
,也可以通过walle闭包中的apkOutputFolder参数来指定输出目录
用法示例:
生成渠道包 gradlew clean assembleReleaseChannels
支持 productFlavors gradlew clean assembleMeituanReleaseChannels
生成单个渠道包 gradlew clean assembleReleaseChannels -PchannelList=anzhuo
生成多个渠道包 gradlew clean assembleReleaseChannels -PchannelList=wandoujia,baidu
在打包过程中可能会报错:
具体的原因是由于在使用Oracle JDK 14时,所有gradle(6.2.2)任务都会失败,所以这里我们的解决方法是要么使用低版本的JDK,要么就对Android studio里面的gradle进行更新。
推荐阅读: Walle打包方式 | Walle打包出错 | gradle更新方法 | gradle版本对应
3.4、Walle原理
Android 7.0(Nougat)引入一项新的应用签名方案APK Signature Scheme v2,它是一个对全文件进行签名的方案,能提供更快的应用安装时间、对未授权APK文件的更改提供更多保护,在默认情况下,Android Gradle 2.2.0插件会使用APK Signature Scheme v2和传统签名方案来签署你的应用。
关于新签名方案和旧签名方案的区别,用一张图概括如下:
新的签名方案会在ZIP文件格式的 Central Directory
区块所在文件位置的前面添加一个APK Signing Block
区块,之前的渠道包生成方案是通过在META-INF
目录下添加空文件,用空文件的名称来作为渠道的唯一标识,之前在META-INF
下添加文件是不需要重新签名应用的,这样会节省不少打包的时间,从而提高打渠道包的速度。但在新的应用签名方案下META-INF
已经被列入了保护区了,也就是说对Contents of ZIP entries
,ZIP Central Directory
和ZIP End of Central Directory
都有影响,所以,就只能在APK Signing Block
里面来做文章。
推荐阅读: 新一代开源 Android 渠道包生成工具 Walle
4、Android TV项目的基本结构
4.1、TV项目概述
这里直接引用Android官网的话来说:
TV 应用使用的结构与手机和平板电脑的应用相同。这表示您可以根据自身对 Android 应用的既有知识创建新的 TV 应用,也可以扩展现有应用,使其支持 TV 设备。不过,TV 与手机和平板电脑设备在用户交互模式上差异很大。要让您的应用在 TV 设备上取得成功,您必须设计新的布局,使用户在距离电视 10 英尺的地方能轻松看清楚屏幕内容,并且只需使用方向键和选择按钮便可完成导航。
4.2、TV项目的声明
- 声明 Leanback 支持
声明应用使用 Android TV 所要求的 Leanback 界面。如果要开发一款在移动设备(手机、穿戴式设备、平板电脑等)以及 Android TV 上都可运行的应用,请将 required 属性值设为 false。如果将 required 属性值设为 true,则应用将只能在使用 Leanback 界面的设备上运行。
...
- 将触摸屏声明为非必备条件
想要在 TV 设备上运行的应用不依赖于触摸屏进行输入。需要在 TV 应用的清单中声明
android.hardware.touchscreen
功能并非必备功能。此设置会将应用标识为能够在 TV 设备上工作,也是在 Google Play 中将应用视为 TV 应用的必备条件。代码如下:
...
- 声明TV Activity
在Activity中的intent 过滤器来声明
4.3、TV项目的创建
推荐阅读: Android TV 应用开发教程