提速Android Gradle 构建

提速法则一览

手段 全量构建 Java增量构建 资源增量构建
升级 android gradle tools 到3.0 -15s(-25%) -10(-38%) -2.5(-16%)
避免使用遗留的Multidex -5.5s(-12%) -8(53%) same
debug 环境关闭multi-APK -4.8s(-12%) -0.5s(-6%) -3s(-26%)
设置包含最少的资源 -6s(-17%) -1.5s(-24%) -2s(21%)
关闭 png crunching -9s(-33%) same same
使用Instance Run +7s(+37%) -3s(-54%) -3s(-42%)
避免不注意的改变 - - -
不要使用动态版本号 - - -
注意分配 gradle 内存 - - -
开启 Gradle Caching -7s(-25%) same +0.5s(+12%)
使用implementation 或者 api 代替 compile - - -

以上优化方案基于android gradle tools 3.0-alpha

关于Santa Tracker Project

  • 9 个模块,包括Wear
  • 500 多个Java文件
  • 1700 个XML 文件,3500张PNG
  • Multi-dex
  • 没有 annotation processors
  • APK大小接近60MB

这个项目可以在Google Github 帐号中找到

继续阅读“提速Android Gradle 构建”

Activity 启动模式

启动模式分为4种,分别为

  1. Standrad
  2. SingleTop
  3. SingleTask
  4. SingleIntance

Standrad

就是默认的模式,启动多少个就是多少个

SingleTop

SingleTop 需要这样理解,SingleOnTop,当栈顶是我的时候,就不再创建新的实例。
例如,ABCD,启动D,还是ABCD。如果是ABDC,启动D,最后就变成ABDCD。

SingleTask

SingleOnTask的意思,我在这个任务栈是唯一的。需要注意的是,这货启动是默认自带clearTop效果的,也就是会把在它之后的Activity都清楚掉。
例如,任务栈中有ABDC,启动D,将会变成ABD,C将会被自动推出。

SingleIntance

这个可以看做是SingleTask加强版,使用这个属性的Activity,将会被单独放在一个任务栈中,然后这个Activity在进程中都是唯一个的

继续阅读“Activity 启动模式”

Bitmap.Config 一些理解

Bitmap Config 解析

Bitmap.Config
ALPHA_8 每个像素存储为单透明(alpha)通道。其实就是保存透明度而已
ARGB_4444 已经废弃的格式,推荐使用ARGB_8888
ARGB_8888 每个像素存储在4个Byte上,其实就是ARGB分别占用8bit的意思
HARDWARE 特殊配置,当位图只存储在图形内存中。
RGBA_F16 每个像素存储在8个Byte上,这个我不太看得懂,就是RGBA 格式保存,每一个占用16bit,F并不知道是什么意思
RGBA_F16 每个像素存储在8个Byte上,这个我不太看得懂,就是RGBA 格式保存,每一个占用16bit,F并不知道是什么意思
RGB_565 每个像素存储在2个Byte上,只有RGB通道被编码:红色以5位精度(32个可能值)存储,绿色以6位精度存储(64个可能值),蓝色存储5位精确。

位图占用内存计算

例:
选择的是ARGB_8888 分辨率为 100*100 的位图。
占用的内存应该是

100 * 100 * 4 = 40000 Byte = 39kB

总结

只要记住符号上表示的是bit就很容易计算Bitmap在内存中占用的大小了

快速配置shadowsocks主机

分为步骤

  1. 选择系统为centos7
  2. 更新kernel 为4.1 以上
  3. 开启bbr
  4. 安装docker-ce环境
  5. 使用shadowsock-docker部署ss

系统选择

各大主机提供商不太一样,这段靠自己吧

更新kernel

执行以下bash

或者直接在命令行上敲

curl -o- -L https://gist.githubusercontent.com/hangox/a9b977a9c026629101c38d5e6a2b4e76/raw/d97e16123218c068c024a12019e1a403ef47981f/update-kernel-for-centos7.sh | bash 

执行完成脚本之后将会重启系统,耐心等候重启就好了

继续阅读“快速配置shadowsocks主机”

配置 Groovy 写Android JUnit

为什么使用Groovy写JUnit

Groovy 是动态语言,动态语言干测试其实非常好用。比如,我要创建一个多种类型的数组,只要这样写def array = [12,12,'1212'] 这样我就很简单的创建了多种类型的数组了。如果是用java代码的话,你可以尝试一下需要多少行。groovy的优点不只是这些,详情请看Groovy的特性

Android中的配置方法

在Android中需要使用Groovy需要使用这个开源项目,里面有详细的配置说明。但是我按那个配置,老是编译不过,改了一下就可以了,就写下自己的办法吧。

配置buildScript


buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.0-beta7'
        //groovy插件依赖
        classpath 'org.codehaus.groovy:groovy-android-gradle-plugin:1.2.0'

    }
}

在需要使用的项目中,加入插件

apply plugin: 'groovyx.android'


添加groovy依赖

我这里只是使用Groovy 作为测试使用,所以我是用的是testImplementation,如果要在开发中使用Groovy,请改为implementation 就可以了

dependencies {
//使用官方推荐的反而不行
//    testImplementation 'org.codehaus.groovy:groovy:2.4.11:grooid'
//我该为了java使用的Groovy就可以了
    testImplementation 'org.codehaus.groovy:groovy-all:2.4.12'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.1', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
}

开始开发

test/groovy文件夹中建立你的Groovy 脚本,开始开发吧

示例项目

Android Studio 3.0 中支持的Java8 特性

集成方法

在Android Studio 3.0 中其实已经支持了Java8 的部分特性,其中最多人用的就是Lambda 表达式也在列。

在AS3.0中使用lambda 其实也很简单

  1. 升级Android Plugin到3.0.0-alpha1 或者以上
  2. 在build.gradle 中加入一下代码

    android {
      ...
    // Configure only for each module that uses Java 8
    // language features (either in its source code or
    // through dependencies).
    compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_8
    targetCompatibility JavaVersion.VERSION_1_8
    }
    }

就这样两部可以了。

如果你以前使用了jack或者me.tatarka.retrolambda,只需要移除相关的代码就可以了.

AS3.0 中java8 支持的特性和Api等级

Java 8 Language Feature 最低兼容的API等级
Lambda expressions 任意API等级。但是,只有当lambda所捕获的所有值都是可序列化的时候才支持lambda序列化。
Method References 任意API等级.
Type Annotations 任意API等级。但是,类型注释信息在编译时可用,但在运行时不可用。此外,TYPE 在API级别24及受以下,但不支持ElementType.TYPE_USEElementType.TYPE_PARAMETER。 
Default and static interface methods 任意API等级。
Repeating annotations 任意API等级。
Java 8 Language API 最低兼容的API等级
java.lang.annotation.Repeatable API level 24 or higher.
AnnotatedElement.getAnnotationsByType(Class) API level 24 or higher.
java.util.stream API level 24 or higher.
java.lang.FunctionalInterface API level 24 or higher.
java.lang.reflect.Method.isDefault() API level 24 or higher.
java.util.function API level 24 or higher.