Android Studio整体学习

前言

开发Android也有一年多的时间了,一直使用Android Studio。虽然一直都能正常开发,但是在开发过程中,对IDE的不熟悉还是会导致各种各样的问题,也会拉低开发效率去网上搜索。所以我想整体学习了解下Android Studio的使用,记录方便日后查询。

偏好设置

基础配置

编码方式

操作步骤: Preferences -> Editor -> File Encodings

个性化配置

字体和大小

操作步骤: Preferences -> Appearance & Behavior -> Appearance -> 勾选【Override default fonts by (not recommended)】 -> 选择所要的字体和字号
设置的是IDE的操作界面的字体和字号

工作台

菜单栏

文件(File)

编辑(Edit)

视图(View)

代码(Code)

分析(Analyze)

重构(Refactor)

构建(Build)

运行(Run)

工具(Tools)

版本控制系统(VCS)

窗口(Window)

帮助(Help)

导航条

菜单栏中View -> 勾选Navigation Bar可以显示导航条
20180802153319475218722.png

工具条

Android Studio的工具条分布在主界面的左右两边和底部。可以通过菜单栏->View->Tool Windows -> 查看Android Studio支持的所有工具列表

工具窗口

项目工具窗口(Project)

提供多种视图模式来查看项目结构

收藏夹工具窗口(Favorite)

可以添加经常查看或使用的文件和代码片段,以便快速查看

结构工具窗口(Structure)

以树状形式展示文件中元素的层次结构。单击元素可以跳转到编辑器中对应代码的位置

待处理任务工具窗口(TODO)

在Android Studio中待处理的任务可以注释使用TODO标识,该窗口显示所有待处理的任务

Android监控工具窗口(Android Profiler)

CPU监控
内存监控
网络监控

Logcat日志输出面板

快照工具窗口(Captures)

存放Android Monitor的dump处的heap、allocation、系统信息、布局解析等文件

构建变体工具窗口(Build Variants)

用来选择当前多渠道版本的构建,执行Build APK会构建出选中的渠道版本

Gradle工具窗口(Gradle project)

列出了当前项目和模块中支持的所有Gradle任务和运行配置,以便快速操作

项目

文件/目录名 说明
NewProject 项目
NewProject 自动生成的用于存放Android Studio配置文件的目录,包括版权、检查配置、jar包信息、项目名、编译、编码、gradle、模块等
NewProject/app 项目中的模块
NewProject/app/build 模块编译后的文件存放目录
NewProject/app/libs 模块依赖的jar包存放目录
NewProject/app/src/androidTest Android单元测试代码存放目录
NewProject/app/src/test 本地单元测试代码存放目录
NewProject/app/src/main 代码和资源存放目录
NewProject/app/src/main/java 代码目录
NewProject/app/src/main/res 资源目录
NewProject/app/src/main/res/drawable 存放能转化为绘制资源的位图文件或定义了绘制资源的XML文件(后缀为.png,.9.png,.jpg,.gif的图像文件)
NewProject/app/src/main/res/layout 存放定义了用户界面布局的XML布局
NewProject/app/src/main/res/anim 存放定义了补间动画或逐帧动画的XML文件
NewProject/app/src/main/res/animator 存放定义了属性动画的XML文件
NewProject/app/src/main/res/transition 存放定义了场景过渡动画的XML文件
NewProject/app/src/main/res/menu 存放定义了应用程序菜单资源的XML文件
NewProject/app/src/main/res/mipmap 存放启动图标目录
NewProject/app/src/main/res/mipmap-mdpi 中密度,适用于屏幕密度为160的手机屏幕
NewProject/app/src/main/res/mipmap-hdpi 高密度,适用于屏幕密度为240的手机屏幕
NewProject/app/src/main/res/mipmap-xhdpi 超高密度,适用于屏幕密度为320的手机屏幕
NewProject/app/src/main/res/mipmap-xxhdpi 超超高密度,适用于屏幕密度为480的手机屏幕
NewProject/app/src/main/res/mipmap-xxxhdpi 超超超高密度,适用于屏幕密度为640的手机屏幕
NewProject/app/src/main/res/values 存放定义了多种类型资源的XML文件
NewProject/app/src/main/res/values/color 存放定义了颜色状态列表资源的XML文件
NewProject/app/src/main/jniLibs so文件存放目录
NewProject/app/src/main/assets 附加的资源文件存放目录
NewProject/app/src/main/res/AndroidManifest.xml 应用程序配置文件
NewProject/app/.gitignore 模块中Git忽略配置文件
NewProject/app/app.iml 模块配置文件
NewProject/app/build.gradle 模块构建配置文件
NewProject/app/proguard-rules.pro 代码混淆配置文件
NewProject/build 项目编译目录
NewProject/gradle gradle目录
NewProject/.gitignore 项目中Git的忽略配置文件
NewProject/build.gradle 项目构建配置文件
NewProject/gradle.properties gradle配置文件
NewProject/gradlew gradlew配置文件
NewProject/gradlew.bat Windows上的gradlew配置文件
NewProject/local.preperties 属性配置文件
NewProject/settings.gradle 全局配置文件
External Libraries 项目中使用到的依赖库存放目录
External Libraries/< Andriod API 23 Platform > Android SDK版本和存放路径
External Libraries/< 1.7 > JDK版本和存放路径

创建可编译的资源文件

操作步骤: File -> 右击module -> New -> Android resource file -> 弹出【New Resource File】

  • File Name: 新建的资源文件名
  • Resource type: 资源类型
  • Root element: XML文件的根属性
  • Source set: 编译时引用的资源文件的来源设置,默认的是main,debug,release
  • Directory name: 资源文件的目录名与资源类型一一对应,不可更改
  • Available aualifiers: 可用的资源限定符
    • Country Code: 移动设备国家代码,唯一识别移动用户所属国家
    • Network Code: 移动设备网络代码,与Country Code相结合,用来表示唯一一个移动设备的网络运营商
    • Local: 国际化(多语言)
    • Layout Direction: 布局方向
    • Smallest Screen Width: 最小屏幕宽度。这个值是布局支持的最小宽度,而不管屏幕的当前方向
    • Screen Width: 最小的可用屏幕宽度。当方向在横向和纵向之间改变时,这个值会跟当前的实际宽度相匹配
    • Screen Height: 最小的可用屏幕高度
    • Size: 屏幕尺寸
      • Small: 小屏幕尺寸,320 * 426dp
      • Normal: 中等屏幕尺寸,320 * 470dp
      • Large: 大屏幕尺寸,480 * 640dp
      • X-large: 超大屏幕尺寸,720 * 960dp
    • Ratio: 宽高比率,指的是实际的物理尺寸宽高比率,分为Long和NotLong
    • Orientation: 限制横竖屏切换
      • Portrait: 竖屏
      • Landscape: 横屏
      • Square: 正方形
    • UI Mode: UI模式
      • Car Dock: 车座
      • Desk Dock: 桌座
      • Television: 电视上
      • Application: 装置
      • Watch: 手表
    • Night Mode: 夜间模式
      • Not Night: 白天
      • Night: 夜间
    • Density: 密度,指定不同密度的手机使用不同的资源
    • Touch Screen: 触屏类型
      • No Touch: 非触屏
      • Stylus: 触控笔
      • Finger: 手指
    • Keyboard: 键盘类型
      • Exposed: 设备有可用的键盘
      • Hidden: 设备有可用的硬键盘
      • Soft: 设备有可用的软键盘
    • Text Input: 文本输入法
      • No Keys: 设备没有用于文本输入的硬键盘
      • Qwerty: 设备有标准的硬键盘
      • 12Key: 设备有12个键的硬键盘
    • Navigation State: 导航键的状态
      • Exposed: 导航键可用
      • Hidden: 导航键不可用
    • Navigation Method: 导航方法
      • None: 除了使用触屏以外,设备没有其他导航设施
      • D-pad: 设备有用于导航的定向板
      • Trackball: 设备有用于导航的轨迹球
      • Wheel: 设备有用于导航的定向滚轮
    • Dimension: 自定义屏幕尺寸
    • Version: 版本,设备支持的API级别

创建不同分辨率图标

操作步骤: File -> 右击Module -> New -> Image Asset -> Asset Studio对话框

  • Icon Type: 图标类型
    • Launcher Icons(Adaptive and Legacy): 自适应和传统的图标
    • Launcher Icons(Legacy Only): 传统图标
    • Action Bar and Tab Icons: 标题栏和选项卡图标
    • Notification Icons: 通知图标
  • Asset Type: 资源类型
    • Image: 本地图片,自动生成不同分辨率的图标
    • Clip Art: 剪贴画,Android Icon
    • Text: 文字图标
  • Trim: 去除图标周围多余的空白
  • Scaling: 图标缩放
  • Shape: 图标形状
  • Effect: 设置文件折叠特效

创建矢量图

操作步骤: File -> 右击Module -> New -> Vector Asset -> Configure Image Asset对话框

可以同时使用Android提供的和本地的svg图片
可以设置颜色,大小和透明度

创建AIDL文件

操作步骤: File -> 右击Module -> New -> AIDL -> AIDL File

创建Android文件夹

文件夹 作用 默认位置
AIDL Folder 用于存放AIDL文件 src/main/aidl/
Assets Folder 用于存放原生资源文件 src/main/assets/
JNI Folder 用于存放JNI文件 src/main/jni/
Java Folder 用于存放Java文件 src/main/java/
Java Resources Folder 用于存放Java资源文件 src/main/resources/
RenderScript Folder 用于存放RenderScript文件 src/main/rs/
Res Folder 用于存放Android资源文件 src/main/res/

创建Resource Bundle文件

ResourceBundle(资源绑定)最大好处是可以使程序国际化,在bundle文件名后加上国家、语言关键字,系统就会自动载入相应的bundle文件。
properties文件一般的命名规范是: 自定义名语言代码国别代码.properties

操作步骤: File -> 右击Module -> New -> Resource Bundle -> 输入文件名”success” -> 添加语言代码 -> 双击打开properties -> 切换到Resource Bundle -> 点击+ -> 输入主键 -> 可以同时编辑不同语言的值

管理

项目窗口

Android Studio中支持好多种视图模式,要学会在适合的时候用适合的视图,提高开发效率

20180806153357044143471.png

视图模式

Project视图模式

Project视图模式展示全部文件信息,文件的位置是真实的物理结构。因此在查看文件的时候建议切换到Project模式。

Packages视图模式

Packages视图模式仅显示项目本身的代码和资源,其他的信息被隐藏了,代码和资源都以层级文件的形式显示。

Scratches视图模式

Scratches视图模式只显示草稿文件。

Scratch Files(草稿文件)是一个非常方便的功能,可以帮助我们快速实验和建立原型,可以在不修改项目和创建任何文件的情况下快速画出草图。

Android视图模式

Android视图模式会把一些我们不关心的文件和目录隐藏起来,以一种扁平化的方式显示项目结构,文件和目录通过类型进行分类,可以非常方便的查看文件。

Project Files视图模式

Project Files视图模式是类似Eclipse的项目结构类型。

Problems视图模式

Problems模式仅显示报错的文件结构。

Production视图模式

Production模式仅显示生产文件结构。

Tests视图模式

Tests模式仅显示测试文件结构。

常用设置和操作

展开和收缩窗口

展开窗口: shift + command + -> 每操作一次窗口向右扩展一下
收缩窗口: shift + command + <- 每操作一次窗口向左收缩一下
最大化窗口: shift + command + “‘“

定位文件在项目中的位置

Scroll from Source按钮

收起所有项目

Collapse All按钮

command + “-“

扁平化显示包名

选中 Flatten Packages,所有包名都会显示在同一级目录下,不会有层次结构

隐藏空的中间包名

选中 Hide Empty Middle Packages。项目窗口中的含有空文件夹的包名将会被隐藏。

缩写限定包名

选中 Abbreviate Qualified Package Names。项目缩写包名

显示成员

选中 Show Members。让项目窗口中的文件显示其他成员(字段、方法)

按类型排序

选中 Sort By Type。让文件按类型排序,否则项目窗口中的文件按字母排序。

文件夹显示在文件之前

选中 Folder Always on Top。让所有文件夹始终在文件之前,否则所有的文件和文件夹都会混在一起,按字母排序。

单击文件打开源码

选中 Autoscroll to Source。项目窗口中单击文件就能够在编辑器中自动打开。

从源码定位到文件

选中 Autoscroll from Source。打开源码后自动定位到该文件在项目窗口中的位置。

项目管理

管理最近打开的项目

为最近打开的项目进行分组

方便管理多个项目

操作步骤: 菜单栏 -> File -> Open Recent -> Manager Projects。
新建分组: 右击项目名称 -> New Project Group -> 输入分组名 -> OK。
添加分组: 右击项目名称 -> Move To Group —> 在列出的项目分组中选择目标分组。

改变目标默认图标

操作步骤: 菜单栏 -> File -> Open Recent -> Manager Projects —> 右击项目名称 -> Change Icon。

从欢迎界面移除

操作步骤: 菜单栏 -> File -> Open Recent -> Manager Projects —> 右击项目名称 -> Remove Selected from Welcome Screen。

设置记录最近打开项目的个数

Android Studio默认记录最新的50个项目。
操作步骤: 偏好设置 -> Editor -> 单击General -> 在Limits中调整Recent files limit个数。

清除缓存/重启Android Studio

当我们直接修改Android Studio的配置文件时,配置没有生效或者遇到一些莫名其妙的错误时,可以尝试清除缓存再重启Android Studio来解决问题

操作步骤: 菜单栏 -> File -> Invalidate Caches/Restart(清除缓存/重启) -> 进入确认界面。

收藏夹

在Android Studio的日常编码中,如果某个文件或某段代码使我们经常需要查看或试用的,就可以把它添加到收藏夹中,以便快速查看。

添加

添加文件: 右击文件 -> Add to Favorites -> 选中已存在的收藏夹中的收藏列表或添加到一个新建的收藏列表。
添加方法: 将光标放在方法名上 -> 菜单栏 -> File -> Add to Favorites -> Add New Favorites List -> 选中已存在的收藏夹中的收藏列表或添加到一个新建的收藏列表。
添加断点: 打上断点,断点会自动被添加到收藏夹。

TODO

在Android Studio中待处理的任务可以再注释中使用TODO来标识,以表明这个地方是需要注意的,既有可能是未完成的功能,也有可能是需要解决的BUG或者是需要优化的代码。

添加TODO任务

在注释中输入TODO关键字

功能键

  • Expand All 展开所有
  • Collapse All 收起所有
  • Group By Modules 按模块分组
  • Group By Packages 按包名分组
  • Flatten Packages 扁平化显示包名
  • Autoscroll to Source 自动打开源码
  • Preview Source 自动预览源码
  • Previous TODO 向上跳转任务
  • Next TODO 向下跳转任务
  • Filter TODO items 过滤任务

可以在偏好设置 -> Editor -> TODO 中进行设置

自定义TODO关键字

操作步骤: 偏好设置 -> Editor -> TODO -> 添加按钮 -> 输入匹配表达式 -> 选择icon -> 设置颜色

编辑

合并两行内容

通常我们要合并两行内容都是狂按删除键来删除两行之间的空格,然后对代码的格式进行调整。Android Studio给我们提供了一个自动合并两行内容的功能,可以智能地合并字符串、注释、声明和赋值,一键完成以上操作。

菜单栏: Edit -> Join Lines
快捷键: control + Shift + J

选择技巧

扩大缩小选择范围

扩大

菜单栏: Edit -> Extend Selection
快捷键: option + 向上箭头

缩小

菜单栏: Edit -> Shrink Selection
快捷键: option + 向下箭头

列选择模式

菜单栏: Edit -> Column Selection Mode
快捷键: Shift + command + 8

自动补全当前的语句

菜单栏: Edit -> Complete Current Statement
快捷键: Shift + command + 回车

一键切换大小写

菜单栏: Edit -> Toggle Case
快捷键: Shift + command + U

查找工具栏

打开查找工具栏

快捷键: command + F

查找范围设置

  • In Comments Only: 仅在注释中搜索
  • In Literals Only: 仅在文本中搜索
  • Except Comments: 注释除外
  • Except Literals: 文本除外
  • Except Comments and Literals: 注释和文本除外

指定查找路径

除了在当前文件中查找以外,还可以在其他路径中查找,另外,还可以设置很多查找条件,以方便更加精确和快速地得到查找结果。

菜单栏: Edit -> Find -> Find in Path…
快捷键: shift + command + F

指定替换路径

菜单栏: Edit -> Find -> Replace in Path…
快捷键: shift + command + R

  • 单击【Replace】: 一个个替换
  • 单击【Skip】: 会跳过当前匹配结果
  • 单击【Replace All in This File】: 替换当前文件中所有的匹配结果
  • 单击【Skip To Next File】: 会跳跳到下一个文件
  • 单击【All Files】: 全部替换
  • 单击【Review】: 在工具栏显示查找结果,单击结果可以查看详情

在结构中查找和替换

Android Studio提供了一个使用代码模板查找和替换的方式,可以方便地定义代码模板

操作步骤:菜单栏 -> Edit -> Find -> Search Structurally/Replace Structurally -> 打开【Structural Search】

查找用法

想看方法或者变量在哪些地方进行调用

菜单栏: Edit -> Find -> Find Usages
右键菜单: Find Usages
快捷键: fn + option + F7

  • Skip results tab with one usage: 当搜索的数据只有一个地方使用时,不显示搜索结果标签,光标会直接跳到使用的地方。
  • Scope: 设置查找范围,使查找更加快速和精确
  • Open in new tab: 如果勾选了此项,每一次查找都会打开一个新的标签,如果不勾选此项,那么每次新的查找结果将会覆盖上一次的查找结果

显示用法

显示用法功能不会另外打开一个工具窗口来显示查找结果,而是直接弹出提示框显示数据在何处被使用。

菜单栏: Edit -> Find -> Show Usages
快捷键: fn + option + command + F7

功能

  • 合并相同行
  • 显示读取访问权限
  • 显示写访问权限
  • 显示import语句
  • 按文件结构分组

查看在当前文件中的用法

菜单栏: Edit -> Find -> Find Usages in File
快捷键: command + F7

Macros(宏)

宏是一种批处理的称谓,由一些命令组织在一起,作为一个单独的命令来完成一个特定任务。

录制回放宏

  1. 选择Eidt -> Macros -> Start Macros Recording -> Android Studio右下角显示开始录制提示
  2. 按快捷键command + s保存文件
  3. 按快捷键control + s运行代码
  4. 选择Eidt -> Macros -> Stop Macros Recording -> 在输入框中输入已录制宏的名字
  5. 定义快捷键。选择Android Studio -> Keymap -> Macros -> 找到刚才录制的宏【AutoSaveAndRun】

