Android Studio for Experts:Edit & Debug & Test

冒死總結(jié)陪汽!有些地方不知道怎么描述凤价,自己動(dòng)手感受一番吧。

我只總結(jié)了前面五分多鐘講的快捷方式酗捌。后面的高級(jí)技巧我還在學(xué)習(xí)中呢诬,坑慢慢填涌哲。

已將 Tor Norbye 演講的編輯技巧補(bǔ)充完。

再來一波更新duang還有最后的 NDK 調(diào)試和 CPU 優(yōu)化調(diào)試沒總結(jié)尚镰,有空再說阀圾,囧

補(bǔ)充一點(diǎn):我的測(cè)試環(huán)境是 win7 + as 1.5,有錯(cuò)誤的地方還請(qǐng)指出狗唉,謝謝初烘。

昨天@陳啟超同學(xué)發(fā)了 Android Studio for Experts (Android Dev Summit 2015) 的視頻,我也跟著學(xué)習(xí)了一下分俯。這個(gè)視頻講的非常好肾筐!做點(diǎn)小結(jié),分享交流缸剪。

Completion

  1. 使用 Tab 補(bǔ)全吗铐,會(huì)自動(dòng)編輯光標(biāo)之后的字符串,如下橄登,你在光標(biāo)處鍵入 c 然后選擇 contentEquals 然后回車抓歼,magic!

    c.png

  2. 使用 ctrl + shift + space 智能補(bǔ)全拢锹,比如下圖谣妻,按下組合鍵,magic卒稳!可以按兩次哦蹋半!


    c2.png
  3. 補(bǔ)充一個(gè),嘗試在編輯器中輸入:new Bitmap().var

Selection

  1. ctrl+ w 選中充坑,繼續(xù)操作會(huì)擴(kuò)大選中范圍减江,相反的操作是 ctrl + shift + w

  2. 選中后可以使用 Extra 快捷鍵重構(gòu)為變量、方法等捻爷,這個(gè)可以在 Refactor -> Extra 下看到辈灼。
    ctrl+ alt+ v:變量
    ctrl+ alt+ c:常量
    ctrl+ alt+ f:域值
    ctrl+ alt+ p:參數(shù)
    ctrl+ alt+ m:方法

  3. 這里我有一個(gè)快捷鍵沒有聽出來,就是從構(gòu)造函數(shù)提取 parameters 為 fields也榄,

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

感謝評(píng)論區(qū)的 @Will92Wang 指出巡莹,這個(gè)快捷鍵就是 alt + enter ,這是一個(gè)很強(qiáng)大的組合鍵甜紫。

c.png

LiveTemplates

這個(gè)內(nèi)容極度豐富降宅,我以前發(fā)過微博,可以在 Setting -> Editor -> Live Templates 下查看囚霸。舉幾個(gè)例子:

  1. foriforeach腰根,在需要使用 for 循環(huán)時(shí),嘗試輸入這兩種 for 試試拓型;

  2. 你還可以在數(shù)據(jù)集合變量后輸入 .for额嘿,例如 list.for 瘸恼,這時(shí)候你看一下補(bǔ)全,會(huì)列出三種 for 循環(huán)形式讓你選擇岩睁;

  3. logt, logd, logm钞脂,在方法外輸入 logt,在方法內(nèi)輸入 logd 試試捕儒;

  4. 另外還有 fbc, gone, iter 等等冰啃,感興趣的話可以在 Setting -> Editor -> Live Templates 下看看。


接下來可以說是牛哄哄的技巧了刘莹,同時(shí)也說明 Android Studio 真是強(qiáng)大阎毅!

Replace Structurally

這里就不得不貼上很多代碼了。比如以下資源文件点弯,現(xiàn)在你想去掉所有的 translation_description 扇调,技巧是使用 雙擊 shift 或者 ctrl + shift + a 調(diào)出搜索框然后搜索并選擇 replace structurally ,編輯規(guī)則抢肛,選擇 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

另外你還可以把這個(gè)加入設(shè)置中捡絮,由編輯器自動(dòng)檢查熬芜,不符合規(guī)則的代碼就會(huì)變黃,alt + enter 組合鍵進(jìn)行修改福稳。

ssi.png

這個(gè)方法對(duì) java 源碼同樣適用涎拉,只需要修改 file type。

Search Structurally

這個(gè)和 Replace Structurally 大同小異的圆,不再贅述鼓拧,請(qǐng)自行嘗試一下吧,_越妈。

Designtime Attributes

