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