视图

工具窗口

显示/隐藏工具窗口

  • 打开/隐藏 项目工具窗口: command + 1
  • 打开/隐藏 收藏工具窗口: command + 2
  • 打开/隐藏 运行窗口: command + 4
  • 打开/隐藏 调试窗口: command + 5
  • 打开/隐藏 Android Monitor工具窗口: command + 6
  • 打开/隐藏 项目结构窗口: command + 7
  • 打开/隐藏 版本控制工具窗口: command + 9
  • 打开/隐藏 终端工具窗口: fn + option + F12

快速切换工具窗口

快捷键: control + Tab

查看同胞元素

快速查看同胞元素是指查看跟当前类一样继承自同一个父类的所有元素
操作步骤:菜单栏 -> View -> Show Siblings

查看文档

菜单栏: View -> Quick Documentation
快捷键: fn + F1

设置鼠标悬停在元素上会显示文档提示

操作步骤:偏好设置 -> Editor -> General -> Other -> 勾选【Show quick documentation on mouse move】

查看方法的参数信息

菜单栏: View -> Parameter Info
快捷键: command + P

查看上下文信息

菜单栏: View -> Context Info
快捷键: control + shift + Q

查看源码

菜单栏: View -> Jump to Source
快捷键: command + 向下箭头
鼠标: 按住command键,再用鼠标单击对应的方法或类

查看最近打开过的文件

菜单栏: View -> Recent Files
快捷键: command + E

查看最近改动过的文件

菜单栏: View -> Recently Changed Files
快捷键: shift + command + E

查看最近的改动

菜单栏: View -> Recently Changed
快捷键: shift + control + C

对比任意文件

菜单栏: View -> Compare With
快捷键: command + D

将光标放在文件上,按快捷键command + D,选择要对比的文件。

  • Do not ignore: 不忽略空格
  • Trim whitespaces: 删掉空格
  • Ignore whitespaces: 忽略空格
  • Ignore whitespaces and empty lines: 忽略空格和空行

  • Highlight lines: 高亮行

  • Highlight words: 高亮字
  • Highlight split changes: 高亮拆分的变动

  • collapse unchanged fragment: 折叠没有变动的代码片段

  • Show Whitespaces: 显示空格

  • Show Line Numbers: 显示行号
  • Show Indent Guides: 显示缩进向导
  • Use Soft Wraps: 使用自动换行

将选中的文件和正在编辑的文件进行对比

菜单栏: View -> Compare File with Editor

将选中的文件和剪贴板上的内容进行对比

菜单栏: View -> Compare with Clipboard

设置编辑器是否显示空格

默认编辑器是不会显示空格的

设置当前编辑器是否显示空格

只对当前打开的文件进行临时设置,可以通过
菜单栏: View -> Active Editor -> Show Whitespaces

设置整个编辑器显示空格

操作步骤:偏好设置 -> Editor -> General -> Appearance -> 勾选【Show whitespaces】

  • Leading: 开头
  • Inner: 中间
  • Trailing: 结尾

设置编辑器是否显示行号

默认编辑器是不会显示空格的

设置当前编辑器是否显示行号

只对当前打开的文件进行临时设置,可以通过
菜单栏: View -> Active Editor -> Show line number
快捷键: 右击编辑器窗口左边栏 -> Show Line Numbers

设置整个编辑器显示行号

操作步骤:偏好设置 -> Editor -> General -> Appearance -> 勾选【Show line numbers】

设置编辑器是否显示缩进向导

默认编辑器是显示的

设置当前编辑器是否显示缩进向导

只对当前打开的文件进行临时设置,可以通过
菜单栏: View -> Active Editor -> Show Indent Guides
快捷键: 右击编辑器窗口左边栏 -> Show Indent Guides

设置整个编辑器显示缩进向导

操作步骤:偏好设置 -> Editor -> General -> Appearance -> 勾选【Show vertical indent guides】

设置整个编辑器显示行号

操作步骤:偏好设置 -> Editor -> General -> Appearance -> 勾选【Show line numbers】

设置编辑器是否使用自动换行

设置当前编辑器使用自动换行

只对当前打开的文件进行临时设置,可以通过
菜单栏: View -> Active Editor -> Use Soft Wraps
快捷键: 右击编辑器窗口左边栏 -> Use Soft Wraps

设置整个编辑器使用自动换行

操作步骤:偏好设置 -> Editor -> General -> 查看Soft Wraps -> 勾选【Use soft wraps in editor】

让换行符一直显示

如果想显示所有的换行符,就不要勾选【show soft wrap indicators for current line only】,该项只会显示当前正在编辑行的换行符

设置换行后的缩进字符

默认换行第二行的缩进是从第0个字符开始的,如果想自定义换行后第二行的缩进,可以勾选【Use original line`s intent for wrapped parts】,设置Additional shift。

设置编辑器是否弹出导入提示

默认编辑器是显示的

设置当前编辑器弹出导入提示

只对当前打开的文件进行临时设置,可以通过
操作步骤:菜单栏 -> View -> Active Editor -> Show Import Popups

设置整个编辑器弹出导入提示

操作步骤:偏好设置 -> Editor -> General -> Auto Import -> Show Import Popup

使用演示模式

操作步骤:菜单栏 -> View -> Enter Presentation Mode

设置演示模式的字体大小

使用演示模式会默认进入免打扰模式和全屏模式,如果不想进入免打扰模式和全屏模式可以单独退出
操作步骤:偏好设置 -> Appearance&Behavior -> Appearance -> Presentation Mode

使用免打扰模式

如果不想界面上有其他多余的东西干扰,会隐藏菜单栏、工具栏
操作步骤:菜单栏 -> View -> Enter Distraction Free Mode

使用全屏模式

操作步骤:菜单栏 -> View -> Enter Full Mode

导航

搜索并打开类文件

如果想在项目中搜索某个类文件

菜单栏: Navigate -> Class
快捷键: command + N

搜索并打开文件

如果想在项目中搜索其他文件

菜单栏: Navigate -> File
快捷键: shift + command + N

搜索并打开某个文件或方法

如果想在项目中搜索文件和方法

菜单栏: Navigate -> Symbol
快捷键: option + shift + command + N

自定义代码块

选中自定义的代码片段 -> 菜单栏: Code -> Surround With 或 按快捷键option + command + T

可以修改代码块描述,并且可以和普通代码块一样对这段代码进行展开和折叠

在自定义代码块之间选择和跳转

菜单栏: Navigate -> Custom Folding
快捷键: option + command + “.”

快速跳到某一行代码

菜单栏: Navigate -> Line
快捷键: command + G

快速跳转到光标的历史位置

菜单栏: Navigate -> Back/Forward
快捷键: command + “[“ / “]”

快速跳转到编辑过的历史位置

菜单栏: Navigate -> Last Edit Location / Next Edit Location
快捷键: shift + command + delete

标记书签

对代码进行标记,标记我们阅读的位置

  • Toggle Bookmark: 标记书签
  • Toggle Bookmark with Mnemonic: 使用助记符标记书签
  • Show Bookmark: 显示书签
  • Next Bookmark: 下一个书签
  • Previous Bookmark: 上一个书签

菜单栏: Navigate -> Bookmarks -> Toggle Bookmark
快捷键: fn + F3

快速跳到声明

在写代码或者阅读代码时,想快速查看一个引用首次被声明的位置
菜单栏: Navigate -> Declaration
鼠标: 按住command + 单击类、变量或方法

快速跳到实现

菜单栏: Navigate -> Implementation
鼠标: option + command + B

快速跳到类型声明

菜单栏: Navigate -> Type Declaration
快捷键: shift + command + B
鼠标: 按住command + shift + B

快速跳转到父类

菜单栏: Navigate -> Super Method
快捷键: command + U
鼠标: 按住command + shift + B

类和测试类之间快速跳转

快速跳转到测试类

前提条件: 光标定位在类文件编辑界面
菜单栏: Navigate -> Test
快捷键: shift + command + T

查看相关联的文件

菜单栏: Navigate -> Related Symbol
快捷键: control + command + ↑

查看文件结构

快速调出当前文件的结构,并通过模糊匹配快速跳转到指定的方法

菜单栏: Navigate -> File Structure
快捷键: fn + command + F12

显示匿名内部类

在文件结构中显示匿名内部类,需要勾选【Show Anonymous Classes】

显示所有继承的方法

在文件结构中显示匿名内部类,需要勾选【Show inherited members】

输入时缩小

输入时缩小是指在输入搜索关键字时搜索结果会自动过滤,不匹配的会被过滤掉。勾选【Narrow down on tying】

查看类的层次结构图

菜单栏: Navigate -> Type Hierarchy
快捷键: control + H

还可以切换类结构的显示方式、排序、筛选范围等

查看方法类型的层次结构

菜单栏: Navigate -> Type Method
快捷键: shift + command + H

查看方法调用层次结构

菜单栏: Navigate -> Call Hierarchy
快捷键: control + option + H

快速跳转到错误代码的位置

跳转到下一个错误位置

菜单栏: Navigate -> Next Highlighted Error
快捷键: fn + F12

跳转到上一个错误位置

菜单栏: Navigate -> Previous Highlighted Error
快捷键: fn + Shift + F12

在方法间前后跳转

跳转到下一个方法

菜单栏: Navigate -> Next Method
快捷键: control + ↑

跳转到上一个方法

菜单栏: Navigate -> Previous Method
快捷键: control + ↓

翻页功能

向上翻页: fn + ↑
向下翻页: fn + ↓

选择当前功能在哪里显示

菜单栏: Navigate -> Select in
快捷键: fn + option + F1

光标快速跳转到页首/页尾

页首: fn + command + ←
页尾: fn + command + →

编码

覆写或实现方法

菜单栏: Code -> Override Method
快捷键: control + O

实现接口方法

菜单栏: Code -> Implement Methods
快捷键: control + L

实现代理方法

菜单栏: Code -> Delegate Methods
右键菜单: 右击 -> Generate -> Delegate Methods
快捷键: command + N

生成构造函数/生成Getter和Setter方法/覆写equals和hashcode方法/覆写toString方法/插入版权信息

菜单栏: Code -> Generate -> Constructor/Getter and Setter/equals() and hashCode()/toString()/Copyright
快捷键: command + N

配置版权信息

菜单栏: Android Studio -> Preferences -> Copyright -> Copyright Profiles

共享版权信息配置

我们创建的copyright文件放在项目根目录/.idea/copyright下,直接把copyright这个目录复制给团队中的其他人即可实现共享。

提取或删除代码

如果我们想从for、foreach、if…elseif…else、try…catch…finally、while…do、do…while中快速提取或删除代码。

菜单栏: Code -> Unwrap/Remove
快捷键: command + shift + delete

自动补全提示

菜单栏: Code -> Completion -> Basic
快捷键: control + 空格

智能自动补全提示

该项会把不适用的条目过滤掉,只显示可用的类、变量、属性或方法

菜单栏: Code -> Completion -> SmartType
快捷键: control + Shift + 空格

代码补全

补全后不删除后面的代码

操作步骤:弹出代码补全提示 -> 选中补全代码 -> 鼠标/Enter

补全后删除后面的代码

操作步骤:弹出代码补全提示 -> 选中补全代码 -> Tab

布尔值取反补全

操作步骤:弹出代码补全提示 -> 选中补全代码 -> 叹号(!)

点和分号补全

操作步骤:弹出代码补全提示 -> 选中补全代码 -> 点(.)或分号(;)

展开或折叠代码

展开或折叠当前代码

此功能仅会展开或折叠当前光标所在处的一段代码

菜单栏: Code -> Folding -> Expand/Collapse
快捷键: command + “+”/“-“

展开或折叠当前代码块中的所有子模块

菜单栏: Code -> Folding -> Expand Recursively/Collapse Recursively
快捷键: option + command + “+”/“-“

展开或折叠全部代码块

菜单栏: Code -> Folding -> Expand All/Collapse All
快捷键: shift + command + “+”/“-“

展开或折叠当前文件中的所有注释

菜单栏: Code -> Folding -> Expand doc comments/Collapse doc comments

指定展开层级

指定展开代码层级: Code -> Folding -> Expand to level
指定全部展开代码的层级: Code -> Folding -> Expand all to level

展开和折叠选中区域

菜单栏: Code -> Folding -> Fold Selection/Remove regio
快捷键: command + “.”

折叠代码片段

此功能来折叠{}中的代码片】= + “.”

插入代码块

Live Template就是把常用的代码提取成一个模板,在编写代码的时候可以通过非常少的字幕调出这个模板,达到快速输入,提高效率的目的。

菜单栏: Code -> Insert Live Template
快捷键: shift + command + “.”

类中常用的缩写

  • geti + tab //插入单例方法
  • psf + tab //插入public static final
  • psfi + tab //插入public static final int
  • psfs + tab //插入public static final String
  • psvm + tab //插入main方法声明
  • St + tab //插入String

方法中常用的缩写

常用代码模板
  • ifn + tab //null判断 if(变量 == null){}
  • inn + tab //非空判断 if(变量 != null){}
  • lazy + tab //延迟初始化 if(对象 == null){ 对象 == new String();}
  • mn + tab //得到2个变量中较小的 变量 = Math.min(变量1,变量2);
  • mx + tab //得到2个变量中较大的 变量 = Math.max(变量1,变量2);
  • inst + tab //判断变量是否是某个对象的实例 if(变量 instanceof Object){ Object = (Object)变量;}
  • toar + tab //把collection的对象存储到一个数组里 .toArray(new Object[.size()])
  • thr + tab //抛出异常 throw new
循环遍历代码模板
  • fori + tab //for循环 for(int i = 0; i < ;i++){}
  • itar + tab //遍历数组 for(int i = 0;i < array.length;i++){=array[i];}
  • itco + tab //迭代器循环 for(Iterator = collection.iterator();.hasNext();){Object = .next();}
  • iten + tab //遍历枚举内容 while(enumeration.hasMoreElements()){Object = enumeration.nextElement();}
  • iter + tab //for each循环 for(Onject :){}
  • itit + tab //遍历迭代器 while(iterator.hasNext()){Object = iterator.next()}
  • itli + tab //遍历list for(int i = 0;i < list.size();i++){Object o = list.get(i);}
  • ritar + tab //倒叙遍历数组 for(int i = array.length - 1;i >= 0;i--){ = array[i]}
打印代码模板
  • serr + tab: System.err.println("");
  • souf + tab: System.out.printf("");
  • sout + tab: System.out.println("");
  • soutm + tab: //打印当前类名和方法名
  • soutp + tab: //打印出当前方法的所有参数列表及其值
  • soutv + tab: //打印一个变量值

使用代码模板包裹代码

菜单栏: Code -> Surround with Live Template
快捷键: option + command + J

  • C.Surround with Callable: 使用Callable包围选中的代码
  • RL.Surround with ReadWriteLock.readLock: 使用ReadWriteLock读锁包围选中的代码
  • WL.Surround with ReadWriteLock.writeLock: 使用ReadWriteLock写锁包围选中的代码
  • I.Iterator Iterable | Array in J2SDK 5.0 syntax: 使用遍历包围选中的代码
  • TR.Surround with try-with-resource: 使用try-with-resource语句包围选中的代码

查看和编辑代码模板

菜单栏: Preferences -> Editor -> Live Templates
快捷键: option + command + T

使用常用代码模板包裹代码

菜单栏: Code -> Surround with
快捷键: option + command + T

注释代码

注释行

菜单栏: Code -> Comment with Line Comment
快捷键: command + /

注释代码块

菜单栏: Code -> Comment with Block
快捷键: option + command + /

格式化代码

菜单栏: Code -> Reformat Code
快捷键: option + command + L

自动缩进行

菜单栏: Code -> Auto-Intent Lines
快捷键: option + command + I

优化导入

优化导入,去除代码中无效的代码
菜单栏: Code -> Optimize Imports
快捷键: option + command + O

重新排列代码

使用使用预设的代码规则重新排列代码
菜单栏: Code -> Rearrange Code

移动一段代码

向上移动代码

菜单栏: Code -> Move Statement Up
快捷键: shift + command + ↑

向下移动代码

菜单栏: Code -> Move Statement Down
快捷键: shift + command + ↓

移动一行代码

向上移动代码

菜单栏: Code -> Move Line Up
快捷键: option + command + ↑

向下移动代码

菜单栏: Code -> Move Line Down
快捷键: option + command + ↓

正则表达式操作意图提示

快捷键: option + Enter

快捷键弹出选择列表 -> 单击Check RegExp -> 弹出对话框,输入正则表达式和匹配样本

检查

代码检查工具

Android Studio提供了功能强大、快速、灵活的代码检查工具,能够检测出编译器和运行时的错误,在编译之前建议修正和改进。

Android Studio代码检查不仅能检查出编译错误,还会检查出一些效率低下的代码,支持一些代码规范、编程指南、最佳实践,还有一些无法访问,未使用的代码内存泄漏都能检查出来。

目前支持的语言有Android、Java、XML、HTML

代码检查所涵盖的最常见的任务:

  • 发现可能的错误
  • 定位死代码
  • 检测性能问题
  • 改进可维护性和代码结构
  • 与编码准则和标准一致
  • 符合规范

全面了解Lint

Lint是谷歌从Android 4.1版本开始提供的代码分析工具,可以再不执行应用或测试用例的情况下检查出代码结构和质量问题。

Android Lint主要用于检查以下错误

  • 缺少转义
  • 布局性能问题
  • 未使用的冗余资源
  • 在数组中定义多个配置时,数组大小不一致
  • 可访问行问题和国际化的问题
  • 图标问题
  • 可用性问题
  • 配置文件错误

报告中的Issue 和 Category

Issue

Lint检查出的所有问题都是以Issue来描述的。Issue以一个文本短语来作为id,对Issue的定制等操作都是基于id的。Issue以Severity来标识危害程度。

Category
  • Accessibility(可访问性)
  • Correctness(正确性)
  • Correctness > Messages(正确性:信息)
  • Internationalization(国际化)
  • Internationalization > Bidirectional Text(双向文本)
  • Performance(性能)
  • Security(安全)
  • Usability(可用性)
  • Usability:Icons(可用性:图标)
  • Usability:Typography(可用性:字体)

Lint使用场景

lint检查范围

  • 整个项目
  • 项目中的每个模块
  • 项目中的每个产品模块
  • 项目中的每个测试模块
  • 每个打开状态的文件
  • 每个类结构
  • 每个版本控制系统范围

配置Lint方法

  • 在Android Studio偏好设置中配置
  • 在lint.xml文件中配置
  • 在build.gradle文件中配置
  • 在Java和XML源码中配置

Lint命令行用法介绍

Usage:
lint [flags] <project directories>

Flags:

1
2
3
4
5
6
7
--help 显示帮助命令
--help <topic> 有关特定主题的帮助
--list 列出可用的问题id,然后退出
--version 输出版本信息,然后退出
--exitcode 如果发现错误,将退出代码设置为1
--show 提供问题列表以及完整的解释
--show <ids> 针对指定的问题id显示完整的解释

启用检查:

1
2
3
4
5
6
7
--disable <list> 禁用类别列表或特定问题id,列表应该是以逗号分隔的问题id或类别
--enable <list> 启用特定问题列表,将检查所有默认问题和指定启用的问题,列表中应该是以逗号分隔的问题id或类别
--check <list> 只检查特定问题列表,会先禁用一切,然后重新启用给定的列表问题。列表中应该是以逗号分隔的问题id或类别。
-w, --nowarn 仅检查errors
-Wall 检查所有的warnings,包括那些默认关闭的
-Werror 将所有警告视为错误
--config <filename> 使用给定的配置文件来确定问题是启用还是禁用,如果项目包含一个lint.xml文件,那么这个配置文件作为备用

输出选项

1
2
3
4
5
6
7
8
--quiet 不显示进展
--fullpath 错误输出使用完整路径
--showall 不截断长消息,显示完整的消息
--nolines 输出信息中不包括错误所在源文件中的行,默认情况下是显示的,但这个参数可以关闭
--html <filename> 创建一个HTML报告,如果文件名是个目录,lint将会为每个被扫描的项目创建一个报告
--url filepath=url 添加链接到HTML报告中,使用URL前缀取代本地路径前缀。映射可以是一个逗号分隔的路径前缀对应URL前缀的列表。
--simplehtml <filename> 创建一个简单的HTML报告
--xml <filename> 创建一个XML文件报告

项目选项

1
2
3
4
--resources <dir> 添加一个指定的文件夹作为项目的资源目录
--sources <dir> 添加一个指定的文件夹作为项目的资源目录,只有在一个单独项目中运行lint时才有效
--classpath <dir> 添加文件夹作为项目的工程类目录,只有在一个单独项目中运行lint时才有效
--libraries <dir> 添加文件夹作为项目的类库,只有在一个单独项目中运行lint时才有效

Lint命令行用法举例

  • 如何查看哪些id和类别是可用的 ~$ lint --list
  • 如何禁用某项检查 ~$ lint --disable MissingTranslation, UnusesdIds,Usability:Icons 项目路径
  • 如何启用某项检查(某些检查默认是禁用的) ~$ lint --enable MissingTranslation, UnusesdIds,Usability:Icons 项目路径
  • 如何对项目只做某项检查 ~$ lint --check MissingPrefix 项目路径
  • 如何查看某个id的说明 ~$ lint --show id
  • 如何以html格式输出Lint检查结果 ~$ lint 项目地址 --html test.html
  • 检查本地项目 ~$ lint <本地项目地址> --html <输出的html文件名.html>
  • 检查网络项目 ~$ lint --html /tmp/report.html --url

执行一次代码检查

操作步骤: 菜单栏 | 右击文件夹/文件 -> Analyze -> Inspect Code -> 指定检查范围 -> OK

详解代码检查结果辅助工具

重新执行代码检查(Rerun Inspection)

重新执行会覆盖上一次的执行结果

全部展开或折叠结果(Expand All/Collapse All)

展开折叠结果
快捷键: command + ‘+’ / ‘-‘

在检查结果中快速上下跳转(Go Pre Problem/Go Next Problem)

上下跳转的时候会同时定位到源码

自动定位到问题的源码(Autoscroll to Source)

单击的时候自动定位到源码

导出代码检查结果(Export)

导出代码检查结果

按严重程度分组排查问题(Group by Severity)

按严重程度分组会更有目的性,通常我们需要重点关注Error的问题

按目录分组排查问题(Group by Directory)

可以更直观地通过路径来排查问题

过滤已解决的问题(Filter resolved items)

过滤掉已经解决的问题

快速解决问题(Apply a quickfix)

只有在检查出的问题有相应的解决方案时才使用,否则是不可用的。

禁用和启用某项检查

在检查结果中使用了Disable inspection选项时,这个检查项将会被禁用,也就是说你再执行代码检查时,被金庸的检查项就不会被检查了。

禁用某项检查

  1. 在检查结果中单击Android -> 选中【Android Resource Validation】或具体问题
  2. 右击或单击左边工具栏的操作选项 -> 单击【Disable inspection】,右击Android的问题分类或具体问题
  3. 禁用【Android Resource Validation】检查的效果。单击【Disable inspection】后并没有任何显示上的效果,再一次执行代码检查后效果就出来了
  4. 重新执行一次代码检查

启用某项检查

  1. 在检查结果中单击设置
  2. 在设置中查看被禁用的检查项。被禁用的检查项会高亮显示,所以能够很容易找到哪些检查项被我们禁用了。
  3. 勾选要启用的检查项

在偏好设置中禁用和启用某项检查

操作步骤: 偏好设置 -> Editor -> Inspections

忽略检查

  • 忽略Android资源验证: Android Resources Validation检查
    • 和禁用操作相同,单击【Suppress for tag】: 忽略【Android Resources Validation】对这个标签的检查,在要忽略的标签上添加<!--suppress AndroidDomInspection -->
    • 和禁用操作相同,单击【Suppress for file】: 忽略【Android Resources Validation】对这个文件的检查,在要忽略的文件上添加<!--suppress AndroidDomInspection -->
    • 和禁用操作相同,单击【Suppress all for file】: 忽略这个文件的所有检查项,在要忽略的标签上添加<!--suppress ALL -->
  • 忽略使用了过时的API: Deprecate API usage检查
    • 单击【Suppress for statement】: 忽略【Deprecate API usage】对这个语句的检查,在要忽略的标签上添加//noinspection deprecation
    • 单击【Suppress for member】: 忽略【Deprecate API usage】对这个成员的检查,在要忽略的标签上添加@SuppressWarnings("deprecation")
    • 单击【Suppress for class】: 忽略【Deprecate API usage】对这个类的检查,在要忽略的标签上添加@SuppressWarnings("ALL")

在指定范围内执行某项检查

操作步骤: 在检查结果中选中一个检查项 -> 右击,执行【Run Inspection on…】-> 选择检查范围 -> 执行检查

解决检查出的问题

选中具体问题 -> 查看问题详情

  • Name: 显示了有问题的方法名是一个公共方法
  • Location: 这个方法的位置,单击可打开这个类
  • Problem synopsis: 问题摘要,这个方法从未使用
  • Problem resolution: 问题解决方案,单击可快速解决
  • Safe delete: 安全删除
  • Comment out: 注释掉
  • Add as Entry Point: 添加为入口点
  • Suppress: 忽略检查
  • Suppress for member: 忽略成员
  • Suppress for class: 忽略类
  • Suppress all inspections for class: 忽略类的所有检查

管理代码检查配置文件

操作步骤: 菜单栏 -> Android Studio -> Editor -> Preferences -> Inspections -> Manage

配置代码检查规则

操作步骤: 菜单栏 -> Android Studio -> Editor -> Preferences -> Inspections

  • 快速搜索某个检查项
  • 过滤某一类检查项(【Show Only Cleanup Inspections】过滤出所有代码清理时用到的检查项)
  • 清空所有选中的检查项
  • 默认禁用新的检查和恢复默认设置
  • 设置检查项的严重级别
    • Typo: 拼写错误
    • Server Problem: 服务端问题
    • Info: 详情
    • Weak Warning: 弱警告
    • Warning: 警告
    • Error: 严重错误

Android类目的所有检查项

操作步骤: 菜单栏 -> Android Studio -> Editor -> Preferences -> Inspections -> 展开Android类目

  • Android Resources Validation: 验证Android XML中的资源引用
  • Android XML element is not allowed: 验证Android Resource文件和AndroidManifest.xml中不允许的标签
  • Constant and Resource Type Mismatches: 常量和资源类型不匹配
  • Missing JNI function: 报告项目中的native方法声明在项目中没有找到相应的JNI函数
  • Non-constant resource ID in a switch statement: 检查在Andorid Library模块中的switch语句是否使用了Resource IDs
  • onClick handler is missing in the related activity: 检查相关的activity是否声明了XML的onClick属性中指定的方法
  • Unknow Android XML attribute: 检查并高亮显示Android Resource文件和AndroidManifest.xml中未知的XML属性

Android Lint类目的检查项

Accessibility(可访问性)

Image without contentDescription:图片没有contentDescription属性

ImageView和ImageButton这样的非文本控件应该使用contentDescription属性来描述控件。这样可访问工具就可以更好的理解控件的用途,从而更加充分的分析用户界面
禁用这个警告: ignore="ContentDescription"

Missing labelFor attribute: labelFor 属性缺失

如果minSDKVersion >= 17,文本字段应该标有labelFor属性

Correctness(正确性)

  • Accidental Octal: 意外的八进制;在Groovy中,以证书0开始的数字通常会被理解为一个八进制数
  • Activity registered more than once: Activity注册了不止一次
  • AdapterViews cannot have children in XML: 在XML中AdapterViews不能有子对象
  • Calling new methods on older versions: 在老版本中调用新方法
  • Custom views in libraries should use res-auto-namespace: 库中自定义的view应该使用res-auto-namespace
  • Cycle in resuorce definitions: 资源循环定义
  • Duplicate definitions of resources: 资源重复定义
  • Duplicate ids within a single layout: 在一个单独的layout中有重复id
  • Fragment not instantiatable: Fragment没有实例化
  • Invalid ID declaration: 无效的ID声明
  • Manifest Resource References: Manifest资源引用
  • Reference to an unknown id: 引用了一个未知的id
  • WebViews in wrap_content parents: WebView的父视图是wrap_content

Correctness > Messages(正确性 > 信息)

  • Extra translation: 多余的翻译(如果一个字符串出现在一个特定的语言翻译文件中,但在默认的local中没有相应的字符串,那么这个字符串是未被使用的)
  • Incomplete translation: 翻译不完全
  • Invalid format string: 无效格式的字符串
  • Missing quantity translation: 数量的翻译缺失
  • String.format string doesn`t match the XML format string: String.format 字符串不匹配XML格式的字符串

