A Leaf


  • 首页

  • 标签

  • 归档

  • 搜索

Android单元测试总结

发表于 2019-08-03

当年做Launcher单元测试的总结的一些要点,回顾一下

简述

参考资料:

Android自动化测试–学习浅谈
Android单元测试实践
Android单元测试 - 如何开始?
Android单元测试系列: java的单元测试比较详细,有MVP和一些流行框架的测试方法

Android有关的单元测试大体分为两类:

  1. 本地单元测试

    • 运行在jvm上的测试框架,不需要Android环境
    • 位于src/test/java
    • gradle引入时使用testCompile
    • 有Junit4、Mockito、Powermockito,Robolectric
  2. Android Instrumentation测试

    • 运行在Android环境上的测试框架,依赖真机或都模拟器环境
    • 代码位于src/androidTest/java
    • gradle引入时使用androidTest
      有AndroidJUnitRunner,Espresso, UI Automator

各种框架简介:

  1. Junit4: 基础的Java单元测试
  2. Mockito: 模拟测试的类,是一个工具类的集合,配置其它框架使用
  3. Robolectric: JVM环境中模拟Android的环境,可以在不连接Android设备的情况下进行测试。听起来很美好,但使用起来不是很方便,还一堆坑,介绍文章: https://www.jianshu.com/p/d0bc9ebaaea1
  4. Espresso: UI测试,适合白盒测试
  5. UI Automator: UI测试,适合黑盒测试,测试组的自动化脚本应该就是基于这个写的

框架结构

使用Android Instrumentation测试,测试代码写在src/androidTest/java目录下

使用到的框架有junit4, mockito, Instrumentation, uiautomator, espresso
gradle下的依赖方式:

