原来我根本不会用Android Studio

背景

最近在工作中解锁了一些使用Android Studio的技巧,在这里记录一下。

1. 为什么明明我的电脑剩余那么多内存,用Android Studio打开多个工程后就开始卡顿了呢?

有一次在使用Android stuido的时候发现会卡顿无比,滚动鼠标都卡,但我的机器明明配置很高,系统剩余的内存也很多啊。

于是,打开内存指示器,查看Android Studio的内存使用情况:

打开设置 -> Appearance -> Window Options -> Show memory indicator

勾选了Show memory indicator 之后,就可以在Android Studio的右下角看到内存指示器了:

双击指示器可以手动进行GC操作。这里显示的就是Android Studio占用的内存大小(左)和分配给Android Studio使用的最大内存(右)。如果发现占用内存基本上快要等于分配的最大内存的时候,说明需要分配更多的内存给Android Studio了。当时我的机器显示的是1020/1024M,这应该就是其默认分配的内存大小,基本上分配的内存已经快要用完了,这也就是为啥明明电脑内存剩余很多,但是Android Studio却很卡顿的原因。

于是,通过下面步骤来提高分配给Android的内存:

打开菜单Help->Edit Custom VM Options,这时,会在新窗口打开一个studo.vmoptions文件(如果之前没有,会新创建一个),在打开的文件中输入下面代码配置虚拟机堆栈的最大分配内存:

1
-Xmx4096m

这里可以根据自己机器的内存大小,对Android Studio进行配置,配置完成后,重启Android Studio,看到右下角的内存指示器显示的最大分配内存已经发生了变化,就说明生效了。

2. 提高生产效率的快捷键

无意中,在Android Studi的Help菜单中发现了一个叫Productivity Guide的窗口,里面列出的一些快捷键都是跟效率有关的:

例如有我们常用的自动补全(Basic code completion),还有Complete Statement这种神奇的功能,再也不用移动箭头和手动加分号了!!点击功能名字下方会列出快捷键和说明,建议把这里面的功能过一遍,相信会很有帮助。

列几个我用的非常上瘾的在下面:

  • Quick Definition Lookup: 将定义以弹窗的形式打开,而不跳转到定义处,快捷键:Ctrl+Shift+I
  • Extract Method/Function: 将一段代码抽出成一个函数,快捷键: Ctrl+Alt+M
  • Generate菜单:Alt+Insert
  • Introduce Constant:使某个量变成常量Ctrl+Alt+C
  • 继承方法 Ctrl + O
  • 实现方法 Ctrl + I
  • 查看参数信息 Ctrl + P
  • Surround With Ctrl+Alt+T
  • Extend select Ctrl+W
  • 当前行/函数/块上下移动 Shift+Meta+Up/Down

3. 调试的技巧

首先,日常调试中最常用的调试方法就是打断点和加Log了,AdroidStudro中的断点功能非常强大,在断点上点右键,在弹出的窗口中点More或者直接点击Debug标签中的断点列表可以对断点进行更有用的设置,下面来详细说下这个断点设置页面:

  • Suspend + Evaluate and log:调试的时候需要在某处添加一个Log,这时候如果用Log.e(xx,xxx)加入需要重新编译并安装到手机上才能查看。我们可以取消勾选Suspend,这样程序运行到断点处并不会停下,在Evaluate and log中写好想打印的log,运行到断点处在Console中就会打出Log信息了。
  • Evaluate and log:这个功能与Evaluate功能相同,可以在调试时,对一个实例进行操作,例如读取某个对象的值,修改某个对象的值等。这里的Evaluate and log的区别就是会将操作的结果打印到Console。
  • 使用Condition给断点添加条件。在Condition中输入一个返回值为Bollean的语句,那么只有返回true的时候,断点才会生效。

通过上面的工具可以更方便的了解程序的运行状态。当然,这还是避免不了我们有时会设置了错误的断点位置,导致:

这时,我们可以利用调用栈,从下往上的查看调用顺序,调试时,调用栈会在Debug标签中的Debugger->Frames中显示:

在上面的调用栈中,背景底色是黄色的表示是来自SDK的调用,背景是正常的Android的主题色表示的是来自你代码的调用。

调用栈非常有用,举个例子:有一次在调试时,点击了界面上一个按钮后Activity就关掉了,但是代码中却无论怎么找都找不到对这个按钮的监听,没有setOnClickListener,那点击后是怎么执行的呢?就在我愁眉不展的时候,老司机出现了,告诉我既然肯定会被Activity被Finish掉了,那在Finish函数里加断点,查看调用栈就可以顺藤摸瓜的找到按钮的点击事件处理代码。果然就找到了,原来按钮的监听定义在了Base类中。

4. 定位当前页面的源码位置

阅读新项目代码时,领导让我修改页面上一个控件,这时首先要做的就是代码中找到这个页面,于是,菜鸟的我我就开始从MainActivity开始顺着代码往下捋着找,发现要找到一个控件要找半天,有时候甚至半天都找不到。于是,我总结了两条寻找Activity或者某个View的方法:

  1. 在Androd Studio中点击Tools->Layout Inspector,选择当前进程后就会弹出当前任务栈中所有的Activity的列表,这时候在源码中搜索(Ctrl+Shift+F)名字就可以Activity的源码位置。如果需要找页面上某一个控件View,可以继续点击Activity,在打开的节面中选中要寻找的控件,查看其id,再根据id搜索就可以找到View了。但是这个方法并不总是那么好用,有时任务栈中只有一个Activity时,就不会出现Activity列表,直接打开布局的Capture文件了。
  2. 另一种方法跟Android Studio无关,是通过Android系统自带的dumpsys命令获取任务栈及Activity信息,在命令行中输入下面语句:
1
adb shell dumpsys activity activities | grep -A 20 "A=com.xxxx.xxxx"

这样就能得到当前的Activity信息了:

把这条命设置别名,放到bashrc文件中,就可以在在命令行里直接使用了:

1
2
3
# 放到bashrc文件中
export package_name="A=xxx.xxx.xxx" # 写好包名
alias whatisthispage="adb shell dumpsys activity activities | grep -A 20 "

运行时,直接运行whatisthispage $package_name就可以了。

Author

calvinche

Posted on

2018-10-28

Licensed under

CC BY-NC-SA 4.0

Your browser is out-of-date!

Update your browser to view this website correctly.&npsb;Update my browser now

×