Internationalization(国际化)

  • Byte order mark inside files: 字节顺序在文件中的标记
  • Encoding used in resource files is not UTF-8: 资源文件不是UTF-8格式
  • Hardcode text: 硬编码文件

Internationalization > Bidirectional Text(国际化 > 双向文本)

Right-to-left text compatibility issues: Right-to-left文件兼容性问题

Performance(性能)

  • Obsolete layout params: 过时的布局参数
  • Using FloatMath instead of Math: 使用FloatMath替代Math
  • Nested layout weights: 嵌套布局weights
  • Unused resources: 未被使用的资源
  • Overdraw: 过度绘制

Security(安全)

  • Hardcoded value of android: debuggable in the manifest(最好不要在manifest中设置android: debuggable属性)
  • Pakaged private key: 打包私钥(不应该在APP中打包私钥文件)

Usability(可用性)

  • Missing menu title: 缺失菜单标题
  • URL not supported by app for Google App Indexing:URl 不支持Google的App索引要确保应用支持URL,以便从Google搜索中获得安装和流量

Usability > Icons(可用性 > 图标)

  • Clashing PNG and 9-PNG files: PNG和9-PNG文件冲突
  • Duplicated icons under different names: 在不同的名字下有重复的图标
  • Missing application icon: 应用程序图标缺失
  • Missing density folder: 密度文件夹缺失

Usability > Typography(可用性 > 字体)

  • Ellipsis string can be replaced with ellipsis character: 省略号字符可以用省略号代替
  • Fraction string can be replaced with fraction character: 分数字符串可以用分数字符代替
  • Hyphen can be replaced with dash: 连字符可以用破折号代替

在lint.xml文件中配置Lint检查

在Android Studio的偏好设置中可以修改Lint的配置,lint.xml文件会被自动添加到Android项目中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?xml version"UTF-8"?>
<!-- Ignore the ObsoleteLayoutParam issue in the specified files -->
<lint>
<issue id="ObsoleteLayoutParam">
<ignore path="res/layout/activation.xml" />
<ignore path="res/layout-xlarge/activation.xml" />
</issue>
<!-- Ignore the UselessLeaf issue in the specified file -->
<issue id="UselessLeaf">
<ignore path="res/layout/main.xml" />
</issue>
<!-- Change the severity of hardcoded strings to "error" -->
<issue id"error" />
</lint>

在Gradle中配置Lint检查

在build.gradle文件中添加lintOptions的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
android {
lintOptions {
//出现error时是否停止进程
abortOnError true
//关闭检查项,参数是issue id
disable 'TypographyFractions', 'TypographyQuotes'
//开启检查项,参数是issue id
enable 'RtlHardcoded', 'RtlCompat', 'RtlEnabled'
//仅检查指定的检查项,参数是issue id
check 'NewApi', 'InlinedApi'
//设置检查项的严重等级为可忽略,参数是issue id
ignore 'NewApi', 'InlinedApi'
}
}

使用Gradle执行Lint检查

命令行执行Lint检查

./gradlew lint
./gradlew lintRelease
./gradlew lintDebug

Gradle工具窗口执行Lint检查

打开Gradle工具窗口中指定模块的任务目录,在verification下面找到对应的lint任务

  • 双击lint
  • 双击lintDebug
  • 双击lintRelease

在Java和XML源码中配置Lint检查

在Java源码中配置Lint配置

  • 在Java源码中使用注解@SuppressLint(“issue id”)来禁用检查
  • 禁用多项检查的参数为一个字符串数组,如@SuppressLint({“issue id”},{“issue id”})
  • 禁用所有检查的参数为all,如@SuppressLint(“all”)

在XML源码中配置Lint检查

在XML源码中使用属性tools:ignore = “issue id”来禁用检查

  • 禁用多项检查: tools:ignore = “issue id, issue id”
  • 禁用所有检查: tools:ignore = “all”

代码清理

通过代码扫描检查出好多问题,Android Studio恰好提供了Code Cleanup(代码清理)这个功能。

清理代码

操作步骤: 菜单栏 -> Analyze -> Code cleanup

配置代码清理规则

操作步骤: 菜单栏 -> Analyze -> Code cleanup -> 单击Inspection profile右边的…可以打开代码清理检查配置界面

通过名字来指定代码检查项

菜单栏或右击文件 -> Analyze -> Run Inspection by name -> 弹出规则输入框
快捷键: option + command + shift + I

配置当前文件自动检查的规则

Android Studio会对当前文件自动进行代码检查,检查出问题后相关的代码会被高亮显示。

菜单栏或右击文件 -> Analyze -> Configure Current File Analysis
快捷键: option + command + shift + H

导入并查看离线检查结果

Android Studio还支持代码检查结果的导入

操作步骤: 菜单栏 -> Analyze -> View Offline Inspection Results

自动添加是否可为空注解

  • @NotNull 变量或参数不能为null
  • @Nullable 变量或参数可以为null

分析依赖

菜单栏或右击文件 -> Analyze -> Analyze Dependences
快捷键: command + shift + A

结果分析

  • 选中被分析的类文件 -> 在右边会显示这个类文件所依赖的文件,包括项目中的文件和外部文件
  • 单击右边依赖的文件会在下面显示这个文件在左边类文件中的用法
  • 查看依赖文件的用法,更好地理解文件结构

分析反向依赖

反向依赖就是分析出当前文件被哪些文件所依赖

操作步骤: 菜单栏或右击文件 -> Analyze -> Analyze Backward Dependences -> 然后弹出分析范围对话框

分析模块依赖

模块依赖分析显示指定范围内存在的所有模块和它们之间的关系

操作步骤: 菜单栏或右击文件 -> Analyze -> Analyze Module Dependences -> 然后弹出指定分析范围对话框

分析循环依赖

循环依赖就是循环引用,是两个或多个类相互持有对方

操作步骤: 菜单栏或右击文件 -> Analyze -> Analyze Cyclic Dependences -> 然后弹出指定分析范围对话框

分析数据流

操作步骤: 菜单栏或右击文件 -> Analyze -> Analyze Data Flow to here -> 然后弹出分析范围选择对话框

分析堆栈信息

向更加方便和专注地分析堆栈信息的时候可以使用此功能

菜单栏: Analyze -> Analyze StackTrace
快捷键: command + shift + A

重构

重构是指在不改变外部行为的条件下,对现有的代码进行改善,以增加可读性,使设计和逻辑更加清晰。

重命名

对类、方法、字段、变量、包或其他文件进行重命名

菜单栏: Refactor -> Rename
快捷键: fn + shift + F6

更改方法签名

方法签名由方法名称和一个参数列表组成。更改方法签名可以改变方法的名称、改变函数的可访问性,对参数进行添加、删除、重命名和重新排序。

菜单栏: Refactor -> Change Signature
快捷键: fn + command + F6

迁移变量类型

迁移类型(Type Migration) 就是改变变量的类型

菜单栏: Refactor -> Type Migration
快捷键: fn + shift + command + F6

转成静态方法

操作步骤: 菜单栏 -> Refactor -> Make Static

静态方法转为实例方法

操作步骤: 菜单栏 -> Refactor -> Convert to Instance Method

提取变量

提取变量重构是将一个表达式提取为一个变量,并使用变量替换原来的表达式

菜单栏: Refactor -> Extract -> Variable
快捷键: option + command + V

提取常量

提取常量是从临时变量快速提取出静态常量

菜单栏: Refactor -> Extract -> Constant…
快捷键: option + command + C

提取字段

提取字段重构是将选中的表达式赋值给一个新声明的字段,原来的表达式使用这个新的字段来代替。

菜单栏: Refactor -> Extract -> Field…
快捷键: option + command + F

提取参数

提取参数重构是将A中的值提取为方法A的新参数,调用方法A的地方传入参数的值,这个值为之前提取的参数值

菜单栏: Refactor -> Extract -> Parameter…
快捷键: option + command + P

提取函数式参数

菜单栏: Refactor -> Extract -> Functional Parameter…
快捷键: option + shift + command + P

提取参数对象

菜单栏: Refactor -> Extract -> Parameter Object

提取方法

在重构代码时我们经常把复杂方法中的一段代码提取出来作为一个单独的方法使用,这种重构方法叫Extra Method

菜单栏: Refactor -> Extract -> Method
快捷键: option + command + M

提取方法对象

可以把一段代码提取为方法对象使用

操作步骤: 菜单栏 -> Refactor -> Extrat -> Method Object…

提取委托

委托是有两个对象参与同一个请求,接受请求的对象将请求委托给另一个对象来处理。

操作步骤: 菜单栏 -> Refactor -> Extrat -> Delegate…

提取接口

