盒子
盒子
文章目录
  1. 与Gradle的爱恨情仇
    1. 配置全局参数
    2. 构建defaultConfig
    3. 构建buildTypes
    4. 关于签名
    5. 可选配置
    6. 构建Proguard 混淆
    7. 动态设置参数
    8. 多渠道打包
    9. 其他注意事项
    10. Grovvy
  2. 深藏功与名的开发者工具
    1. AAPT
    2. Lint
    3. 无线调试
    4. 9Patch工具
    5. Hierarchy viewer
    6. 查看UI
    7. 开发者模式
  3. App背后的故事 - 性能检测与分析工具
    1. UI性能分析
    2. 内存区分
    3. GC系统
    4. 获取更多内存
      1. 通过子线程
      2. Native Heap
      3. openGL
      4. LargeHeap
      5. 系统内存警告
      6. 检测内存泄漏工具

《Android群英传 神兵利器》读书笔记

《Android群英传 神兵利器》 - Android开发的工具使用

这是一本Android开发的工具书,里面的提到的工具基本上是每个Android开发者必备的技能,买这本书的起因是看到有介绍Gradle和性能优化。里面提到的很多工具之前都是用过,所以看得很快,只care自己不熟知的,所以这篇读书笔记是对自己不熟的地方的整理和摘录。

与Gradle的爱恨情仇

配置全局参数

配置后就可以统一管理com.android.support:design版本号了

1
2
3
4
5
6
7
8
9
10
11
根目录的build.gradle中
ext {
// Support library and architecture components support minSdk 19 and above.
minSdkVersion = 19
targetSdkVersion = 26
compileSdkVersion = 26
buildToolsVersion = '26.0.2'
// App dependencies
supportLibraryVersion = '27.0.2'
}

使用:

1
2
3
4
5
6
7
defaultConfig {
applicationId "com.example.jingbin.cloudreader"
minSdkVersion rootProject.ext.minSdkVersion
targetSdkVersion rootProject.ext.targetSdkVersion
}
compile "com.android.support:design:$rootProject.supportLibraryVersion"

构建defaultConfig

1
2
3
4
5
6
7
defaultConfig{
versionName getCustomVersionName();
}
// build.gradle定义方法:
def getCustomVersionName{
......
}

构建buildTypes

1
2
3
4
5
6
buildTypes{
// xys.initWith(buildTypes.debug) 也可以继承其他的构建类型
xys{
applicationIdSuffix ".xys"
}
}

gradle assembleDebug / assembleRelease / assembleXys

生成另一个包,在包名后加上”.xys”,这样就可以双开了,不用手动更改包名!

关于签名

签名文件保存在住module的根目录下。
系统有一个默认的debug签名

Android Studio中签名文件是“.jks”文件
Eclipse中签名文件是”.keystore”文件

配置签名:

1
2
3
4
5
signingConfigs{
xys{
...
}
}

可选配置

1
2
3
4
5
CompileOptions : 配置编译的选项 JDK
// 使用lint检查代码时错误的话停止,加上这个之后就会继续,但是一般不启动lint,因为启动后会编译很慢
lintOptions{
abortOnError false
}

构建Proguard 混淆

混淆能精简代码、资源、优化代码

