×

Android Studio for Experts:Edit & Debug & Test

96
iamwent
2015.11.26 08:31* 字数 2385

冒死总结!有些地方不知道怎么描述,自己动手感受一番吧。

我只总结了前面五分多钟讲的快捷方式。后面的高级技巧我还在学习中,坑慢慢填。

已将 Tor Norbye 演讲的编辑技巧补充完。

再来一波更新duang还有最后的 NDK 调试和 CPU 优化调试没总结,有空再说,囧

补充一点:我的测试环境是 win7 + as 1.5,有错误的地方还请指出,谢谢。

昨天@陈启超同学发了 Android Studio for Experts (Android Dev Summit 2015) 的视频,我也跟着学习了一下。这个视频讲的非常好!做点小结,分享交流。

Completion

  1. 使用 Tab 补全,会自动编辑光标之后的字符串,如下,你在光标处键入 c 然后选择 contentEquals 然后回车,magic!

    c.png

  2. 使用 ctrl + shift + space 智能补全,比如下图,按下组合键,magic!可以按两次哦!


    c2.png
  3. 补充一个,尝试在编辑器中输入:new Bitmap().var

Selection

  1. ctrl+ w 选中,继续操作会扩大选中范围,相反的操作是 ctrl + shift + w

  2. 选中后可以使用 Extra 快捷键重构为变量、方法等,这个可以在 Refactor -> Extra 下看到。
    ctrl+ alt+ v:变量
    ctrl+ alt+ c:常量
    ctrl+ alt+ f:域值
    ctrl+ alt+ p:参数
    ctrl+ alt+ m:方法

  3. 这里我有一个快捷键没有听出来,就是从构造函数提取 parameters 为 fields,

public static class Init {
    public Init(String first, boolean second, int third) {
    }
}

感谢评论区的 @Will92Wang 指出,这个快捷键就是 alt + enter ,这是一个很强大的组合键。

c.png

LiveTemplates

这个内容极度丰富,我以前发过微博,可以在 Setting -> Editor -> Live Templates 下查看。举几个例子:

  1. foriforeach,在需要使用 for 循环时,尝试输入这两种 for 试试;

  2. 你还可以在数据集合变量后输入 .for,例如 list.for ,这时候你看一下补全,会列出三种 for 循环形式让你选择;

  3. logt, logd, logm,在方法外输入 logt,在方法内输入 logd 试试;

  4. 另外还有 fbc, gone, iter 等等,感兴趣的话可以在 Setting -> Editor -> Live Templates 下看看。


接下来可以说是牛哄哄的技巧了,同时也说明 Android Studio 真是强大!

Replace Structurally

这里就不得不贴上很多代码了。比如以下资源文件,现在你想去掉所有的 translation_description ,技巧是使用 双击 shift 或者 ctrl + shift + a 调出搜索框然后搜索并选择 replace structurally ,编辑规则,选择 find,然后就可以十分便捷的批量修改了。

<resources>
    <string name="a_fragment" translation_description="false">Hello blank fragment</string>
    <string name="s_fragment" translation_description="false">Hello blank fragment</string>
    <string name="d_fragment" translation_description="false">Hello blank fragment</string>
    <string name="f_fragment" translation_description="false">Hello blank fragment</string>
</resources>
rs.png

另外你还可以把这个加入设置中,由编辑器自动检查,不符合规则的代码就会变黄,alt + enter 组合键进行修改。

ssi.png

这个方法对 java 源码同样适用,只需要修改 file type。

Search Structurally

这个和 Replace Structurally 大同小异,不再赘述,请自行尝试一下吧,_

Designtime Attributes

在写好布局文件后,我们可能想要直接看一下 preview 效果,但是不想在编译时还预设这些属性和值,这个时候可以使用 tools 这个强大的工具。
首先我们要在布局文件中声明 xmlns:tools="http://schemas.android.com/tools",放在最外层的 layout 就好。

<android.support.design.widget.CoordinatorLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    ...

使用起来跟 xmlns:android 没有什么差别。

<TextView
    android:id="@+id/tv"
    android:text="Hello World!"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    tools:visibility="visible"
    tools:text="tools"
    />

这里面比较逆天的是 tools:listitem ,看下面这段代码!

<GridView
    android:id="@android:id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:numColumns="4"
    tools:listitem="@android:layout/simple_list_item_2" />

猜到了吗?它可以直接让我们 preview GridView的效果!

tools.png

如果你够细心的话一定会发现异常:那就是那个ToolBar 和 FAB 哪来的?!因为有 tools:showIn。这个属性声明在最顶层的 layout,值是 include 了本布局的一个父布局,它使得预览本布局时同时会渲染该父布局。

更多的 tools attributes 可以访问官方文档 Android Tools Project Site: Tools Attributes

Private Resources

Android studio 默认 library 的所有 resource 为 public,如果想保护某些 resources 不被外部访问,可以创建 res/values/public.xml,因为 public 是关键词,所以需要用 new file 的方式创建。至少要添加一行,未添加的则视为 private。

<resources>
    <public name="mylib_app_name" type="string"/>
</resources>

参考:Public and Private Resources

另外,如果在 library 的 build.gradle 中添加 resourcePrefix ,则所有资源必须以此 prefix 开头,否则会报错。

android {
    ...

    buildTypes {
        ...
    }
    
    resourcePrefix 'my_prefix_'
}

Resource Shrinking