提取接口重构是从一个已存在的类中提取接口,可以从某个类中选择方法,把选中的方法提取到一个单独的接口中。

操作步骤: 菜单栏 -> Refactor -> Extrat -> Interface…

提取父类

菜单栏 -> Refector -> Extract -> Superclass…

内联方法

当一个方法的本体与方法名同样清除易懂时,就没有必要使用单独的方法了,直接把方法换成方法体即可,也就是使用内联方法进行重构。

菜单栏: Refactor -> Inline
快捷键: option + command + N

内联临时变量

当一个临时变量只被简单地引用一次,而且会影响其他重构时,就要使用内联变量进行重构。

菜单栏: Refactor -> Inline
快捷键: option + command + N

查找并替换重复代码

查找并替换重复代码重构时查找和赵中方法或常量字段重复或类似的代码,并通过调用此方法或常量来替换他们。

操作步骤: 菜单栏 -> Refactor -> File and Replace Code Duplicates…

反转布尔值

反转布尔值重构是把一个Boolean方法或变量改变为相反的意义,也就是原来是true的变为false,原来是false变为true

操作步骤: 菜单栏 -> Refactor -> Invert Boolean

把成员拉到父类

把成员拉到父类重构是把当前类的方法和属性移动到它的父类中去。

操作步骤: 菜单栏 -> Refactor -> Pull Members Up…

把成员推到子类

把成员推到子类重构是把父类的方法和属性移动到所有子类中,弗雷德方法可以选择性地保留抽象方法。

操作步骤: 菜单栏 -> Refactor -> Push Members Down…

尽可能使用接口

操作步骤: 菜单栏 -> Refactor -> Use Interface Where Possible…

使用委托替换继承

使用委托替换继承重构是移除当前子类继承的父类,但同时又能够保留并使用父类中的一些功能。

什么时候用委托替换继承

当某个子类只使用了父类的一部分功能时,或者根本就不需要继承来的数据时,就要考虑用委托替换继承。

如何使用委托替换继承

Android Studio 会先在子类中创建一个私有的内部类,用来继承超类或接口。然后在子类中新建一个字段来实例化这个内部类,再委托子类中的方法来调用父类的方法。

操作步骤: 菜单栏 -> Refactor -> Replace Inheritance with Delegation…

移除中间人

移除中间人重构是让你不使用委托方法而直接调用受委托的类

操作步骤: 菜单栏 -> Refactor -> Remove Middleman…

包装方法返回值

包装方法返回值重构是使用一个新建的包装类来替换一个方法的返回值,这个类也可以是已存在的类。

操作步骤: 菜单栏 -> Refactor -> Wrap Return Value…

将匿名类转成内部类

匿名类转成内部类重构可以把一个匿名类转成内部类,这样一来这个类的其他部分就可以共享此类。

操作步骤: 菜单栏 -> Refactor -> Convert Anonymous to Inner…

封装字段

封装字段重构可以隐藏数据,然后创建访问器来访问。

操作步骤: 菜单栏 -> Refactor -> Encapsulate Field…

使用查询替换临时变量

如果一个临时变量保存了一个表达式,使用查询替换临时变量重构就是将这个表达式提炼到一个独立的方法中,并将这个临时变量的所有引用点替换为新的方法的调用。

操作步骤: 菜单栏 -> Refactor -> Replace Temp with Query…

使用工厂方法替换构造方法

使用工厂方法替换构造方法重构是使用一个静态方法返回一个实例化的类来替换原来的构造方法。

操作步骤: 菜单栏 -> Refactor -> Replace Constructor with Factory Method …

使用构造器替换构造方法

当创建一个对象需要传入多个参数的时候我们通常会根据参数的数量写多个不同的构造方法,但是这种方法不够灵活,可读性也不高。

操作步骤: 菜单栏 -> Refactor -> Replace Constructor with Builder…

泛型化

泛型化重构用来将那些没有使用泛型的代码转化为泛型可识别的代码

操作步骤: 菜单栏 -> Refactor -> Gentrify…

配置对话框

  • Drop obsolete casts: 删除过时的转换
  • Leave Object-parameterized types raw: 保留对象参数化类型
  • Preserve raw arrays: 保留原始队列
  • Perform exhaustive search: 执行穷举搜索
  • Generify Objects: 泛型化对象
  • Produce wildcard types: 产生通配符类型

国际化

国际化重构就是从源代码中提取字符串,并将它们作为属性写入属性文件中,再通过生成的表达式来读取Resource Bundle中的属性来获得多语言的字符串。

操作步骤: 菜单栏 -> Refactor -> Internationalize…

构建

Android Studio默认使用Gradle来进行项目构建,Gradle是一个自动化构建工具,采用Groovy的Domain Specific Language来描述和控制构建逻辑。

认识Gradle

Gradle是一个自动化构建工具。
特点:

  • Gradle支持多工程构建和局部构建
  • Gradle支持远程或本地依赖管理:支持从远程maven仓库,nexus私服,ivy仓库以及本地仓库获取依赖
  • Gradle与Ant、Maven兼容
  • Gradle可轻松迁移:Gradle适用于任何结构的工程,可以在同一个开发平台平行构建原工程和Gradle工程
  • Gradle使用灵活:Gradle的整体设计是以作为一种语言为向导的,而非成为一个严格死板的框架
  • Gradle免费开源
  • Gradle跟IDE集成得非常好
  • Gradle可以更容易地集成到自动化构建系统

Gradle的Project、Task、和Plugin

项目是指构建产物或部署的产物。每个项目包含一个或多个任务。
任务是指不可分的最小工作单元,代表一个逻辑上较为独立的执行过程。

Gradle中依赖的仓库

在build.gradle中添加仓库的声明,从Maven仓库中获取依赖

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
29
repositories {
#1.从指定的远程Maven仓库中获取依赖
maven {
url "http://maven.helloword.net/repo"
}
#2.从指定的本地Maven仓库中获取依赖
maven {
url "file:///Users/bixiaopeng/mvn"
}
#3.从中央Maven仓库中获取依赖
mavenCenter()
#4.从新的中央远程仓库中获取依赖
jcenter()
#5.从本地仓库中获取依赖
mavenLocal()
#6.需要认证的库
maven {
credentials {
username 'user'
password 'password'
}
url "http://repo.helloword.com/maven2"
}
}

Maven仓库的别名

  • mavenCentral(): 表示从Maven中央仓库中获取依赖
  • jcenter(): 一个新的远程中央仓库,兼容Maven中央仓库,而且性能更优。Gradle默认使用jcenter作为仓库。
  • mavenLocal(): 表示从本地Maven仓库中获取依赖

从平级目录仓库中获取依赖

从本地目录中获取依赖,在build.gradle中添加

1
2
3
4
5
6
7
8
9
repositories {
//从当前项目的平级目录lib中获取依赖
flatDir(dir: 'lib',name: 'libs directory')
//从当前项目的平级目录libA 和 libB中获取依赖
flatDir {
dirs 'libA','libB'
name = 'All dependency directories'
}
}

配置Gradle环境

  • 编辑.bash_profile vim ~/.bash_profile
  • 配置环境变量 export GRADLE_HOME=grale路径 export PATH = $PATH: $GRADLE_HOME/bin
  • 使配置立即生效 source ~/.bash_profile
  • 查看配置是否生效 gradle -v

Gradle Wrapper

认识Gradle Wrapper

Gradle Wrapper可以理解为Gradle的一层封装,使用它可以在没有安装Gradle的系统上使用Gradle来构建项目。

在gradle/wrapper目录下有两个文件:gradle-wrapper.jar和gradle-wrapper.properties

查看和执行Gradle任务

查看当前项目支持的Gradle任务

使用./gradlew task 来查看单签项目支持哪些Gradle任务

想查看所有任务和更多详情 gradlew tasks -all

想查看一个任务的更多详情 gradlew help --task <task>

执行Gradle任务

执行命令: “gradle + 任务名称” 或者 “./gradlew + 任务名称”

常用Gradle任务

  • 查看gradle版本 ./gradlew -v
  • 编译并打出Debug版本的包 ./gradlew assembleDebug
  • 编译并打开Release版本的包 ./gradlew assembleRelease
  • 执行检查并编译打包,打出所有Release和Debug的包 ./gradlew build
  • 删除build目录,会把app下面的build目录删掉 ./gradlew clean
  • 编译打包并安装Debug版本的包: ./gradlew installDebug
  • 卸载Debug版本的包: ./gradlew uninstallDebug
  • 使用-info查看任务详情: ./gradlew uninstallDebug -info

Gradle工具窗口

Gradle工具窗口列出了当前项目和模块中支持的所有Gradle任务和运行配置,以便我们快速操作。

Tasks

Tasks列表里的任务跟我们执行./gradlew task得到的任务列表是一样的。把光标放在某个任务上面会显示任务的描述信息。双击任务即可执行。

Run Configurations

Run Configurations列表中列出了项目中执行过的任务配置,这些配置都是执行任务时自动生成的。想再次执行的时候可以在配置列表中直接选择。

构建项目和模块

编译项目

当我们只想对修改过的文件进行编译时就会使用Make进行编译,可以指定对项目或者模块进行编译

菜单栏: Build -> Make Project
快捷键: command + F9

编译模块

前提条件: 选中某个模块
操作步骤: 菜单栏 -> Build -> Make Module’模块名’

设置自动编译项目

操作步骤: Android Studio -> Preferences… -> 搜索Compiler -> 勾选Make project automatically

重新构建项目

操作步骤: 菜单栏 -> Build -> Rebuild Project(重新构建项目)

Make Project跟Rebuild Project的区别

Make Project是对新产生变化的文件进行一次编译,已经编译过的文件就不用重新编译,Rebuild Project是对整个项目重新编译,用时更久。

清理项目

清理项目会清空output目录下的文件,并重新编译项目
操作步骤: 菜单栏 -> Build -> Clean Project

Gradle Script

Gradle Scripts列表:

  • build.gradle: 项目构建配置文件
  • build.gradle: 模块构建配置文件
  • gradle-wrapper.properties: gradle wrapper配置文件
  • proguard-rules.pro: 混淆规则配置文件
  • graddle.properties: gradle配置文件
  • setting.gradle: 项目全局配置文件
  • local.properties: SDK、NDK配置文件

Gradlew配置文件gradle-wrapper.properties

这个文件一般是不动的,除非想手动指定Gradle的版本,可以修改distributionUrl。也可以在Project Structure -> Project中设置Gradle version

项目全局配置文件setting.gradle

主要声明一些需要加入构建的模块

本地属性配置文件local.properties

在Project Structure -> SDK Location 中设置SDK和NDK的路径,修改后会同步到local.properties文件中。

Gradle配置文件gradle.properties

gradle.properties是Gradle的配置文件,build.gradle通过独缺这个文件配置的参数来进行相应的构建。

代码混淆规则配置文件proguard-rules.pro

如果想在打包的时候进行代码混淆,就需要在proguard-rules.pro中配置代码混淆规则。

项目构建配置文件build.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
28
29
30
31
32
//项目构建文件,可以到各子项目/模块添加常用的配置选项
buildscript {
//Android插件从这个仓库中下载
repositories {
jcenter() //依赖仓库源的别名,兼容maven的远程中央仓库
}
//依赖
dependencies {
//android gradle插件
classpath 'com.android.tools.build:gradle:2.2.0-alpha1'
//提示
//请不要在此处添加应用程序依赖;他们应该在单个Module build.gradle文件中添加
//这里添加的应该只是Project的依赖
}
//此处配置Project中默认的仓库员,包括每个module的依赖
//这样每个module就不用单独配置仓库了
allprojects {
repositories {
jecnter()
}
}
//打包前执行clean任务
//任务类型是Delete
//clean任务就是删除项目根目录下的build目录
task clean(type: Delete) {
delete rootProject.buildDir
}
}

模块构建配置文件build.gradle

Module: build.gradle用来配置模块的构建任务

在项目结构中配置模块构建

Project Structure用来配置项目和模块的各种构建参数和属性

配置应用程序属性

  • Compile Sdk Version: 指定Android的编译版本
  • Build Tools Version: 指定构建工具的版本
  • Library Repository: 指定依赖的仓库源
  • Ignore Assets Pattern: 指定构建打包时要忽略的文件
  • Incremental Dex: 增量Dex打包,开启此功能可以提升编译打包的速度
  • Source Compatibility: 指定资源版本
  • Target Compatibility: 指定目标版本

配置应用程序签名

在这里配置了签名,相应地在module app的build.gradle文件中会自动添加下面的配置

1
2
3
4
5
6
7
8
9
//签名配置
signingConfigs {
MySigning {
keyAlias 'myandroid'
keyPassword '123456'
storeFile file('钥匙库路径')
storePassword '123456'
}
}

配置应用程序特性

多渠道打包要在Flavors配置相应的属性

  • Name: Flavor的名字,如我们常用的渠道xiaomi,baidu
  • Min Sdk Version: 向下兼容的最小SDK版本
  • Application Id: 应用程序的包名
  • Proguard File: 指定混淆文件路径,如果不指定会使用默认的
  • Signing Config: 指定签名文件。签名的文件在Signing中设置
  • Target Sdk Version: 目标SDK版本
  • Test Instrumentation Runner: 指定Test Runner
  • Test Application Id: 测试应用的ID
  • Version Code: 应用程序的版本号,用于升级
  • Version Name: 应用程序的版本名称
  • Version Name Suffix: 应用程序版本名称的后缀

配置应用程序的构建类型

构建类型Build Types非常重要,默认两个构建版本: debug 和 release

  • Name: 构建类型名称
  • Debuggable: 是否可以调试
  • Jni Debuggable: Jni是否可以调试
  • Proguard File: 指定混淆文件路径,如果不指定会使用默认的
  • Signing Config: 指定签名。签名的文件在Signing中设置,若为空则不签名,打出来的包也是未签过名的
  • Renderscript Debuggable: 是否使用渲染脚本
  • Renderscript Optim Level: Rendescript版本
  • Minify Enabled: 是否混淆
  • Target Sdk Version: 目标SDK版本
  • Pseudo Locales Enabled: 是否支持本地化整理
  • Application Id Suffix: 应用程序Id后缀
  • Version Name Suffix: 应用程序版本名称的后缀
  • Zip Align Enabled: 是否支持Zip Align

Project Structure没有的配置,但buildTypes支持的属性如下

  • buildConfigField "boolean","LOG_DEBUG","true" 显示Log
  • shrinkResources true 移除无用的resource文件,minifyEnabled必须为true

签名和打包

Android系统要求应用程序必须经过签名才能够安装到系统中,签名就是在应用程序特定的字段中些人标识信息,Android系统通过签名判断你是否是这个应用程序的开发者。

签名相同的应用程序:

  • 能够正常地覆盖安装旧版本
  • 能够允许代码和数据共享

默认签名证书
Android SDK工具会自动生成一个调试用的签名证书debug.keystore

当我们打debug包时,默认使用debug.keystore进行签名。debug包可以在真机和模拟器上运行和调试,但不能发布到应用市场。对外发布时要使用统一的签名。

自动打包和签名

  • 配置签名证书。打开Project Structure窗口
    • 选择app模块
    • 单击Signing标签
    • 新增一个签名证书的配置
    • 选择证书,填入相关信息
  • 配置构建类型
    • 单击Build Types标签
    • 选择release
    • Signing Config这一项选择刚才我们配置的签名
  • 自动打包和签名
    • ./gradlew assembleRelease

混淆打包

为了防止反编译,增加反编译成本,使用ProGuard进行混淆,通过删除从未使用的代码和使用晦涩名字来重命名类、字段和方法,从而对代码进行压缩、优化和混淆。
在build.gradle中打开混淆开关,minifyEnabled设置为true

多渠道打包

国内Android应用程序有360、小米、豌豆荚、百度等非常多的下载渠道,想统计每个渠道的下载量和活跃度,就需要使用统计平台。
以友盟统计为例,配置渠道信息并执行自动化打包

在AndroidMainfest.xml配置可动态替换的渠道参数
1
2
3
<meta-data
android: name = "UMENG_CHANNEL"
android: value = "${CHANNEL_ID}"
在build.gradle中配置渠道信息和自动替换脚本
1
2
3
4
5
6
7
8
9
10
11
//多渠道打包
productFlavors {
xiaomi() //渠道名为xiaomi
baidu()
wandoujia()
//自动替换AndroidManifest.xml中的渠道号
productFlavors.all { flavor ->
flavor.manifestPlaceHolders = [CHANNEL_ID: name]
}
}
打包后自动修改apk的名字
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
//打包后自动修改apk的名字
//release包的命名格式为: 产品名_版本号_渠道号.apk
//debug包的命名格式为: 产品名_版本号_渠道号_Debug_打包时间.apk
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
if (null != outpoutFile && outputFile.name.endsWith('.apk')) {
File outputDir = new File(outputFile.parent);
def baseName = PRODUCT_NAME + "${defaultConfig.versionName}" + "_" + variant.productFlavors[0].name
def newApkName
if (variant.buildType.name.equals('release')) {
newApkName = baseName + '.apk'
} else if (variant.buildType.name.equals('debug')) {
newApkName = baseName + "_Debug_${packageTime()}.apk"
}
output.outputFile = new File(outputDir,newApkName)
}
}
}
自动化打包

方法一: 命令行
./gradlew assembleRelease

方法二: Gradle工具窗口
方法三: 菜单栏 -> Build -> Generate Signed APK -> 一步步下去 -> 在Flavors中全选 -> Finish

查看渠道号是否被正确替换

单击apk后,Android Studio会自动解析apk,这样就可以在Android Studio中直接查看apk的信息了。

运行和调试

运行和配置调试

菜单栏: Run -> Edit Configurations…
快捷键: control + alt + R

Android应用程序配置

Name

在这里输入配置的名字,会在工具栏运行应用程序配置的下拉列表中看到

General

在这里配置安装、启动、部署应用程序选项

1、 Module: 列表中列出了当前项目中的所有模块,可以指定相应的模块来运行
2、 Installation Options: 安装选项

  • Deploy: 下拉列表中列出了应用程序运行时的部署模式
    • Default APK: 部署默认的APK,运行时会先打包安装,再启动APK
    • Custom Artifact: 部署自定义的APK,会根据所选择的模块来选择相应的配置
    • Nothing: 不做任何部署,运行时直接启动应用,如果应用已经安装了会直接启动,没有安装就会报错。
  • Install Flags: 给adb shell pm install 添加运行参数
  • Launch Options: 启动选项
    • Default Activity: 启动默认Activity,运行时会启动默认的MainActivity,如果没有就会报错。
    • Specified Activity: 指定启动的Activity
    • Nothing: 运行时不会启动任何Activity
    • URL: 在这里可以指定启动的scheme
    • Launch Flags: 给sdb shell am 添加运行参数,参数添加在命令的最后面
  • Deployment Target Options: 部署目标选项
    • Target
      • Show Device CHooser Dialog: 每次运行弹出选择设备对话框
      • USB Device: 使用USB连接的设备
      • Emulator: 使用模拟器
    • Use same selection for future launches: 以后每次运行都是用同样的选择。