在寫好布局文件后季俩,我們可能想要直接看一下 preview 效果,但是不想在編譯時(shí)還預(yù)設(shè)這些屬性和值梅掠,這個(gè)時(shí)候可以使用 tools 這個(gè)強(qiáng)大的工具种玛。
首先我們要在布局文件中聲明 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

如果你夠細(xì)心的話一定會(huì)發(fā)現(xiàn)異常:那就是那個(gè)ToolBar 和 FAB 哪來的谴古?质涛!因?yàn)橛?tools:showIn。這個(gè)屬性聲明在最頂層的 layout掰担,值是 include 了本布局的一個(gè)父布局汇陆,它使得預(yù)覽本布局時(shí)同時(shí)會(huì)渲染該父布局。

更多的 tools attributes 可以訪問官方文檔 Android Tools Project Site: Tools Attributes

Private Resources

Android studio 默認(rèn) library 的所有 resource 為 public带饱,如果想保護(hù)某些 resources 不被外部訪問毡代,可以創(chuàng)建 res/values/public.xml,因?yàn)?public 是關(guān)鍵詞勺疼,所以需要用 new file 的方式創(chuàng)建教寂。至少要添加一行,未添加的則視為 private执庐。

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

參考:Public and Private Resources

另外酪耕,如果在 library 的 build.gradle 中添加 resourcePrefix ,則所有資源必須以此 prefix 開頭轨淌,否則會(huì)報(bào)錯(cuò)迂烁。

android {
    ...

    buildTypes {
        ...
    }
    
    resourcePrefix 'my_prefix_'
}

Resource Shrinking

這一段講解了一個(gè)減少未使用的資源文件的技巧,可以參考官方文檔:Android Tools Project Site: Resource Shrinking 递鹉,我就不做二次消化了盟步。

擴(kuò)展閱讀

  1. Android Studio Tips and Tricks

  2. IntelliJ IDEA Default Keymap

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


這是 Siva Velusamy 的演講,這小伙的口音太重了梳虽!

Debug

Analyze Stacktrace

這個(gè)用于我們?cè)诜治? bug report 時(shí)很有用址芯,使得它可以被點(diǎn)擊然后定位到出錯(cuò)代碼位置。復(fù)制它窜觉,然后打開 Analyze Stacktrace Dialog谷炸,入口為 Analyze → Analyze Stacktrace 或者搜索 analyze stacktrace

測(cè)試用 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)

我測(cè)試中發(fā)現(xiàn),Analyze Stacktrace 好像分析的是當(dāng)前復(fù)制到剪貼板的內(nèi)容禀挫,所以先 crtl + c 一下旬陡。

as.png

對(duì)于第一個(gè)紅框,它不是可選狀態(tài)的语婴,Siva 說的是有可能因?yàn)楸换煜^了描孟,但是我的 demo 并沒有混淆,有待研究吧砰左。然后匿醒,這就像我們?cè)?Android Monitor 中抓到的 log 一樣,可以直接跳轉(zhuǎn)到出錯(cuò)代碼處了缠导。另外廉羔,可以點(diǎn)開左下的 Show files modification info,它會(huì)顯示文件修改記錄僻造,讓 Peter 現(xiàn)形憋他。

st.png

View As

這個(gè)技巧講的是 debug 的時(shí)候孩饼,在想要查看的 變量上面右鍵 -> View as ,選擇合適的數(shù)據(jù)類型竹挡,可以更直觀的看到該數(shù)據(jù)的狀態(tài):

vah.png

Customize Data View

我們還可以定制顯示形式镀娶,這對(duì)于查看比較復(fù)雜的數(shù)據(jù)很有幫助,方法如上揪罕,右鍵選擇 Customize Data View梯码,然后如下圖般做一些配置,就可以更直觀的看到我們關(guān)注的信息了耸序。我修改了渲染一個(gè)節(jié)點(diǎn)時(shí)的表達(dá)式忍些,所以顯示的是 5 。 Siva 演講的時(shí)候修改的是 expanding a node 的表達(dá)式坎怪,這是錯(cuò)的罢坝,默認(rèn)就好。

cdv.png

Evaluate Expression

另外還可以用 Evaluate Expression 來直接觀察搅窿,它會(huì)跟隨變化嘁酿,也是右擊進(jìn)入,或者 alt + f8 男应。


e.png

Break Point

可以在斷點(diǎn)上右擊闹司,給斷點(diǎn)加上生效條件;或者設(shè)置斷點(diǎn)不是 suspend沐飘,而是打印一些信息游桩,ctrl + shift + f8

bp.png

接下來是 Alex Ruiz -- 我還以為 Ruiz 是瑞茲大魔王呢...

Android 導(dǎo)入 jar/aar module