1
2
3
4
5
6
7
8
9
10
defaultConfig {
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

//dependences
androidTestCompile libraries.mockitoAndroid
androidTestCompile libraries.testRunner
androidTestCompile libraries.uiautomator
androidTestCompile libraries.annotations
androidTestCompile libraries.espresso
阅读全文 »

Android仿IOS打开应用进出场动画开发

发表于 2019-07-30

3年前开发Rom时的一个任务,就是仿照IOS打开应用和退出应用的开发过程和思路,可能已经过时,现在拿出来看看以前的思路

目标

最终效果做到如下的形式: 点击Launcher上的icon,app从Icon的位置开始放大到全屏,观察发现Launcher也有从Icon位置放大的效果;退场时,app界面和Launcher同时缩小到Icon位置

设置方法的选择:

进出场动画和转场动画的本质是一样,都是从一个activity过渡到另一个activity的动画,所不同是进出场动画是在两个app之间的过渡,而且Launcher所在的activity是一个壁纸窗口,这是使用的时候需要注意的。

三种方法

  • 设置theme中的 android:windowAnimationStyle
    这是最简单方便的方式,只需要我们配置几个动画的xml就ok了,缺点是由于是在主题的里面的静态资源,不能根据实际情况改变动画类型和和设置相关参数。诸多条件限制决定了这种方式不能达到目的。
  • overridePendingTransition方式
    这种方式可以让我们覆盖掉第一种方式设置的动画,优点是我们可以在代码里面动态改变它,但遗憾的是这个方法只受动画的xml文件形式,也无法接受设置动画的参数。
  • ActivityOptions方式
    这种方法是在startActivity的时候,通过ActivityOptions构造出一个Bundle参数,传递给WindowManager,用来覆盖默认的动画,这样就为我们定义转场动画提供了扩展空间。实际查看Launcher的源代码,原生也是这么做的。
    阅读全文 »

Electron笔记

发表于 2018-07-07

参考:

官网: https://electronjs.org/docs
Electron: 从零开始写一个记事本app

环境安装

安装node.js : https://nodejs.org/en/

安装npm:

npm可能用不了,可以用cnpm, 官网https://npm.taobao.org/
安装命令:

1
npm install -g cnpm --registry=https://registry.npm.taobao.org

安装electron包:

1
2
3
>cnpm install -g electron
OR
>npm install electron -g

验证electron安装成功: 运行electron

安装Electron-forge
这是一个类似于傻瓜开发包的Electron工具整合项目。具体介绍点击 这里。

1
cnpm install -g electron-forge

新建项目

通过以下命令创建项目:

1
electron-forge init [项目名]

Android Studio 上传代码到Maven仓库

发表于 2018-07-04

将自己的代码库上传到Maven一般有几个选择:

  1. 本地仓库
  2. 自己搭建的maven私有仓库, 如: Nexus
  3. 上传到Maven
  4. 上传到jcenter
  5. 上传到jitpack,这个上传很方便,比较推荐

参考

Android Studio上传项目到Maven仓库

几点注意

  1. 上传library不能引用aar
  2. 配置了publishNonDefault true会引用上传时将Release和Debug的aar都上传到Maven,所以要么去除要么按照下面的方法配置
  3. 注意如果上传到snapshots测试仓库中,version必须以-SNAPSHOT结尾

Gradle上传配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apply plugin: "maven"

def compileMode = 1

//分别为正式仓库,测试仓库和本地仓库,
def releaseUrl = "http://192.168.1.78:8090/nexus/content/repositories/releases"
def snapshotsUrl = "http://192.168.1.78:8090/nexus/content/repositories/snapshots/"
def localUrl = 'file://' + new File(System.getProperty('user.home'), '.m2/repository').absolutePath
def uploadUrl = compileMode == 1 ? snapshotsUrl : compileMode == 2 ? localUrl : releaseUrl

uploadArchives {
repositories {
mavenDeployer {
repository(url: uploadUrl) {
authentication(userName: NAME, password: PASSWORD) // maven授权信息
}

pom.version = VERSION
pom.artifactId = ARTIFACT_ID
pom.groupId = GROUP_ID
}
}
}

注意如果上传到snapshots测试仓库中,version必须以-SNAPSHOT结尾

多flavor或多buildType配置

maven上传是默认不支持多flavor的,如果library配置了publishNonDefault true, 在执行gradlew upload时会将releas和debug的aar包都上传上去,导致在引用时无法找到aar, 这点千万要注意, 需要修改gradle配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
uploadArchives {
repositories {
mavenDeployer {
repository(url: uri(uploadUrl)){
//配置账号密码
authentication(userName: "userName", password: "password")
}
android.libraryVariants.all { variant ->
def isFlavor = !variant.flavorName.isEmpty()
def isRelease = variant.buildType.name == "release"

//只上传release的,如果没有多个flavor的去掉isFlavor的判断
if(isRelease && isFlavor){
def _flavorName = "${variant.flavorName}"

//此处需要再进行一次过滤,否则debug的会被上传上去
addFilter(_flavorName) { artifact, file ->
(artifact.attributes.classifier == "${variant.flavorName}Release")
}
pom(_flavorName).version = android.defaultConfig.versionName
pom(_flavorName).groupId = "ARTIFACT_ID"
pom(_flavorName).artifactId = "GROUP_ID-${_flavorName}"
}
}
}
}
}

将源码,java doc等一并上传

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// 指定编码
tasks.withType(JavaCompile) {
options.encoding = "UTF-8"
}

// 打包源码
task sourcesJar(type: Jar) {
from android.sourceSets.main.java.srcDirs
classifier = 'sources'
}

task javadoc(type: Javadoc) {
failOnError false
source = android.sourceSets.main.java.sourceFiles
classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
classpath += configurations.compile
}

// 制作文档(Javadoc)
task javadocJar(type: Jar, dependsOn: javadoc) {
classifier = 'javadoc'
from javadoc.destinationDir
}

artifacts {
archives sourcesJar
archives javadocJar
}

上传jitpack

jitpack网址:https://jitpack.io/

添加jitpack的仓库引用:

1
maven { url 'https://jitpack.io' }

Android性能优化

发表于 2018-04-15

工作几年,主要负责过InCallUI和Launcher,虽然不多,但在性能优化上还是有一些自己的经验和看法,在这里记录一下。

首先我认为性能优化最核心的思想就是提升用户体验,何谓体验? 可能不同的人有不同的答案.
在我看来一定要站在用户角度才知道优化什么。
有点杂乱,先记录要点, 以后再详细写:

  1. 启动速度。关键点是要把第一页的内容尽早展现给用户。初始化流程; 启动页白屏; 布局层次; 懒加载; cpu运行情况
  2. 流畅性。关键点是主线程的耗时流程。布局层次,布局重用,过度绘制,RecyclerView优化,动画优化,自定义布局和View,耗时操作移去子线程
  3. 内存。图片优化(不用过大的背景图,RGB555,使用Shape或适量图,tint涂色),慎用三方库,及时释放不用的内存。

使用工具检测

  1. TraceView找出耗时方法
  2. log输出真正的耗时,方便对比优化前后
  3. 过度绘制显示绘制层次
  4. 布局查看器查看布局层次结构
  5. Systrace查看流程度
  6. CPU Profiler检查线程运行忙碌情况
  7. Memory Profiler检查内存占用情况
  8. Lint代码检查工具检查代码
12…4
A Leaf

A Leaf

16 日志
10 标签
GitHub
© 2019 A Leaf
本站访客数:
由 Hexo 强力驱动
|
主题 — NexT.Pisces v5.1.4