Miscellaneous

在这里配置日志和安装选项

1、Logcat

  • Show logcat automatically: 运行时自动显示logcat日志
  • Clear log before launch: 启动前清空日志

2、Installation Options

  • Skip installation if APK has not changed: 如果代码没有变更,运行时跳过安装
  • Force stop running application before launching activity: 启动Activity前强制关闭运行的应用程序。
Debugger

在这里配置调试类型

Profiling

在这里配置图形跟踪选项

Disable precompiled shaders and programs: 禁用预编译着色器和程序

Before launch

在这里可以配置运行之前需要执行的任务,默认会执行Make

添加任务
任务 说明
Run External tool 运行外部工具,如果有的话可以直接选择,如果没有可以去新建
Make 编译选择的模块
Make Project 编译项目
Make,no error check 编译选择的模块,但不进行错误校验
Build Artifacts 构建构件,如果有的话可以选择对应的构件
Run Gradle task 运行Gradle任务
Gradle-aware Make 执行Gradlew任务

运行应用程序

运行应用程序

菜单栏: Run -> Run…
快捷键: control + alt + R

清理后重新运行应用程序

菜单栏: Run -> Clean and Return’配置名’
快捷键: command + alt + R

停止应用程序运行

菜单栏: Run -> Stop’配置名’
快捷键: command + fn + F2

调试应用程序

断点

行断点

行断点是我们最常用到的断点,被用于对代码特定的行进行调试

菜单栏: Run -> Toggle Line Breakpoint
快捷键: command + F8

单击某行左边栏即可设置断点
取消断点和添加行断点的方法相同

属性设置: 右击行断点,弹出属性设置对话框

  • Enabled: 断点启用和禁用
  • Suspend: 勾选All,执行到断点时所有线程都会被挂起。勾选Thread,执行到断点时只有当前断点所在的线程会被挂起。
  • Condition: 设置断点暂停条件
方法断点

方法断点主要用来检查方法的输入和输出

操作步骤: 菜单栏 -> Run -> Toggle Method Breakpoint -> 单击方法名所在行的左边栏

属性设置: 右击行断点,弹出属性设置对话框。和行断点相比属性多了一个Watch,Method entry 和 Method exit表示调用此方法开始的时候和结束的时候断点都会被触发。

字段观察点

当我们对程序运行的过程不太关心,只关心某个变量的变化时可以使用字段观察断点

操作步骤: 菜单栏 -> Run -> Toggle Field Watchpoint -> 单击字段所在行的左边栏

属性设置: 右击行断点,弹出属性设置对话框。和行断点相比属性多了一个Java Field Watchpoints。Field access(当字段被访问的时候触发断点)和Field modification(当字段被修改时触发断点)

条件断点

条件断点用来设置断点被触发的条件,如果条件不满足断点是不会被触发的。

操作步骤: 右击左边栏的断点图标 -> 勾选Condition -> 设置暂停条件

临时断点

当我们想某个断点只被触发一次后就自动删除的时候,可以使用临时断点

菜单栏: Run -> Toggle Temporary Line Breakpoint
快捷键: fn + command + option + shift + F8

如果想把临时断点变为普通断点,可以在属性中取消勾选【Remove once hit】

异常断点

异常断点会在某个异常发生时触发断点,我们就可以第一时间得到异常信息,方便排查问题

菜单栏: Run -> View Breakpoints
快捷键: fn + command + shift + F8

在打开的断点窗口单击左上角的加号,选择Java Exception Breakpoints,然后在弹出的【Enter Exception Class】窗口中输入要调试的异常。

日志断点

在调试的时候,我们想临时多加一些日志但又不想重新构建应用程序的时候,可以使用日志断点

操作步骤: 右击左边栏的断点图标 -> 取消勾选【Suspend】 -> 在展开的选项中勾选【Log evaluated expression】 -> 输入日志信息表达式。

因为取消了Suspend,所以执行到断点出不会停下,而是会打印日志。

禁用断点

当某个断点暂时不需要但又不想删除时可以先禁用

菜单栏: Run -> Toggle Breakpoint Enable
快捷键: option + 单击断点

断点设置

打开属性配置窗口
菜单栏: Run -> View Breakpoints
快捷键: fn + shift + command + F8
调试工具窗口: 单击左边工具栏的View Breakpoints
右击断点的图标: 单击More

  • 断点管理: 断点按类型进行分组,在这里可以新建和删除断点
  • 常用设置: 在编辑器窗口中右击断点图标就能够设置这些属性
  • 日志断点设置: 在这里可以设置日志断点的属性
  • 其他设置: 设置临时断点,以及选中的断点被执行后是禁用还是丢弃当前断点
  • 过滤: 设置断点的一些限制,如作用于实例的ID,指定类以及有效次数
  • 预览窗口: 在这里查看断点所在的代码位置

帧调试窗口

帧调试窗口显示了当前断点所在的线程以及执行到该断点所调用过的方法。

堆栈帧

堆栈帧是用来存储数据和不服你过程结果的数据结果,同时也用来处理动态链接、方法返回值和异常分派。每一次调用方法在队长总都会占用一部分内存,单位是帧。堆栈帧随着方法调用而创建,随着方法结束而销毁。每个堆栈帧中都包括传入的参数、返回地址、方法存储在堆栈上的局部变量以及对程序调试提供支持的信息。一个线程包括多个堆栈帧。

当前堆栈帧

一个线程在执行过程中,执行到断点处暂停,如果只有当前正在执行的那个方法的堆栈帧是活动的,这个堆栈帧就是当前堆栈帧。

帧调试窗口:

  • 显示当前断点所在的线程
  • 显示执行过的方法,也可以说是执行到当前堆栈帧这个过程中所创建过的堆栈帧
  • 查看工具: 查看执行过的帧和过滤当前应用的帧

内容菜单: 右击堆栈帧,显示可操作菜单

  • Add Stepping Filter(添加步进过滤器): 使用此命令再打开的对话框中添加一个步进过滤器
  • Export Threads(导出线程)
  • Customize Threads View(自定义线程显示)

变量调试窗口

我们可以再变量调试窗口中检查应用程序中对象值得存储,当选择堆栈帧的时候,变量调试窗口就会显示范围内的所有数据(方法的参数、本地变量和实例变量)

Inspect

检查功能用来检查字段、局部变量和表达式的引用,既可以打开一个非模式检查窗口,也可以按照需求打开多个检查窗口

操作步骤: 右击要检查的字段 -> 局部变量或表达式 -> Inspect ->弹出一个非模式检查窗口

Mark Object

标记对象功能可以给对象添加标签,看起来更加直观

操作步骤: 右击要标记的对象 -> 选择Mark Object或按快捷键fn+F3 -> 然后在弹出的窗口输入对象的标签

Set Value

用来更改运行时字段或变量的值

Copy Value

用来复制变量或结构。当选中一个变量来复制时可以复制变量的值,当选择多项时会复制整个结构

Compare Value with Clipboard

跟剪切板中的值比较

Copy Name

复制变量的名字

Evaluate Expression

计算表达式

Add to Watches

添加到见识窗口会把选择的变量或表达式添加到监视窗口,在我们调试应用程序的时候监视窗口会显示对应的表达式或变量的值。

Show Referring Objects

显示选中变量引用的对象列表

Jump to Source

跳转到所选变量或字段的源码

Jump to Type Source

打开源代码中所选变量或字段的类型

View Text

用来显示所选变量的文本

Customize Data Views

自定义数据显示

监视窗口

监视窗口用来计算当前堆栈帧范围内的变量或表达式,在调试的过程中通过监视窗口来监视变量或表达式的值

添加变量或表达式到监视窗口

监视变量
  • 在Variables窗口中点击变量 -> Add to Watches,然后在右边的监视窗口将会出现变量
  • 在Watches窗口中单击左下角的+按钮 -> 输入变量名,会弹出智能联想,选中后添加成功。每当程序执行到包含a变量的时候,监视窗口的值会随着a变量值的变化而变化,达到监视的目的
监视表达式
  • 按快捷键fn+option+F8,进入计算表达式窗口,输入所要监视的表达式
  • 在Watches窗口中单击左下角的+按钮 -> 输入表达式

快捷工具

利用监视窗口底部的工具栏可以快速方便地进行新建、删除、移动、复制操作。

调试控制工具

调试控制工具常用功能

  • 暂停、恢复程序运行
  • 终止进程
  • 查看、禁用断点
  • 获取线程堆栈

View Breakpoints(查看断点)

打开断点对话框、配置断点属性

Mute Breakpoints(禁用断点)

禁用断点功能可以切换断点状态。

Get thread dump(获取线程堆栈)

显示线程堆栈面板

Restore Layout(恢复布局)

恢复布局功能可以恢复到原始的布局,当前所有的布局变更都会被放弃

(Settings)设置

  • Show Values Inline: 选中后启动内联调试功能,允许在编辑器中观察执行过的变量的值
  • Show Method Return Values: 选中后会显示上次执行方法的返回值
  • Auto-Variables Mode: 选中后调试器可以自动评估某些变量
  • Sort Values Alphabetically: 选中后窗口中的变量值按字母的顺序排列
  • Unmute Breakpoints on Session Finish: 选中后当一个调试回话完成就会重新启用所有禁用的断点

步进调试工具

Show Execution Point(显示执行点)

当我们需要查看当前的执行点时,光标会立刻定位到当前执行到的断点
快捷键: fn + option + F10

Step Over(单步跳过)

执行单步跳过,就会执行下一行。如果下一行是一个方法,就不会进入方法体,而是会执行完此方法,然后跳到下一行。
快捷键: fn + F8

Step Into(单步进入)

执行单布进入,会执行下一行。如果下一行是一个方法,且该方法如果是自定义的方法,则会进入方法内,如果是官方类库的则不会进入。
快捷键: fn + F7

Force Step Into(强制进入)

执行强制进入,会进入任何方法,不管该方法是自定义的还是官方类库的
快捷键: fn option + shift + F7

Force Step Out(单步跳出)

执行单步跳出,会跳出当前进入的方法,返回该方法被调用处的下一行。
快捷键: fn + shift + F8

Drop frame(丢弃帧)

如果你已经进入了某个方法内,执行丢弃帧,当前方法会被中断,并返回当前方法被调用的地方。另外,变量的值也会回到最初。

Run to Cursor(运行到光标处)

在调试时,光标可以放在任意一行。程序会运行到光标所在行暂停。

Evaluate Expression(计算表达式)

会打开计算表达式窗口
快捷键: fn + option + F8

计算表达式

当我们想临时修改某个变量的值或查看其内部方法返回值的时候,可以使用计算表达式功能。

  • Expression Mode: 计算单行表达式
  • Code Fragment Mode: 计算代码片段,可以对声明、赋值、循环和if/else进行计算

使用表达式计算功能时需要注意一下两点

  • 只有在调试并且断点被触发的时候,才可以使用计算表达式功能,也就是说如果不是在调试的住鞥太,计算表达式功能是不可用的
  • 如果计算表达式调用一个方法,方法内又恰好有断点,那么该断点会被忽略,直接计算出表达式的值。

在堆栈帧中计算表达式或代码片段

菜单栏: Run -> Evaluate Expression
快捷键: fn + option + F8

  • 在帧调试窗口中,选择想要计算表达式的堆栈帧
  • 调用计算表达式功能
  • 选择计算模式
  • 输入表达式或语句
  • 执行计算

计算任意表达式

在变量调试窗口中右击变量 -> Evaluate Expression -> 之前选中的变量会显示在表达式输入框中。在这里我们可以切换计算模式、查看计算过的历史、输入表达式。

快速计算表达式的值

前提条件: 将光标放在表达式上或选中表达式
菜单栏: Run -> Quick Evaluate Expression
快捷键: fn + option + command + F8

选中表达式立即显示表达式的值

在调试工具栏上单击设置按钮,勾选【show value on selection change】,然后选中表达式,会在表达式的上面显示计算出来的结果。

关联调试到Android进程

通常我们调试应用程序时,需要先添加断点,再运行调试。这样做会比较慢,因为需要重新部署应用程序。
Android Studio提供了一种方法可以随时调试应用程序,不管当前应用程序是否以调试模式运行。

前提条件: 应用程序已经在设备上运行,已添加断点
操作步骤: 菜单栏 -> Run -> Attach Debugger to Android Process或在工具栏中单击按钮

配置和运行单元测试

配置和运行本地单元测试

本地单元测试用来执行那些对Android没有依赖或Android依赖容易mock的单元测试
本地单元测试运行在自己电脑上,测试用例在本地虚拟机上编译运行,执行速度快。
本地单元测试写在app/src/test/java目录下
本地单元测试使用JUnit或TestNG测试框架

在项目窗口中的类名上右击 -> Run 测试类

保存临时配置

通过上面的方法运行完测试之后,在工具栏的运行配置列表中显示了刚才运行的测试类。这个配置是自动生成的,如果需要保存,单击【Save ’测试类名‘ Configuration】

配置本地单元测试

需要自定义本地单元测试配置时,可以打开Run/Debug Configurations对话框 -> 单击左上角的+号 -> JUnit,然后新增一个JUnit配置窗口

  • Name: 输入配置名
  • Use classpath of module: 选择测试模块,下拉列表中会列出项目所有的模块,选择我们需要测试的。
  • Test kind: 选择一种测试范围,本例中选择的是Class
    • Class: 显示测试类的配置项
    • Method: 显示测试类和方法的配置项
  • 测试用例配置:Class,选择测试类
  • Fork mode: 用来指定是为每个测试用例都创建一个进程还是所有测试用例在一个进程中执行。
    • none: 在一个进程中执行所有测试
    • method: 每个测试用例都会创建一个测试进程,这种方式会比较慢
  • Repeat
    • Once: 所有用例只执行一次
    • N Times: 自定义用例执行次数
    • Until Failure: 不断重复执行,直到用例失败
    • Until Stopped: 不断重复执行,直到手动停止
  • VM options: 默认值为-ea,用来设置jvm是否启动断言机制
  • JER: 使用默认的设置即可

使用命令行运行单元测试

./gradlew test
执行Gradle测试任务所有的测试用例都会被运行,然后会产生测试报告。测试报告存放在app/build/reports/debug/index.html里

配置Android单元测试

Android单元测试

Android单元测试用来执行那些有Android依赖或Android依赖不好mock的单元测试
Android单元测试运行在真机或模拟器上
Android单元测试写在app/src/androidTest/java目录下
Android单元测试使用Android Tests测试框架

配置Android单元测试

需要自定义本地单元测试配置,可以打开Run/Debug Configurations对话框 -> 单击左上角的+号 -> Android Tests,新增一个Android Tests配置窗口

  • Name: 输入配置名
  • Module: 选择需要测试的模块
  • Test: 指定测试范围
  • 指定instrumentation runner
  • 指定目标设备

工具

Android Studio中集成了很多非常好用的工具,除了IntelliJ IDEA 自带任务管理、生成Java Doc等工具,还集成了以前放在SDK目录中可以独立运行的Android开发工具,如Android Monitor、Android SDK Manager、模拟器等,现在他们已经被全部集成到了Android Studio当中,而且变得更好用。

任务

Android Studio支持与很多任务跟踪管理系统进行集成,只要配置一个任务跟踪管理系统并与我们的账号进行绑定,就可以方便地创建、跟踪、处理分配给自己的任务。
一个任务可以对应多个changelist,changelist就是我们修改过的文件。我们可以给每一个changelist起名字,当完成一项任务后,可以选择提交相应的changelist。

配置任务

进入配置界面
  • 偏好设置 -> Tools -> Tasks -> Servers
  • Tools - > Tasks & Contents -> Configure Servers
  • open task 右上角的setting
配置JIRA

JIRA是集项目计划、任务分配、需求管理、错误跟踪于一体的商业软件。

  1. 进入服务器配置界面: 偏好设置 -> Tools -> Tasks -> Servers
  2. 添加JIRA服务器: 单击【+】按钮,选择JIRA
  3. 输入URL和账号: 输入JIRA的URL地址,再输入用户名和密码
配置GitHub
  1. 进入服务器配置界面: 偏好设置 -> Tools -> Tasks -> Servers
  2. 添加JIRA服务器: 单击【+】按钮,选择GitHub
  3. 输入URL和账号: 输入相关信息
配置Gitlab
  1. 进入服务器配置界面: 偏好设置 -> Tools -> Tasks -> Servers
  2. 添加JIRA服务器: 单击【+】按钮,选择Gitlab
  3. 输入UR和Token并选择对应项目

打开任务

直接打开任务

菜单栏: Tools -> Tasks & Contents -> Open Tasks
快捷键: option + shift + N

搜索任务

如果任务太多需要搜索,通过输入任务名会进行相关的匹配

包括已关闭的任务

默认显示的任务都是未关闭状态的,如果想查看已关闭的任务,需要勾选【Include closed tasks】

查看任务的描述和注释信息

使用fn + F1键可以查看任务的描述和注释信息

切换任务并合并上下文

在Open Task界面,选中一个任务,按Shift + 回车键会切换到选中的任务,上下文会合并。

创建新任务

在Open Task界面输入新任务的名字,按回车键就会开始创建

新建一个任务的时候会新建一个分支,分支的名字默认为任务名,可以随意修改,它会跟任务相对应。默认情况下,新建一个任务时会清空前一个任务的上下文。如果不想清空,需要取消勾选【Clear current context】

任务变更列表

新建changelist

输入新的changelist的名字。

提交change list

菜单栏: VCS -> Commit Changes
快捷键: command + K

切换/关闭任务

切换任务

操作步骤: 工具栏 -> 打开任务列表 -> 双击切换
切换任务以后,之前任务的上下文会被关闭

关闭任务

当一个任务完成以后,可以通过菜单栏: Tools -> Tasks&Contexts -> Close Active Task或者快捷键option + shift + W 来关闭任务

管理上下文

上下文是什么

上下文(Context)是指与一个任务(Task)相关的在在编辑器中被打开的文件,包括变更列表、编辑器、项目查看状态、运行配置和断点。上下文与任务是密切相关的,新建一个任务,上一个任务的上下文是要被清空的,表现就是工作去已打开的文件全部被关闭,然后新的上下文就开始被建立。

保存上下文

菜单栏: Tools -> Tasks&Contexts -> Save Context -> 弹出之前保存过的context list

在这个列表里加载、合并、移除上下文。

清除上下文