這個(gè)比較簡單,如圖耐朴,new module借卧,然后選擇 import .JAR/.AAR project,然后一步步操作筛峭。


import.png

很值得注意的一點(diǎn)是铐刘,所有演講的工程師都喜歡用 double shift + 關(guān)鍵字 的方式來完成作業(yè),像上面的新建 module影晓,他們會(huì) double shift 調(diào)出對(duì)話框搜索 new module 的方式镰吵。十分高效!

new module 導(dǎo)入進(jìn)來了挂签,你還要做點(diǎn)配置疤祭。假設(shè)新 module 叫 smart,在 app/build.gradle 的 dependencies 中加入這一行

compile project(':smart')

另外根目錄下的 settings.gradle 中也要 include 進(jìn)去饵婆,大概長這樣

include ':app', ':smart'

事實(shí)上我們完全可以用 Android Studio 自帶的工程管理功能自動(dòng)完成這一任務(wù)勺馆,直接從工具欄打開 Project Structure,或者 ctrl + alt + shift + s 組合鍵,操作如下:

project.png

Run Any Gradle Task

這個(gè) tip 很方便谓传,如下圖,打開 gradle project芹关,很多 task —— 如果沒有點(diǎn)擊同步一下续挟,雙擊就可以運(yùn)行。

task.png

Build Variants

首先一個(gè)技巧是通過 Build Variants 來選擇運(yùn)行時(shí)的任務(wù)侥衬,做過多渠道打包應(yīng)該遇到過诗祸。


variants.png

另外一個(gè)技巧是,重構(gòu)方法名或者類名時(shí)轴总,讓 Android Instrumentation Tests 和 Unit Tests 都能夠隨之一起被重構(gòu)(默認(rèn)只有一個(gè)是 active 的直颅,project 窗口會(huì)高亮選中的 Tests),這需要打開 Android Studio 的一個(gè)選項(xiàng)怀樟,如下圖功偿。這個(gè)可能是 2.0 的功能,我在 1.5 上未發(fā)現(xiàn)該設(shè)置選項(xiàng)往堡。

test.png

關(guān)于兩種測(cè)試的最大區(qū)別從名字上就看的出來械荷,Unit Tests 是 local tests,直接運(yùn)行在電腦的 JVM 中虑灰,而則需要運(yùn)行在 Android device 或者 emulator 上吨瞎。更多可參考官方文檔:Building Effective Unit Tests


這是 Michal Bendowski 的演講

Create Test Classes

很簡單穆咐,光標(biāo)移動(dòng)到被測(cè)試類名上颤诀,alt + enter,選擇 create test对湃,即可創(chuàng)建崖叫,使用組合鍵 ctrl + shift + t 可以在二者之間來回切換,當(dāng)然熟尉,它還可以用于創(chuàng)建測(cè)試類归露。

ct.png

在 1.5 上創(chuàng)建測(cè)試類的時(shí)候和 build variants 中的選擇有關(guān),但是 Michal 演示的時(shí)候不需要擔(dān)心這個(gè)斤儿,而且重構(gòu)的時(shí)候也能同時(shí)被一起重構(gòu)剧包,應(yīng)該是 2.0 的新功能。

后面還有 NDK 調(diào)試和 CPU 優(yōu)化調(diào)試往果,有空再說疆液,囧

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市陕贮,隨后出現(xiàn)的幾起案子堕油,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件掉缺,死亡現(xiàn)場離奇詭異卜录,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)眶明,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門艰毒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搜囱,你說我怎么就攤上這事丑瞧。” “怎么了蜀肘?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵绊汹,是天一觀的道長。 經(jīng)常有香客問我扮宠,道長西乖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任涵卵,我火速辦了婚禮浴栽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘轿偎。我一直安慰自己典鸡,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布坏晦。 她就那樣靜靜地躺著萝玷,像睡著了一般。 火紅的嫁衣襯著肌膚如雪昆婿。 梳的紋絲不亂的頭發(fā)上球碉,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音仓蛆,去河邊找鬼睁冬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛看疙,可吹牛的內(nèi)容都是我干的豆拨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼能庆,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼施禾!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搁胆,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤弥搞,失蹤者是張志新(化名)和其女友劉穎邮绿,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體攀例,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡船逮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了粤铭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傻唾。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖承耿,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伪煤,我是刑警寧澤加袋,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站抱既,受9級(jí)特大地震影響职烧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜防泵,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一蚀之、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧捷泞,春花似錦足删、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至咏瑟,卻和暖如春拂到,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背码泞。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工兄旬, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人余寥。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓领铐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親劈狐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子罐孝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容