Android Studio for Experts:Edit & Debug & Test

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

我只總結了前面五分多鐘講的快捷方式。后面的高級技巧我還在學習中,坑慢慢填。

已將 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 優化調試,有空再說,囧

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,882評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,208評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,746評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,666評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,477評論 6 407
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,960評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,047評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,200評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,726評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,617評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,807評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,327評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,049評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,425評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,674評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,432評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,769評論 2 372

推薦閱讀更多精彩內容