清除上下文功能会把所有上下文信息全部清除。
菜单栏: Tools -> Tasks&Contexts -> Clear Context

JavaDoc

JavaDoc是Sun公司提供的一个技术,从源代码中抽取类、方法、成员等主食形成一个和源代码配套的API帮助文档。也就是说,只要在编写程序时以一套特定的标签做注释,在程序编写完成后,通过JavaDoc就可以同时形成程序的开发文档了。

配置JavaDoc

操作步骤: 偏好设置 -> Editor -> Code Style -> Java -> JavaDoc

生成JavaDoc

菜单栏: Tools -> Generate JavaDoc 来指定生成JavaDoc的范围和参数。在这里可以指定生成JavaDoc的范围、输出目录、输出内容和参数。

特备注意Other command arguments的配置,如果项目中使用的是UTF8有编码格式,在这里要指定参数: -encoding utf-8 -charset utf-8,否则生成的JavaDoc中文会出现乱码。

生成JavaDoc时会先执行Gradle构建任务

如果生成JavaDoc时报错说 android.jar 找不到,就需要在 Dependencies 中添加 android.jar

将当前文件保存为模板

前提条件: 光标定位在编辑界面
操作步骤: 菜单栏 -> Tools -> Save File as Template -> 弹出模板配置窗口 -> 单击【OK】按钮后模板被创建

当新建一个文件时,可以看到刚才创建的模板选项。

如果想删除或重新编辑模板,就单击删除按钮或在菜单栏中单击File -> New -> 【Edit File Templates】

IDE Scripting Console

使用 IDE Scripting Console 可以测试Groovy的代码片段
操作步骤: 菜单栏 -> Tools -> IDE Scripting Console

管理Android SDK

Android SDK 管理Android Studio中使用的SDK和工具,我们可以在这里查看、安装、启动、删除SDK。

菜单栏: Tools -> Android -> SDK Manager
偏好设置: Appearance & Behavior -> System Settings -> Android SDK

管理Android SDK平台

每个Android SDK平台的安装包都默认包含了与API级别对应的Android平台和相关的源码。

管理SDK开发工具和更新站点

SDK Tools选项卡中显示了Android SDK的开发工具,安装后可自动检测更新,勾选【Show Package Details】会显示所有可用的SDK版本

SDKUpdate Sites选项卡用来管理Android SDK工具更新的站点。如果站点没有被勾选,Android Studio SDK Manager就不会去检测更新。

管理Android模拟器

内容简单,跳过

即时运行

Instant Run会让我们的开发过程变得快速流畅,Instant Run会分析我们修改的内容,然后决定以最快的方式部署新的代码

  • 热交换: 能够在APP运行时处理变更方法的具体实现
  • 暖交换: 能够在APP运行时把资源文件注入应用中
  • 冷交换: 能够在APP运行时处理一些结构性的变更。

启用即时运行

操作步骤: 偏好设置 -> Build,Execution,Deployment -> Instant Run -> 勾选【Enable Instant Run to hot swap code/resource changes on deploy】

  • Restart activity on code changes: 代码变更时重启activity
  • Show toasts in the running app when changes are applied: 每次变更应用时都显示toast提示
  • Show Instant Run status notifications: 显示即时运行状态通知

使用即时运行之前需要知道的事情

  • 即时运行只支持Android 4.0
  • 即时运行只支持Debug版本

如何判断是否已开启即时运行

有闪电标识说明已经开启即时运行

即时运行是如何工作的

即时运行被设计用来加快应用的构建和部署,通过执行“热交换”,“暖交换”,“冷交换”把变更的代码和资源推送到设备上

代码变更 即时运行行为
改变现有方法的实现代码 支持“热交换”: APP保持正常运行,待下次方法被调用时会使用新的实现
添加/删除或改变现有的资源 支持”暖交换”: 变更的资源会被推送到设备上,然后Activity会自动重启
结构代码变更(添加、删除或改变[-注解-实例字段-静态字段-静态方法签名-实例方法签名],改变当前类继承的父类,改变实现的接口列表,改变类的静态初始值设定,利用动态的资源ID重新布局元素) 支持“冷交换”: 结构代码变更被推送到目标设备,然后整个应用重启
改变应用的manifest,应用的manifest中改变了资源的引用 不支持。即时运行不支持改变Android manifest或manifest中资源的引用,这是因为API中包含的某些信息是从Android manifest中确定的。当APK被安装到设备上时,如果改变了manifest就必须重装APK。由于热、暖、冷交互是为了避免重新安装APK,为了加快速度,如果改变了Android manifest,Android Studio会自动部署一个新的构建

Android监视器

Android Studio集成了非常丰富的工具来对APP进行监控和调试,我们可以在Android 监视器查看日志、截图、录像、解析布局、实时查看性能。

启用ADB集成

菜单栏: Tools -> Android -> 勾选Enable ADB Integration

打开/隐藏 Android Monitor 工具窗口

快捷键: command + 6

  • 显示已连接到电脑上的设备列表,在这里选择需要使用的设备
  • 显示手机上运行的APP进程列表
  • 针对手机操作的工具栏,从上到下依次是截图、录像、系统信息、终止应用、布局解析、帮助工具。
  • Locat日志过滤工具栏,从左到右依次是日志级别、关键字、是否使用正则匹配、过滤配置
  • Logcat日志输出面板
  • Locat日志工具栏

截图

  • Android Studio支持对真机和模拟器截图
  • 图片格式为PNG
  • Android Studio支持对截图做一些修饰
  • 截图是针对真机或模拟器的

录像

  • 视频格式为MP4
  • 最长可以录制三分钟
  • 仅支持真机,模拟器不能录像
  • 录像是针对手机的

捕获系统信息

通常我们想查看系统信息都是使用adb shell dumpsys命令,如查看某个进程的内存信息:
~$ adb -s 设备序列号 shell dumpsys meminfo 进程名

布局解析

可以分析出当前界面的布局结构以及每个组件的属性

菜单栏: Tools -> Layout Inspector

Logcat监视器

Logcat监视器主要用来对APP进行监控和调试,能够实时显示APP和系统输出的日志信息。当异常发生时会显示相关的堆栈信息和代码链接,我们可以单击链接跟踪到代码

Android 中支持6中日志类型

  • Verbose(Log.v()): 详细,用于打印所有不重要的、一般的日志信息
  • Debug(Log.d()): 调试,用于打印调试用的日志信息
  • Info(Log.i()): 信息,用于打印正常使用时需要关注的日志信息
  • Warn(Log.w()): 警告,用于打印可能会有问题但还没发生错误的日志信息
  • Error(Log.e()): 错误,用于打印运行时出现的严重错误的日志信息
  • Assert(Log.wrf()): 断言,用于打印运行时出现的致命错误和日志信息

1、日志没有显示: 在工具栏单击【Restart】重新启动日志
2、设置日志头信息的显示: 在工具栏单击【Logcat Header】设置日志头信息的显示内容。
3、过滤日志

  • 过滤日志类型,输出级别为 Verbose > Debug > Info > Warn > Error > Assert。默认显示Verbose级别的日志。
  • 过滤输出的日志信息,支持正则匹配
  • 过滤器
    • Show only selected application: 仅显示当前选中的APP的日志
    • Firebase: 仅显示Firebase的日志信息
    • No Filters: 显示设备上所有的日志信息
    • Edit Filter Configuration: 编辑过滤器配置
    • 创建一个Logcat过滤器
      • Filter Name: 过滤器的名字
      • Log Tag: 设置过滤Tag参数,支持正则匹配
      • Log Message: 设置过滤日志信息参数,支持正则匹配
      • Package Name: 设置过滤包名参数,支持正则匹配
      • PID: 设置过滤的作用
      • Log Level: 设置过滤的日志类型

自定义Logcat的颜色

  • 操作步骤: 偏好设置 -> Editor -> Colors & Fonts -> Android Logcat
  • 设置颜色
    • 新建一个Scheme
    • 选择要设置的日志类型
    • 取消勾选【Use inherited attributes】
    • 设置颜色

内存监视器

内存监视器可以实时观察应用程序的内存使用情况。

要想查看应用程序的内存,首先要选择设备和应用程序的进程,其次要确定内存监视器是启用状态。
我们可以一边操作APP一边观察内存的变化,如果发现操作APP的过程中突然出现一个意料之外内存峰值或内存GC后不断增长,那就有可能会发生OOM或内存泄漏。
我们可以主动发起GC(垃圾回收),清除无用或不再被其他对象引用的那些对象所占用的内存空间。
GC后内存应该稳定在一个值附近才对,如果还在不断增长,那一定是内存泄漏了。

Dump Java Heap

使用HPROF查看器分析内存泄漏
  • 单击【Dump Java Heap】按钮,得到当前内存的快照(HPROF)文件。文件被存放在Captures/Heap Snapshot目录下,并使用HPROF查看器自动打开。
  • 使用HPROF查看器分析内存泄漏(HPROF查看器显示了APP的内存分配情况,包括APP为哪些类分配了内存空间、类的对象个数以及占用的内存大小。我们可以通过这些信息确认是否发生了内存泄漏)

    • Captrues/Heap Snapshot: 用于存放HPROF文件
    • 显示APP占用内存空间的类和类的属性

    • |属性|说明|
      |:–|:–|
      |Class Name|内存中的类名|
      |Total Count|内存中该类的对象个数|
      |Heap Count|选中的堆内存中该类的对象个数|
      |Sizeof|该对象的大小|
      |Shallow Size|选中的堆内存中所有对象浅堆大小总和(浅堆是指一个对象直接占用的内存大小,不包含对其他对象的引用),Shallow Size = Sizeof * Heap Count|
      |Retained Size|选中的堆内存中所有对象保留堆大小总和(保留堆是指一个对象自己占用的浅堆加上从该对象能直接或间接访问到对象的浅堆之和),Retained Size等于所有Dominating Size相加|

    • 显示选中类的所有实例和属性
    • |属性|说明|
      |:–|:–|
      |Instance|类的具体对象|
      |Depth|从GC root到选中对象最短的跳跃数|
      |Shallow Size|该对象的浅堆大小|
      |Dominating Size|该对象的保留堆大小|
    • Reference Tree: 指向所选对象的引用,以及引用的引用,其他属性同上
    • Analyzer Tasks: 分析任务,使用这个功能可能分析出发生内存泄漏的Activity和重复的字符串
      • Detect Leaked Activities: 检测内存泄漏的Activity
      • Find Duplicate String: 找出重复的字符串
    • Analysis Results: 分析结果
使用MAT分析内存泄漏

如果还是习惯于使用MAT分析,也可以导出标准的hprof文件

  • Captures/Heap Snapshot -> 右击.hprof文件 -> Export to standard .hprof
  • 选择文件的存储路径
  • 单击【OK】按钮文件保存成功
  • 接下来就可以直接使用MAT打开这个文件进行分析了。

Allocation Tracking

Allocation Tracking(内存分配追踪器)用来监视内存分配更详细的信息。我们可以监视在执行某些操作一段时间内的内存分配情况。知道这些分配,可以更加有针对性地优化相关方法。

  • 可以查看何时、何处分配了对象,以及对象的大小、分配的线程和堆栈跟踪信息
  • 可以通过分配/释放模式复现内存抖动的情况
  • 可以配合HPROF查看器一起使用,追踪内存泄漏的问题。例如,当我们使用HPROF查看器发现了一个bitmap驻留在堆中的时候,可以使用Allocation Tracking 找到它的分配位置。

单击【Start Allocation Tracking】开始追踪内存分配,这时我们对APP进行一些操作,然后单击【Stop Allocation Tracking】

  • 停止追踪后.alloc文件被保存在Capture/Allocation Tracting目录下,并且被自动打开。
  • 显示内存分配信息。默认以方法来分类内存分配信息,还可以切换成以分配器来分类内存分配信息。
  • |属性|说明|
    |:–|:–|
    |Method|负责内存分配的方法|
    |Count|分配对象的个数|
    |Size|分配的内存总大小(Byte)|

单击这些属性可以进行相应的排序,我们可以通过内存分配的次数和大小来找出那些占用过多的内存、引发过多的GC且又非常耗时的方法。

  • 内存分配的图标。通过这个漂亮的图表,我们可以看出哪些方法或类拥有最多的对象
  • 显示图标指定的线程或方法的分配次数和内存大小
    • 将光标放在中心点会显示图表中占比最大的线程信息,如线程名、分配次数和内存大小
    • 这个圆圈是所有线程的占比,一些占比较小的线程双击后可展开
    • 显示线程名/方法名、分配次数和内存大小

CPU监视器

CPU监视器实时显示用户和内核模式下CPU使用率的综合,可以让我们很轻松地查看操作APP时的CPU使用率

模式

在用户(User)模式下,代码必须通过系统API访问硬盘或内存,并且只能访问虚拟内存地址,崩溃通常是可回收的。在内核(Kernel)模式下,代码可以直接访问硬件,包括物理内存地址,崩溃会导致设备停止。

方法追踪

Method Tacking用来追踪一段时间内系统的运行情况,可以查看APP中的调用堆栈和时间信息

  • 单击左上角的Start Method Tracking
  • 操作APP一段时间后再单击一次
  • trace文件被保存在Captures/Method Tracking目录下,并且自动打开
    • Inclusive Time: 包含时间(ms),方法占用的CPU时间,包含内部调用其他方法占用的CPU时间
    • Exclusive Time: 独占时间(ms),方法占用的CPU时间,但不含内部调用其他方法所占用的CPU时间

常用判断方法

  • 方法调用次数不多,但每次调用却需要花费很长时间,可能会有问题
  • 自身占用时间不长,但调用却非常频繁的方法也可能会有问题

网络监视器

网络监视器用来查看APP的网络请求情况,可以实时监控到APP的数据传输,使用它可以帮助我们扎到一些不必要的或不规范的网络请求。
流量测试是专项测试中非常重要的一个测试项,我们需要保证APP不会有不必要的数据加载、不会有过大的数据加载

GPU监视器

GPU监视器用来查看UI界面渲染帧需要花多少时间,可以实时查看每一帧渲染所花费的时间。

GPU监视器能帮我们快速查看UI界面的渲染执行、确认渲染路径是否花了较长的处理时间、寻找帧渲染的时间峰值与用户或程序操作相关联。要想使用GPU监视器,首先要打开GPU呈现模式分析。

手机 -> 设置 -> 应用程序 -> 开发者选项 -> GPU呈现模式分析 -> 勾选【在adb shell dumpsys gfxinfo中】 -> 选中需要测试的APP进程,开启GPU监视器。

帧渲染的过程分成了四个不同的阶段

  • 蓝色: Draw(绘制),表示创建/刷新DisplayList(包含需要GPU绘制到屏幕上的数据信息)所花费的时间
  • 紫色: Prepare(准备),表示UI线程将所有资源传递给渲染线程所花费的时间
  • 橙色: Process(过程),表示执行DisplayList并创建OpenGL命令所花费的时间
  • 黄色: Execute(执行),表示CPU发送OpenGL命令给GPU,等待GPU渲染完成的时间。

GPU监视器的组成包括渲染帧的不同阶段,显示渲染帧耗时曲线图。绿色的线表示60FPS,即每一帧渲染时间大概是16ms。红色的线表示30FPS,即每一帧渲染时间大概是33ms

APK分析器

能反编译APK,可以帮助我们非常方便地分析APK当中的内容。我们可以用它来分析APK当中的混淆文件,一方面可以参考别人家的APK是如何配置混淆文件的,另一方面也可以排查自己家的APK是否有相关的配置问题,我们还可以用它来查看自己编译的资源文件,找出一些比较大的文件进行具体分析,确认是否需要保留、减小包大小。右上角的【Compare with…】功能可以对比两个APK文件,找出差异性,方便分析不同版本APK之间的区别。

菜单栏: Build -> Analyze APK -> 选择要分析的APK -> OK

以微信APK为例

  • com.tencent.mm: 微信的包名
  • version 6.1.0.73_rl097298: 版本号
  • Raw File Size: 34.2MB: 分析出来的APK文件总大小
  • Download Size: 27.6MB: 下载下来的APK的总大小
  • File: 分析出来的文件列表
  • Raw File Size: 分析出来的文件对应的原始大小(未压缩过的)
  • Download Size: 分析出来的文件对应的压缩过的大小
  • % of Total Download size: 分析出来的文件对应的压缩过的大小/下载下来的APK的总大小

在APK分析结果界面,按文件大小从高到低排序,可以很清楚的看出哪些是大文件,然后查看大文件内容。如果想减少包大小,需要先从大文件入手。我们可以查看合并后的AndroidManifest.xml是否正确,还可以混淆文件,看看微信是如何进行混淆配置的。

主题编辑器

主题编辑器支持实时预览主题效果,支持横竖屏、UI模式、虚拟机、Android版本和多语言预览。

菜单栏: Tools -> Android -> Theme Editor 或者打开 res/values/styles.xml -> 单击右上角Open editor

  • colorPrimaryDark: 状态栏颜色
  • colorPrimary: 标题栏颜色
  • textColorPrimary: 标题栏字体颜色
  • windowBackground: 窗口背景颜色
  • naigationBarColor: 虚拟导航栏背景颜色

版本控制

版本控制是项目开发过程中必不可少的部分,不管是个人还是团队,灵活地使用版本控制将会使项目开发变得更加轻松。

  • 菜单栏 -> VCS 可以看到版本控制系统的所有功能
  • 右键 -> 菜单 可以看到版本控制系统的选项,只包含对应的版本控制系统特有的功能
  • 底部工具栏 -> Version Control(很多功能和菜单栏VCS相同,但是这里的操作更加有针对性,还可以批量操作)
  • 顶部工具栏 -> 常用功能(更新项目、提交变更、跟远程仓库中的文件进行对比、显示历史、撤销操作)
  • 状态栏 -> 分支操作(对本地、远程分支进行各种操作,比如检出、创建新的分支、对比、合并、删除等)

Git偏好设置

设置步骤: 偏好设置 -> Version Control -> Git

  • Path to Git executable: Git执行路径
  • SSH executable: 执行SSH,默认使用Android Studio内建的
  • commit automatically on cherry-pick: 在cherry-pick时是否自动提交
  • Warn if Crlf Line separators are about to be committed: 如果回车换行符被提交是否警告
  • Warn when committing in detached HEAD or during rebase: 提交detached HEAD 或 rebase 时是否警告
  • Update method: 选择代码更新方式,包括Branch defaut,merge,rebase
  • Auto-update if push of the current branch was rejected: push当前分析被拒绝是否自动更新
  • Allow force push: 是否允许强制push

###配置GitHub账户信息
设置步骤: 偏好设置 -> Version Control -> GitHub

输入账号信息