1
2
3
4
5
6
7
8
9
10
11
12
13
buildTypes {
release {
// 混淆
minifyEnabled true
// Zipalign优化
zipAlignEnabled true
// 移除无用的resource文件
shrinkResources true
// 前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,后一个文件是自己的定义混淆文件
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}

动态设置参数

使用key/value的方式,引入签名的配置,而不是直接写入,这样会增强安全性,特别是对于开源项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//配置签名文件
signingConfigs {
release {
storeFile file(pStoreFile)
storePassword pStorePassword
keyAlias pKeyAlias
keyPassword pKeyPassword
}
debug {
storeFile file(pStoreFile)
storePassword pStorePassword
keyAlias pKeyAlias
keyPassword pKeyPassword
}
}

然后在gradle.properties中配置

1
2
3
4
5
# 签名信息
pStoreFile = ./xxxxx.keystore
pStorePassword = xxxxx
pKeyAlias = xxxxx
pKeyPassword = xxxxx

多渠道打包

过程相对比较复杂,且网上很多教程,AS3.0和以上的版本略有不同就不列出详细信息

在清单文件创建占位符 -> 配脚本 -> 生成重命名包(注意AS3.0变化)

系统有一个BuildConfig类文件,是无法改变值的。里面有一些常用的配置参数,比如版本号什么的,我们可以手动配置,然后从这个类里面取值。
手动配置:

1
2
3
4
5
6
7
buildTypes{
xys{
buildConfigField "boolean","testFlag","false"
signingConfig signingConfig.xys
applicaitonIdSuffix ".xys"
}
}

这样:

1
2
3
4
5
6
7
8
9
10
public final class BuildConfig{
public static final boolean DEBUG = Boolean.parseBoolean("true");
public static final String APPLICATION_ID = "com.example.jingbin.cloudreader";
public static final String BUILD_TYPE = "debug";
public static final String FLAVOR = "";
public static final int VERSION_CODE = 14;
public static final String VERSION_NAME = "2.0.0";
// Fields from build type: xys 额外生成了这个
pubic static final boolean testFlag = false;
}

其他注意事项

引用Maven中央库:

1
2
3
4
5
// gradle编译加速
dexOptions {
incremental true
javaMaxHeapSize "4g"
}

不同包或相同包下,最好不要出现相同的文件,Merge到一起时,相同的资源名就会发生冲突!

Grovvy

Grovvy(语言)对于Gradle(脚本),好比于Java对于Android。

Grovvy核心是Task。
Task依赖:增加一个依赖方法,连接起来,让不在一起的Task能够有一个先后执行的关系。

三个阶段 do Something
Initiliacation 初始化阶段,执行项目中的setting.gradle脚本
Configration 解析每个Profect中的build.gradle脚本,生成有向关系图–tashgrash
Build 编译运行阶段,按照tashgraph执行编译

深藏功与名的开发者工具

AAPT

Android Asset Packaging Tool -> SDK - build-tools

可以查看,创建,修改压缩文件(Zip、jar、APK),也可将资源编译成二进制文件。
查看报信息,资源目录等。

Lint

用于检测各项目中(包含库)中的一些错误问题,比如资源未用或过时的api等。
在AS命令行使用gradle lint。(如果gradle版本更新则要更改配置)

1
2
3
4
// 使用lint检查代码时错误的话停止,加上这个之后就会继续,但是一般不启动lint,因为启动后会编译很慢
lintOptions{
abortOnError false
}

无线调试

基于ADB的TCP/IP模式 - 《图解TCP/IP》

9Patch工具

SDK -> tools -> draw9patch(画单边就行)
在AS中点击鼠标右键生成9patch图

Hierarchy viewer

检测UI性能的工具
testCompile 只有Debug生效,Release解除

查看UI

iautomatorviewer

开发者模式

调试GPU过渡绘制

App背后的故事 - 性能检测与分析工具

UI性能分析

  • 调试GPU过渡绘制
  • 16ms黄金准则
  • 布局核心准则:
    • 尽量使布局的view树扁平,降低布局的层次
    • Google建议View不宜超过8层
    • 使用组合控件
  • LinearLayout与RelativeLayout
    • 使用LinearLayout:保证层级不深
    • 使用RelativeLayout:避免嵌套
  • Hierarchy viewer:检测UI性能的工具
  • Merge与Viewstub 布局懒加载
  • 图片重绘 Overdraw
    • Debug Gpu Overdraw查看重绘界面
    • 1、改善布局,避免重叠
    • 2、控件与主背景颜色相同:可移除控件背景
    • 3、自定义view背景,使用dipRect属性减少重绘区域
  • Profile Gpu rendering
    • 在开发者模式中,GPU呈现模式分析 -> 在屏幕上显示条形图

内存区分

  • 寄存器 Registers:用于存储指令、地址、数据。
  • 栈 Stack:存放基本类型的数据、对象的引用和函数地址等,由系统控制。
  • 堆 Heap:存放对象本身和数组,由开发者控制。
  • 静态域 static field:存储静态变量。
  • 常量池 constant pool:存储常量。

开发者能够控制的内存,基本在于堆和栈区域,他们的区别如下:

堆/栈 GC管理 存取速度
由GC系统控制。变量生命周期结束后,由GC系统决定何时回收
由虚拟机控制。变量生命周期结束后,由虚拟机释放该变量占用的内存空间

常用的内存类型:

  • VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)。
  • RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)。
  • PSS - Proportinal Set size 实际使用的物理内存(比例分配共享库占用的内存)。
  • USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)。

一般来说内存占用大小有如下规律:VSS≥RSS≥PSS≥USS

GC系统

GC系统遵循GC Root搜索算法,根据是否包含其他对象的引用来判断是否需要进行GC。在Android2.3之后,系统修改了GC,将GC作为并发线程,同时每次GC并不会遍历整个Heap,而是只遍历一部分内存。

GC系统根据GC Root算法进行GC工作,该算法会以一个GC Root对象为起点,搜索与之相关联的对象。如果某个对象与GC Root对象没有找到引用链,则表示該对象需要进行回收,常见的GCRoot对象有以下几种。

  • class:由System class loader 加载的对象。
  • JNI:jni相关调用的引用、变量、参数。
  • Thread:活着的线程。
  • Stack:栈中的对象。
  • 静态:方法区类的静态属性引用的对象。
  • 常量:方法区中的常量引用的对象(final类型)。

获取更多内存

通过子线程

安卓系统的内存分配通过进程分配。

WebView内存回收非常麻烦,需要运行在单独进程中(android:process)。
然后通过kill process回收内存。

Native Heap

安卓系统限制的是JavaHeap的内存大小。

系统控制的,不受大小限制 -> Fresco.

openGL

图像处理

LargeHeap

通过清单文件配置
加大GC难度,使GC变慢,退到后台时,很容易被回收。

系统内存警告

根据情况释放内存

  • onLowMemory
  • onTrimMemory

检测内存泄漏工具

  • MAT - Memory Analysis Tool
  • LeakCanary
支持一下
扫一扫,支持我
  • 微信扫一扫
  • 支付宝扫一扫