这一段讲解了一个减少未使用的资源文件的技巧,可以参考官方文档:Android Tools Project Site: Resource Shrinking ,我就不做二次消化了。

扩展阅读

  1. Android Studio Tips and Tricks

  2. IntelliJ IDEA Default Keymap

  3. Android Studio使用技巧系列教程


这是 Siva Velusamy 的演讲,这小伙的口音太重了!

Debug

Analyze Stacktrace

这个用于我们在分析 bug report 时很有用,使得它可以被点击然后定位到出错代码位置。复制它,然后打开 Analyze Stacktrace Dialog,入口为 Analyze → Analyze Stacktrace 或者搜索 analyze stacktrace

测试用 bug report:

Process: com.iamwent.androidart, PID: 28178
java.lang.RuntimeException: Unable to resume activity {com.iamwent.androidart/com.iamwent.androidart.MainActivity}: java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2999)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3030)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413)
    at android.app.ActivityThread.access$800(ActivityThread.java:144)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5277)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:919)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:714)
Caused by: java.lang.ArrayIndexOutOfBoundsException: length=3; index=3
    at com.iamwent.androidart.MainActivity.fromByteArray(MainActivity.java:32)
    at com.iamwent.androidart.MainActivity.onResume(MainActivity.java:28)
    at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1244)
    at android.app.Activity.performResume(Activity.java:6069)
    at android.app.ActivityThread.performResumeActivity(ActivityThread.java:2988)
    at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3030) 
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2413) 
    at android.app.ActivityThread.access$800(ActivityThread.java:144) 
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1321) 
    at android.os.Handler.dispatchMessage(Handler.java:102)

我测试中发现,Analyze Stacktrace 好像分析的是当前复制到剪贴板的内容,所以先 crtl + c 一下。

as.png

对于第一个红框,它不是可选状态的,Siva 说的是有可能因为被混淆过了,但是我的 demo 并没有混淆,有待研究吧。然后,这就像我们在 Android Monitor 中抓到的 log 一样,可以直接跳转到出错代码处了。另外,可以点开左下的 Show files modification info,它会显示文件修改记录,让 Peter 现形。

st.png

View As

这个技巧讲的是 debug 的时候,在想要查看的 变量上面右键 -> View as ,选择合适的数据类型,可以更直观的看到该数据的状态:

vah.png

Customize Data View

我们还可以定制显示形式,这对于查看比较复杂的数据很有帮助,方法如上,右键选择 Customize Data View,然后如下图般做一些配置,就可以更直观的看到我们关注的信息了。我修改了渲染一个节点时的表达式,所以显示的是 5 。 Siva 演讲的时候修改的是 expanding a node 的表达式,这是错的,默认就好。

cdv.png

Evaluate Expression

另外还可以用 Evaluate Expression 来直接观察,它会跟随变化,也是右击进入,或者 alt + f8 。


e.png

Break Point

可以在断点上右击,给断点加上生效条件;或者设置断点不是 suspend,而是打印一些信息,ctrl + shift + f8

bp.png

接下来是 Alex Ruiz -- 我还以为 Ruiz 是瑞兹大魔王呢...

Android 导入 jar/aar module

这个比较简单,如图,new module,然后选择 import .JAR/.AAR project,然后一步步操作。


import.png

很值得注意的一点是,所有演讲的工程师都喜欢用 double shift + 关键字 的方式来完成作业,像上面的新建 module,他们会 double shift 调出对话框搜索 new module 的方式。十分高效!

new module 导入进来了,你还要做点配置。假设新 module 叫 smart,在 app/build.gradle 的 dependencies 中加入这一行

compile project(':smart')

另外根目录下的 settings.gradle 中也要 include 进去,大概长这样

include ':app', ':smart'

事实上我们完全可以用 Android Studio 自带的工程管理功能自动完成这一任务,直接从工具栏打开 Project Structure,或者 ctrl + alt + shift + s 组合键,操作如下:

project.png

Run Any Gradle Task

这个 tip 很方便,如下图,打开 gradle project,很多 task —— 如果没有点击同步一下,双击就可以运行。

task.png

Build Variants

首先一个技巧是通过 Build Variants 来选择运行时的任务,做过多渠道打包应该遇到过。


variants.png

另外一个技巧是,重构方法名或者类名时,让 Android Instrumentation Tests 和 Unit Tests 都能够随之一起被重构(默认只有一个是 active 的,project 窗口会高亮选中的 Tests),这需要打开 Android Studio 的一个选项,如下图。这个可能是 2.0 的功能,我在 1.5 上未发现该设置选项。

test.png

关于两种测试的最大区别从名字上就看的出来,Unit Tests 是 local tests,直接运行在电脑的 JVM 中,而则需要运行在 Android device 或者 emulator 上。更多可参考官方文档:Building Effective Unit Tests


这是 Michal Bendowski 的演讲

Create Test Classes

很简单,光标移动到被测试类名上,alt + enter,选择 create test,即可创建,使用组合键 ctrl + shift + t 可以在二者之间来回切换,当然,它还可以用于创建测试类。

ct.png

在 1.5 上创建测试类的时候和 build variants 中的选择有关,但是 Michal 演示的时候不需要担心这个,而且重构的时候也能同时被一起重构,应该是 2.0 的新功能。

后面还有 NDK 调试和 CPU 优化调试,有空再说,囧

Android
Web note ad 1