从GitHub克隆代码

  • 进入GitHub克隆界面
    • 欢迎界面: Check out project from Version Control -> GitHub
    • 菜单栏: File -> New -> Project from Version Control -> GitHub
    • 菜单栏: VCS -> Check out from Version Control -> GitHub
  • 配置克隆地址
  • 下载并打开项目。单击【Clone】按钮开始从给定的仓库地址克隆项目到本地,完成后会弹出一个【Import Project from Gradle】确认对话框。

将本地项目共享到GitHub

  • 单价【Share Project on GitHub】。打开本地项目 -> 菜单栏 -> Import into Version Control -> Share Project on GitHub
  • 确定是本地项目。如果此项目已经在GitHub上,在Android Studio右上角会有相应的提示信息,单击GitHub可以跳转到项目主页。如果此项目没有在GitHub上,就会弹出一个新建仓库的对话框。
  • 指定首次提交的文件和提交的备注。单击【OK】按钮以后在状态栏会显示进度。
  • 确认分享成功。分享成功后在Android Studio的状态栏和右上角会显示成功提示。如果想查看GitHub上到底有没有分享成功,可以单击【SecondAPP】到项目主页查看。

查看本地变更历史

查看某个文件的本地变更历史

前提条件: 在文件列表中选中此文件或打开此文件,光标在文件中。
操作步骤: 右击 -> 在弹出的操作选项中单击Local History -> Show History

显示变更历史: 如果两个文件不同就会提示不同的个数,窗口底部列出了不同颜色表示的变更操作
查看某段代码的本地变更历史: 如果想查看某段代码本地的变更,需要先选中这段代码,然后再Local History列出的选项中选择【Show History for Selection】
查看某个文件夹的本地变更历史: 如果想要查看某个文件夹的本地变更,只需要选中这个文件夹,然后右击选择Local History -> Show History。我们还可以为每次变更贴上一个标签,只要在Local HIstory中选择Put Label,然后输入标签内容就可以了。

Git添加文件

  • 未跟踪是指没有被纳入版本控制的文件,Git就不会跟踪文件的变更
  • 已跟踪是指已被纳入版本控制的文件,在上一次的快照中有它们的记录,在工作一段时间后,这些文件的状态可能是未修改,已修改或已放入暂存区。

本地文件提交到远程仓库一般的流程为: 添加文件跟踪 -> 暂存已修改的文件 -> 提交到本地仓库 -> 推送到远程仓库。

添加文件跟踪

如果我们新建了一个文件,默认是没有被跟踪的,Git就不会跟踪文件的变更。未跟踪的文件显示为红色。

  • 右击文件 -> Git -> Add
  • VCS-> Git -> Add
  • option + command + A

添加完成后,文件颜色变为绿色,即已跟踪
提交到本地仓库/远程仓库的文件颜色显示为白色

暂存已修改的文件

暂存已修改的文件方法同添加文件跟踪

Git提交变更

当本地文件变更之后,我们需要提交变更

菜单栏: VCS -> Git -> Commit File
快捷键: command + K

配置提交信息

在提交变更窗口中可以选择Change list,也可以选择要提交的变更文件。在Author中选择或输入作者名字。选择Amend commit(修订提交)会在Commit Message中添加上一次的提交信息。
还可以选择做一些代码优化的工作。

  • Reformat code(格式化代码)
  • Rearrange code(重新排列代码)
  • Optimize imports(优化导入)
  • Perform code analysis(执行代码分析)
  • Check TODO(检查待办事项)
  • Cleanup(清理)
  • Update copyright(更新版权声明)

提交变更

  • Commit and Push: 将本地变更的文件提交到本地仓库,然后推送到远程仓库
  • Create Patch: 将本地变更的文件作为补丁创建
  • Commit: 将本地变更的文件提交到本地仓库

Git文件逐行追溯

如果想查看某个文件的某一行是谁修改的,就需要使用文件逐行追溯功能
执行文件逐行追溯操作,会显示某个文件每一行的详细改动信息,也可以说是每一行的注释,包括修订版本号、提交者、提交日期以及提交次数。

如何进行文件逐行追溯
其实就是执行git annotate命令,同git blame

  • 菜单栏: 单击VCS -> 选择Annotate
  • 右击文件编辑区域 -> 单击Git -> 选择Annotate
  • 右击文件左边栏 -> 选择Annotate

显示当前修订版本

修订版本号是一组SHA-1值,可以通过SHA-1 值来获取对应的那一次提交。SHA-1是散列函数加密算法,输出的散列值为40位十六进制数字串,可用于验证信息的一致性,防止被篡改。

操作步骤: 菜单栏 -> VCS,右击某一个文件或文件编辑区 -> Git -> Show Current Revision

Git文件比较

Android Studio集成的Git提供了非常好用的文件比较功能,可以将本地文件与远程仓库中的、某次提交的或其他分支的文件进行比较。

操作步骤: 菜单栏 -> 右击某一个文件或文件的编辑区 -> VCS -> Git,或者底部工具栏 -> Version Control -> 右击有变更的文件 -> Git

  • Compare with the Same Repository Version: 比较本地文件与远程仓库的文件
  • Compare with Last Repository Version: 本地文件与最近的一次提交比较
  • Compare with: 本地文件与某一次提交比较
  • Compare with Branch: 本地的文件或文件夹与某个分支上的进行比较

Git撤销操作

如果我们对某个或某几个文件进行了修改,现在想撤销这些修改,可以使用Git提供的撤销操作功能。单击【Revert】按钮,被选中的文件就恢复到了改动之前的状态。

Git版本回退

Git版本回退的意思就是讲本地代码会退到某一个指定的版本,此版本之前的所有内容都会被重置。

操作步骤: 菜单栏 -> VCS -> Git -> Reset HEAD -> 然后弹出Reset Head对话框

  • Reset Type: 回退类型
    • Mixed: 回退到某个版本,本地源码不会回退,会回退commit和index信息
    • Soft: 回退到某个版本,本地远吗和index信息不会回退,只回退了commit的信息,如果还要提交,直接commit即可。
    • Hard: 彻底回退到某个版本,本地的源码也会变为某个版本的内容
  • To Commit: 回退版本。
    • HEAD: 回退到最近一个提交版本
    • HEAD^: 会退到上一个提交版本
    • HEAD^^: 会退到上上一个提交版本
    • HEAD~0: 会退到最近一个提交版本
    • HEAD~1: 会退到最近一个提交版本
    • HEAD~2: 会退到最近一个提交版本
  • Validate: 版本验证。在指定会退到某个版本之前也可以先验证一下是否是想回退的版本

Git查看提交历史

Git查看提交历史记录也都有查看文件、文件夹和代码段的历史记录功能,不同点在于【查看本地变更历史】仅能查看本地的变更,远程的改动是无法看到的,【Git查看历史记录】可以查看所有commit以后的历史

查看某个文件的提交历史

操作步骤: 右击 -> 在弹出的操作选项中单击Git -> Show History -> 在Version Control中显示Hitory

查看某段代码的提交历史

选中这段代码,然后在Git操作列表中选择【Show History for Selection】

Git分支管理

当我们在进行软件开发时,同一个软件多个人协同开发,因此要有不同的分工。如果想让彼此的代码不受影响,就需要在不同的分支上进行开发,开发完成后再进行合并。

新建分支

单击【New Branch】 -> 输入分支的名字 -> OK

检出分支

检出分支作为新的本地分支,可以把一个远程分支checkout下来,可以起不同的名字,可以是多个本地分支,但是提交时都是向同一个远程分支进行提交。

操作步骤: 选择一个分支 -> 单击【checkout as new local branch】 -> 输入新的分支名 -> OK -> 成功检出

如果是对本地分支进行【Checkout as new local branch】操作,就会直接弹出一个【Checkout New Branch】输入框,不会有默认的分支名

检出分支/标签/修订版本

如果想检出某个分支/标签/修订版本,只需要知道对应的名字就可以了。在Git Branches操作列表中选择【Checkout Tag or Revision】 -> 弹出的输入框中输入分支名 -> OK后会检出对应的分支。
检出tag也只需要输入tag名就可以了。如果检出当前分支的某个修订版本,就需要输入对应的修订版本号

切换分支

切换分支需要选择切换的分支,单击【Checkout】。如果原来的分支没有变更,checkout后会切换到新的分支:如果有变更且有冲突,就会先解决冲突再切换。

分支对比

分支对比是拿当前分支与另外一个分支进行对比。

对比两个分支的提交日志

对比两个分支的不同

合并分支

合并分支只将选中的分支与当前的分支进行合并,如果有冲突就会弹出冲突列表,解决冲突合并成功。

删除冲突

  • 删除本地分支: 本地分支会被直接删除
  • 删除远程分支: 删除远程分支会有确认是否删除,确认删除后状态栏会有正在删除的信息显示,删除成功后Version Control上会有删除陈宫地提示。Remote Branches列表中此分支也会消失

Git创建标签

Git可以给历史中的某一个修订版本打上标签,通常我们会使用标签来标识一个版本的发布。

操作步骤: 菜单栏-> VCS -> Git -> Tag

  • Git Root:项目地址
  • Current Branch: 显示当前的分支
  • Tag Name: 标签名
  • Force: 如果相同的Tag名已经存在,是否强制创建
  • Commit: 通过输入的修订版本号、Tag名来打标签。如果空白,默认对HEAD打标签
  • Create Tag: 创建标签

Git合并分支

  • 选择合并变更(右击项目 -> 在弹出的操作列表中选择 Git -> Repository -> Merge Changes -> 弹出合并分支对话框)
  • 配置合并信息
    • Current Branch: 显示了当前的分支
    • Branches to merge: 显示了仓库中所有的分支,选择一个或多个要合并过来的分支
    • Strategy: 提供了可选择的合并策略,请按需选择
    • Commit Message: 添加本次合并的注释
  • 合并分支: 配置好合并信息后单击【Merge】按钮开始合并代码。

解决Git合并中的冲突

问题1: 合并分支为什么会有冲突?
因为在项目开发的过程中,可能大家会同时改动某个文件,当同一个文件在远程分支和本地分支按不同的方式被修改时,在合并分支的时候就会出现冲突。

问题2: 文件冲突会导致什么样的后果?
合并过程中如果文件冲突,合并就会失败,Git会在索引和工作树里设置一个特殊的状态,提示你如何解决冲突。我们必须解决完冲突并且更新索引后才能够将文件提交。

打开文件冲突列表

操作步骤: Git -> Resolve Conflicts
合并过程中如果有冲突也会突出文件冲突列表

解决冲突的方法

  • 如果想放弃本地的改动,而完全使用远程分支的改动,可选择【Accept Theirs】,此文件冲突解决
  • 如果想放弃远程的改动,而完全使用本地的改动,可选择【Accept Youts】,此文件冲突解决
  • 如果想详细解决冲突,单击【Merge】 -> 会打开文件比较窗口。左边是本地变更,邮编是远程分支上的变更,中间是合并结果。如果把右边远程分支的变更用作合并结果,单击‘<<’远程的变更就回到合并结果中。同理,也可将本地变更合并到结果中。

如果觉得改错了要恢复,可单击【Revert】。如果确定了合并结果,就单机【Apply】。

Git使用Rebase合并分支

Git Rebase是什么
Rebase顾名思义是‘变基’的意思,即合并时重新定义分支的根基或节点,让提交记录按时间线排列。

Git Rebase和Merge的区别是什么
Rebase跟Merge一样,都是用来合并分支的,但是Merge操作会生成一个新的节点,与之前的提交分开显示: Rebase操作不会生成新的节点,而是将两个分支融合成一个线性的提交。

什么时候使用Git Rebase
使用Rebase合并分支会使提交记录看起来非常清晰,因为它是时间线线性的现实记录,所以打你想线性地查看分支的提交记录时,可以使用Git Rebase来合并分支

对每个提交定义rebase行为。默认为pick

  • pick: 以同样的提交信息保存提交
  • edit: 在对下一提交进行操作之前,会让你对提交进行修正
  • skip: 遇到冲突暂停时,跳过这个提交
  • squash: 把这个提交和前一个提交合并成为一个新的提交
  • reword: 提交时要编辑提交信息
  • fixup: 和squash类似,但是要放弃提交信息

Git暂存/恢复暂存变更

暂存是什么意思

Git暂存就是从最近一次提交中读取相关内容,让工作区保证和上次提交的内容一致,相当于清空本地的所有改动。只不过这些改动进行了备份,我们可以选择性地进行恢复。

什么时候使用暂存

将写到一半的代码暂存,然后切换到其他分支修复BUG,BUG修复完成后再切回当前分支,然后恢复之前咱村的代码继续编写

暂存和恢复暂存怎么用

在Dev分支单击【Create Stash】创建暂存,IDE消除了本地的改动,恢复到上次提交的内容。切换到Master分支,改好代码返回Dev分支。此时会弹出暂存列表,选择之前暂存的代码,单击【Apply Stash】按钮进行恢复

Git获取最新内容

从远程仓库获取项目中最新的内容,包括远程仓库中分支的状态,可以通过菜单栏 -> VCS -> Git -> Fetch完成。Git会去拉取远程仓库最新的内容,并清除远程服务器上删掉的分支。

Git合并最新内容

要从远程仓库获取最新的内容,然后和本地的内容自动进行合并,可以通过菜单栏 -> VCS -> Git -> Pull。

Git会先执行Fetch去拉取远程仓库最新的内容,再执行Merge把远程仓库中的代码和本地代码合并。执行Pull以后在Version Control中会显示更新的详情。

Git更新项目

  • 菜单栏: VCS -> Update Project
  • 快捷键: Command + T
  • 工具栏

  • Update Type(更新类型): 提供了3种类型来进行同步

    • Merge: 更新后合并,相当于执行git fetch命令,再执行git merge或git pull——no-rebase
    • Rebase: 更新后变基,相当于执行git fetch命令,再执行git rebase或git pull–rebase
    • Branch Default: 更新后使用分支默认命令
  • Clean working tree before update(更新之前先清理工具目录): 可选择在清空工作目录之前以什么样的方式来保存你的更改,当更新完成后,可以恢复之前的更改。

    • Using Stash: 使用暂存
    • Using Shelve: 使用搁置

刷新文件状态

如果我们想刷新本地文件的状态,可以使用此功能。

操作步骤: 菜单栏 -> VCS -> Refresh File Status,或者Version Control工具窗口 -> Local Changes -> Refresh

Git 补丁

什么是补丁
Git当中的补丁是一个文本文件,包含了对源代码的修改。你可以创建一个项目中的补丁,然后把它发给需要的人,拿到补丁文件的人可以为自己的项目打上这个补丁。

创建补丁
假设你修改了项目中的一个BUG,然后需要创建一个补丁

操作步骤: 菜单栏 -> VCS -> Create Patch… -> 弹出Create Patch配置对话框

应用补丁
当我们拿到补丁后,可以通过菜单栏 -> VCS -> Apply Patch… -> 选择补丁文件 -> 单击【OK】

Git搁置变更

类似Git的暂存命令,等想恢复的时候再来恢复搁置。与暂存不同的是,搁置功能相当于是本地打了个补丁,把补丁文件保存在本地,等想要恢复的时候给项目打上个补丁就可以了。

搁置变更

操作步骤: 菜单栏 -> VCS -> Shelve Changes -> 在弹出的对话框中选择要暂时搁置的变更 -> 单击【Shelve Changes】

恢复搁置

当我们修改完BUG,回到之前的分支准备继续写代码,需要恢复之前搁置的变更

  • Unshelve Changes: 默认恢复搁置到新建的变更列表(操作步骤: Version Control工具窗口 -> Shelf -> 右击之前搁置的文件 -> Unshelve Changes -> 默认新建一个Changelist -> 输入Name后单击【OK】按钮)
  • Unshelve: 默认恢复搁置到默认的变更列表(操作步骤: Version Control工具窗口 -> Shelf -> 右击之前搁置的文件 -> Unshelve -> 弹出恢复搁置的对话框 -> 单击【OK】按钮后搁置恢复)

查看Git项目的提交信息

查看本地Git项目提交信息

操作步骤: 菜单栏 -> VCS -> Browse VCS Repository -> Show Git Repository Log -> 弹出选择对话框 -> 选择一个要浏览日志的项目

查看当前项目的提交信息

在Version Control工具窗口的Log查看当前项目的分支信息及提交信息

过滤信息

  • 过滤提交信息
  • 过滤分支/用户/日期/路径

窗口

最小化和最大化窗口

最小化窗口

菜单栏: Window -> Minimize
快捷键: command + M

最大化窗口

菜单栏: Window -> Zoom
快捷键: options + command + “=”

保存和恢复窗口布局

保存当前布局为默认布局

操作步骤: 菜单栏 -> Window -> Store Current Layout as Default

恢复默认的布局

菜单栏: Window -> ReStore Default Layout
快捷键: fn + shift + F12

工具窗口的显示和隐藏

通过Tool Windows显示/隐藏工具窗口
操作步骤: 菜单栏 -> View -> Tools Windows -> 显示Android Studio支持的所有工具列表

通过工具窗口都可以通过工具条上的Tab来显示和隐藏

工具窗口的隐藏技巧

隐藏活动的工具窗口

当有多个窗口被打开的时候,之隐藏活动的那一个工具窗口
菜单栏: Window -> Active Tool Window -> Hide Ative Tool Window | Close Active Tab

挨个隐藏工具窗口

当有多个窗口被打开的时候,使用此功能可以按打开的顺序逆向隐藏工具窗口
菜单栏: Window -> Active Tool Window -> Hide side tool Window

隐藏所有工具窗口

当编辑器和工具窗口都打开的时候,界面会显得比较乱。如果我们只想专注地编写代码,就可以一键把所有工具窗口隐藏
菜单栏: Window -> Active Tool Window -> Hide All Windows
快捷键: fn + shift + command + F12

恢复隐藏的所有工具窗口

菜单栏: Window -> Active Tool Window -> Restore Windows
快捷键: fn + shift + command + F12

工具窗口调整技巧

跳转到上一个

我们经常会在工具窗口和编辑器之间跳转,可以让光标快速跳转到上一个工具窗口

菜单栏: Window -> Active Tool Window -> Jump to Last Tool Window
快捷键: fn + F12

最大化工具窗口

菜单栏: Window -> Active Tool Window -> Maximize tool Window
快捷键: shift + command + “‘”

恢复最大化工具窗口

原来的【Maximize tool Window】变为【Restore tool window size】

逐渐调整工具窗口大小

最快的调整方式使用鼠标长按托拖动

激活工具窗口 -> 菜单栏 -> Window -> Active Tool Window -> Resize -> Stretch to Top/Bottom/Right/Left

移动工具窗口的位置

右击工具窗口 -> Move To -> 选择要移动到的位置

工具窗口的查看模式

停驻和浮动模式

停靠和脱开模式

固定和非固定模式

分离模式

在同一个工具条上最多可以同时显示两个工具窗口

作为标签显示

编辑器标签设置

任一时刻打开一个文件都会以标签页的形式在编辑窗口出现

设置编辑器标签: 偏好设置 -> Editor -> Editor Tabs

快速切换编辑器标签

上一个/下一个标签

前提条件: 光标在编辑器中
菜单栏: Window -> Editor Tabs -> Select Next Tab 或 Select Previous Tab
快捷键: shift + command + ←/→

快速切换已打开的文件

快捷键control + tab 调出switcher

快速切换工具窗口

使用快捷键control + tab 调出switcher,默认选中的是文件,如果想默认选中的是工具,则使用快捷键control + shift + tab。长按control + shift,通过按tab来切换工具。

关闭编辑器标签

对标签右击,来选择性关闭标签页

管理编辑器标签

重新打开关闭的标签

操作步骤: 右击编辑器标签 -> Reopen Closed Tab -> 最后被关闭的标签会被打开

在最后打开新标签

操作步骤: 右击编辑器标签 -> 选中Open New Tabs At The End -> 再打开新的文件标签时就会在已打开的标签最后打开

通过文件名排序标签

操作步骤: 右击编辑器标签 -> Sort Tabs By Filename

标签显示位置

默认标签是显示在编辑器窗口最上面,我么也可以自定义显示的位置

操作步骤: 右击标签 -> Tabs Placement -> 选择显示位置

拆分编辑器窗口

拆分一个标签窗口

  • 右击标签 -> Split Vertically/Horizontal(垂直拆分/水平拆分)
  • 右击标签 -> Move Right 或 Move Down。相当于水平拆分和垂直拆分,不同点是Move会把当前的标签页移到拆分的一边,而Split不会

改变拆分窗口的摆放方式

操作步骤: 右击标签 -> Change Splitter Orientation

改变拆分窗口的摆放方式

标签组

Android Studio可以通过将标签页分组的方式支持多文件同时编辑,组的数量没有限制

操作步骤: 右击标签 -> Move to Opposite Group。如果想把当前文件在另外一个标签组打开可以选择Open In Opposite Group

撤销拆分

操作步骤: 右击标签 -> Unsplit 或 Unsplit All

多个项目之前切换

打开后面一个项目

操作步骤: 菜单栏 -> Window -> Next Project Window

打开前面一个项目

操作步骤: 菜单栏 -> Window -> Previous Project Window

选择某个已打开项目

菜单 -> Window 子菜单来完成

偏好设置

外观与行为

设置工具提示的延迟时间

当我们把鼠标停在工具栏上的工具或编辑器中的项目会出现提示

操作步骤: 偏好设置 -> Appearance & Behavior -> Appearance -> 滑动设置【Tooltip initial delay】

设置在状态栏显示内存状态

如果想实时显示内存的使用情况

操作步骤: 偏好设置 -> Appearance & Behavior -> Appearance -> 勾选【Show memory indicator】

对菜单选项和工具栏上的工具进行增删改

操作步骤: 偏好设置 -> Appearance & Behavior -> Menus and Toolbars -> 选择需要操作的选项

系统设置

设置启动Android Studio时是否自动打开项目

当我们打开Android Stuio时默认会打开上次最后关闭的项目,如果不想自动打开上次关闭的项目

操作步骤: 偏好设置 -> Appearance & Behavior -> System Settings -> 不勾选【Reopen last project on startup】

设置退出Android Studio时是否弹出确认提示

当我们关闭Android Studio时默认会弹出确认提示,如果不想每次都确认

操作步骤: 偏好设置 -> Appearance & Behavior -> System Settings -> 不勾选【Confirm application exit】

设置打开一个项目时的打开方式

当我们打开一个新项目时默认会弹出一个确认提示,让我们确认是在新窗口打开还是在当前窗口打开。

操作步骤: 偏好设置 -> Appearance & Behavior -> System Settings -> 设置Project Opening

  • Open project in new window: 在一个新窗口打开项目
  • Open project in the same window: 在同一个窗口打开项目
  • Confirm window to open project in: 弹出确认对话框,可选择在新窗口或原窗口打开

设置文件定期自动保存

操作步骤: 偏好设置 -> Appearance & Behavior -> System Settings -> 勾选【Save files automatically if application is idle for [] sec】

设置编辑窗口失活时文件自动保存

编辑窗口失活的意思是可理解为从编辑窗口切换到其他窗口。

操作步骤: 偏好设置 -> Appearance & Behavior -> System Settings -> 勾选【Save files on frame deactivation】

设置密码存储策略

操作步骤: 偏好设置 -> Appearance & Behavior -> System Settings -> Passwords -> 设置Password storage policy

  • Do not remember passwords: 不记住密码,每次都要输入密码
  • Remember passwords until the application is closed: 记住密码,直到应用程序被关闭
  • Save on disk with master password protection: 密码保存到磁盘,使用master password来保护

设置是否让Google统计使用信息

操作步骤: 偏好设置 -> Appearance & Behavior -> System Settings -> Usage Statistics -> Send usage statistics to Google

此功能统计Android Studio的使用情况(功能,资源的使用情况和插件的配置信息),然后发送给Google

键盘映射

在Android Studio中如何使用Eclipse的快捷键

在Keymaps中选择

如何自定义一份属于自己的keymap

复制一份keymap,在复制的keymap中修改

编辑器常规设置

设置单击编辑器光标定位在一行的结尾或定位在单击的位置

操作步骤: 偏好设置 -> Editor -> General -> Virtual Space -> 勾选【Allow placement of caret after end of line】

  • 勾选,在空白位置单击,光标会定位在一行的结尾
  • 不勾选,在空白位置单击,光标会定位在单击的地方

设置鼠标悬停在元素上会显示文档提示

如果想让鼠标悬停在某个变量、类或方法上直接显示它的文档。

操作步骤: 偏好设置 -> Editor -> General -> Other -> 勾选【Show quick documentation on mouse move】

设置是否自动换行

当一行的内容超过编辑器的宽度时,它会自动换行。

操作步骤: 偏好设置 -> Editor -> General -> 查看Soft Wraps -> 勾选【Use soft wraps in editor】

让换行符一直显示

如果向现实所有的换行符,就不要勾选【show soft wrap indicators for current line only】

设置换行后的缩进字符

如果想自定义换行后第二行的缩进,可以勾选【Use original line`s indent for wrapped parts】 -> 设置 Additional shift

设置使用command + 鼠标控制代码的缩放

操作步骤: 偏好设置 -> Editor -> General -> 勾选【Change font size with Command + Mouse Wheel】

开启使用驼峰单词

移动光标或选择单词时可以识别驼峰

操作步骤: 偏好设置 -> Editor -> General -> Smart Keys -> 勾选【Use “CamelHumps” words】

关闭单词拼写检查

操作步骤: 偏好设置 -> Editor -> Inspections -> 取消勾选【Spelling】

设置代码折叠规则

自定义代码折叠的规则

操作步骤: 偏好设置 -> Editor -> General -> Code Folding

设置自动导入

设置粘贴时自动导入包

从其他地方复制一段代码粘贴到Android Studio文件中时,默认Android Studio会询问你是否导入引用的包。

操作步骤: 偏好设置 -> Editor -> General -> Auto Import -> Insert imports on paste

  • All: 全部自动导入
  • Ask: 询问是否自动导入
  • None: 不自动导入

设置自动导入需要的包

操作步骤: 偏好设置 -> Editor -> General -> Auto Import -> 勾选【Optimize imports on the fly】 和 【Add unambiguous imports on the fly】

设置是否弹出导入提示

当你输入的类的声明没有被导入时,会弹出一个导入提示

操作步骤: 偏好设置 -> Editor -> General -> Auto Import -> Show import popup

编辑器外观

设置编辑器一直显示行号

操作步骤: 偏好设置 -> Editor -> General -> Appearance -> 勾选【Show line number】

设置编辑器显示方法分隔符

如果你想让每个方法区分得更明显,可以显示方法分隔符

操作步骤: 偏好设置 -> Editor -> General -> Appearance -> 勾选【Show method separators】

设置编辑器显示空格

操作步骤: 偏好设置 -> Editor -> General -> Appearance -> 勾选【Show whitespace】

设置编辑器显示缩进向导

操作步骤: 偏好设置 -> Editor -> General -> Appearance -> 勾选【Show vertical indent guides】

代码补全

设置自动补全时是否区分大小写

操作步骤: 偏好设置 -> Editor -> General -> Code Completion

Case sensitive completion:

  • First letter: 区分首字母大小写
  • All: 区分全部大小写
  • None: 不区分大小写

加快自动弹出代码补全提示的速度

操作步骤: 偏好设置 -> Editor -> General -> Code Completion -> 将【Autopopup decumentation in】设置为0,在Parameter Info将【Autopopup in】中设置为0

关闭自动弹出代码补全提示

操作步骤: 偏好设置 -> Editor -> General -> Code Completion -> 不勾选【Autopopup decumentation in】,在Parameter Info不勾选【Autopopup in】

设置查看方法参数信息的时候显示方法签名

操作步骤: 偏好设置 -> Editor -> General -> Code Completion -> Show full signatures

文件标签

设置用星号标记修改过的文件标签

操作步骤: 偏好设置 -> Editor -> General -> Editor Tabs -> 勾选【Mark modified tabs with asterisk】

设置打开的文件标签可以多行显示

操作步骤: 偏好设置 -> Editor -> General -> Editor Tabs -> 取消勾选【Show tabs in single row】,即可让标签不隐藏,并且全部显示出来

设置文件标签的显示位置

操作步骤: 偏好设置 -> Editor -> General -> Editor Tabs -> Placement -> 选择显示位置

设置文件标签超过一定数量时的关闭规则

操作步骤: 偏好设置 -> Editor -> General -> Editor Tabs -> Tab Closing Policy -> 配置关闭规则

  • 打开文件标签限制数量
  • 当打开的文件标签超过10个时关闭使用频率较少的
  • 当关闭标签时,激活左边相邻的标签

编辑器颜色

设置是否显示条标和条标的显示颜色

当编辑器中有报错的时候,在右边框上会显示一个红色的条,即条标

操作步骤: 偏好设置 -> Editor -> Colors & Fonts -> General -> 勾选【Error stripe mark】

设置控制台的颜色

操作步骤: 偏好设置 -> Editor -> Colors & Fonts -> Console Colors

设置控制台的字体

操作步骤: 偏好设置 -> Editor -> Colors & Fonts -> Console Font

自定义代码的颜色

操作步骤: 偏好设置 -> Editor -> Colors & Fonts -> Java -> 新建一个Scheme

代码风格

设置Java注释按缩进显示

操作步骤: 偏好设置 -> Editor -> Code Style -> Java -> Wrapping and Braces -> Keep when reformatting -> 取消勾选【Comment at first column】

设置语句不要都显示在一行

操作步骤: 偏好设置 -> Editor -> Code Style -> Java -> Wrapping and Braces -> Keep when reformatting -> 取消勾选【Control statement in one line】

设置Java简单的类合并为一行

Android Studio中的默认设置是代码格式化后不会把简单的类合并为一行

操作步骤: 偏好设置 -> Editor -> Code Style -> Java -> Wrapping and Braces -> Keep when reformatting -> 勾选【Simple classes in one line】

设置Java字段和变量列对齐

Android Studio中默认是没有列对齐的。

操作步骤: 偏好设置 -> Editor -> Code Style -> Java -> Wrapping and Braces -> Group declarations -> 勾选【Align fields in columns】 和 【Align variables in columns】

设置自动生成字段名称时添加前缀

默认自动生成字段名称是不会有任何前缀的。不过在Android Studio中提供了自动添加自定义前缀或后缀的功能,以便统一编码规范。

操作步骤: 偏好设置 -> Editor -> Code Style -> Java -> Code Generation -> 输入需要添加的前缀或后缀

文件和代码模板

设置新建文件的注释模板

当我们新建一个文件时会自动插入这个注释

操作步骤: 偏好设置 -> Editor -> File and Code Templates -> Includes -> File Header -> 输入自定义的注释模板

模板中内置的变量

  • ¥{PACKAGE_NAME}: 包名
  • ¥{USER}: 系统的登录名
  • ¥{DATE}: 系统日期
  • ¥{TIME}: 系统时间
  • ¥{YEAR}: 年份
  • ¥{MONTH}: 月份
  • ¥{MONTH_NAME_SHORT}: 月份的前三个字符
  • ¥{MONTH_NAME_FULL}: 月份的全名
  • ¥{DAY}: 天
  • ¥{HOUR}: 时
  • ¥{MINUTE}: 分钟
  • ¥{PROJECT_NAME}: 项目名

设置新建类文件模板

在类文件中可以引用头文件的注释模板
如果我们想在新建类文件时自动添加某段代码
加了一段代码以后我们再新建一个类文件
每次新建类文件时,这段代码模板都会被应用,效率会提高很多

设置IDE和项目的编码

操作步骤: 偏好设置 -> Editor -> File Encodings

为了防止中文乱码,一般都会勾选Transparent native-to-ascii conversion

对动态模板进行增删改查

Android Studio中提供了快速插入常用代码的功能Live Templates

操作步骤: 偏好设置 -> Editor -> Live Templates -> 对动态模板进行增删改查

  • 查看动态模板分组
  • 新增/删除/复制一个模板
  • 查看具体模板

设置展开代码的按键

当我们要插入动态模板的时候,输完代码片段的缩写以后默认按Tab键就可以展开diamante。当然也可以自定义展开按键。

给一个文件类型添加匹配规则

操作步骤: 偏好设置 -> Editor -> File Types -> 在Recognized File Types列表中选中一个文件类型 -> 在Registered Patterns中单击+,添加一个文件类型的匹配规则

添加一个自定义的文件类型

如果Android Studio可识别的文件类型不能满足需求,可以自定义一个。Android Studio中支持自定义文件类型,可以对这个文件类型设置一些特性,如关键字、注释、高亮显示,还可以设置一些模板,提高操作效率。

操作步骤: 偏好设置 -> Editor -> File Types -> 在Recognized File Types中单击+ -> 设置新的文件类型

设置忽略某类文件或文件夹

如果我们不想让某个文件或某类型的文件在编辑器中显示,就可以将其忽略

操作步骤: 偏好设置 -> Editor -> File Types -> 在Ignore files and folders中添加文件类型

插件

Android Studio是基于IntelliJ IDEA开发的,自然继承了IntelliJ IDEA优秀的插件系统。我们可以通过安装插件来扩展Android Studio的功能,这会极大地方便我们日常的开发工作。

操作步骤: 偏好设置 -> Plugins

  • All plugins: 所有插件
  • Enabled: 所有已启用的插件
  • Disabled: 所有已禁用的插件
  • Bundled: 所有IDEA自带的插件
  • Custom: 所有我们自己安装的插件

安装插件

Install JetBrains plugins(安装JetBrains插件)

单击【Install JetBrains plugin】,然后弹出插件列表

  • 插件排序: 插件列表默认按name排序,同时允许添加排序条件(多选)
  • 插件分类
  • 安装插件
    • 选中插件 -> 在插件简介中单击【Install】按钮
    • 下载插件
    • 下载完成后重启Android Studio,插件安装成功
  • 设置代理
Browse Repositories(浏览插件仓库)

我们想查看插件仓库中所有的插件,可以单击【Browse repositories】,然后弹出插件列表,这里的操作跟安装JetBrains插件是一样的。

Install plugin from disk(从本地磁盘安装插件)

禁用插件

Android Studio中默认安装了一些根本用不到的插件,可以禁用这些插件

操作步骤: 偏好设置 -> Plugins -> 取消勾选想禁用的插件 -> 重启 -> 生效

卸载插件

操作步骤: 偏好设置 -> Plugins -> 选中插件 -> Uninstall

常用插件

编辑器插件
插件名 描述
Key promoter 用于生成快捷键提示
CodeGlance 用于生成代码缩略图,方便快速定位
Eclipse Code Formatter 用于使用Eclipse的代码格式化风格
BashSupport 用于支持Bash语言
IdeaVim 用于支持VIM
Grep Console 用于自定义控制台输出颜色
Maven Helper 用于查看Maven依赖树
代码工具插件
插件名 描述
String Manipulation 用于快速切换驼峰式命名和下划线命名
GsonFormat 用于快速格式化json数据,自动生成实体类参数
Android ButterKnife Zelezny 用于快速添加Butterknife注解
Android Drawable Importer 用于快速导入缩放图标到Android项目中
Android Parcelable code generator 用于快速实现Parcelable 接口
Android Postfix completion 用于根据后缀快速完成代码
AndroidAccessors 用于快速实现get和set方法的插件
Android Postfix Completion 用于快速编写Toast,Log,isEmpty,FindView等代码
JavaDoc 用于快速生成Java注释,可自定义模板
检查工具插件
插件名 描述
CheckStyle-IDEA 用于检查Java源代码是否符合编码规则
FindBugs-IDEA 用于检查Java代码中潜在的问题
MetricsReloaded 用于检查代码复杂度
其他常用插件
插件名 描述
Android WiFi Adb 用于通过WIFI连接ADB,不需要root
ADB Idea 用于在Android Studio中可视化使用ADB命令
RESTClient 用于测试RESTful web services
JSONOnlineViewer 用于直接在Android Studio中调试接口数据
jimu Mirror 用于在真机上快速测试布局
Codota 用于搜索Android代码实例
Genymotion 用于使用Genymotion运行和调试应用

编译和构建

设置Android Studio的内存参数

操作步骤: 菜单栏 -> Help -> Edit Custom VM Options

设置自动编译项目

操作步骤: 偏好设置 -> Build,Execution,Deployment -> Build Tools -> Compiler -> 勾选【Make project automatically】

设置并行编译

想提升编译速度,可开启并行编译,这样会比单线程一次编译快很多。

操作步骤: 偏好设置 -> Build,Execution,Deployment -> Build Tools -> Compiler -> 勾选【Compile independent modules in parallel】

调整编译内存大小

操作步骤: 偏好设置 -> Build,Execution,Deployment -> Build Tools -> Compiler -> 在【Command-line Options】中输入调整的内存参数

Gradle离线工作

每次打开项目或者导入项目,Android Studio总会联网检查依赖的文件是否已经下载,是否有新版本,这样会导致速度很慢。如果我们清楚依赖的文件已经下载且不想更新到最新版本,可以使用Gradle离线工作模式

操作步骤: 偏好设置 -> Build,Execution,Deployment -> Build Tools -> Gradle -> 勾选【Offline work】

如果使用离线工作模式可能导致项目报错,这时可以单击同步项目: Sync Project with Gradle Files

参考资料

《精通Android Studio》