冒死總結(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
-
使用 Tab 補(bǔ)全吗铐,會(huì)自動(dòng)編輯光標(biāo)之后的字符串,如下橄登,你在光標(biāo)處鍵入 c 然后選擇
contentEquals
然后回車抓歼,magic!
c.png -
使用 ctrl + shift + space 智能補(bǔ)全拢锹,比如下圖谣妻,按下組合鍵,magic卒稳!可以按兩次哦蹋半!
c2.png 補(bǔ)充一個(gè),嘗試在編輯器中輸入:
new Bitmap().var
Selection
ctrl+ w 選中充坑,繼續(xù)操作會(huì)擴(kuò)大選中范圍减江,相反的操作是 ctrl + shift + w
選中后可以使用 Extra 快捷鍵重構(gòu)為變量、方法等捻爷,這個(gè)可以在 Refactor -> Extra 下看到辈灼。
ctrl+ alt+ v:變量
ctrl+ alt+ c:常量
ctrl+ alt+ f:域值
ctrl+ alt+ p:參數(shù)
ctrl+ alt+ m:方法這里我有一個(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)大的組合鍵甜紫。
LiveTemplates
這個(gè)內(nèi)容極度豐富降宅,我以前發(fā)過微博,可以在 Setting -> Editor -> Live Templates 下查看囚霸。舉幾個(gè)例子:
fori
和foreach
腰根,在需要使用for
循環(huán)時(shí),嘗試輸入這兩種for
試試拓型;你還可以在數(shù)據(jù)集合變量后輸入
.for
额嘿,例如list.for
瘸恼,這時(shí)候你看一下補(bǔ)全,會(huì)列出三種for
循環(huán)形式讓你選擇岩睁;logt
,logd
,logm
钞脂,在方法外輸入logt
,在方法內(nèi)輸入logd
試試捕儒;另外還有
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>
另外你還可以把這個(gè)加入設(shè)置中捡絮,由編輯器自動(dòng)檢查熬芜,不符合規(guī)則的代碼就會(huì)變黃,alt + enter 組合鍵進(jìn)行修改福稳。
這個(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的效果肄满!
如果你夠細(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ò)展閱讀
這是 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 一下旬陡。
對(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)形憋他。
View As
這個(gè)技巧講的是 debug 的時(shí)候孩饼,在想要查看的 變量上面右鍵 -> View as ,選擇合適的數(shù)據(jù)類型竹挡,可以更直觀的看到該數(shù)據(jù)的狀態(tài):
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)就好。
Evaluate Expression
另外還可以用 Evaluate Expression 來直接觀察搅窿,它會(huì)跟隨變化嘁酿,也是右擊進(jìn)入,或者 alt + f8 男应。
Break Point
可以在斷點(diǎn)上右擊闹司,給斷點(diǎn)加上生效條件;或者設(shè)置斷點(diǎn)不是 suspend沐飘,而是打印一些信息游桩,ctrl + shift + f8
接下來是 Alex Ruiz -- 我還以為 Ruiz 是瑞茲大魔王呢...
Android 導(dǎo)入 jar/aar module
這個(gè)比較簡單,如圖耐朴,new module借卧,然后選擇 import .JAR/.AAR project,然后一步步操作筛峭。
很值得注意的一點(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 組合鍵,操作如下:
Run Any Gradle Task
這個(gè) tip 很方便谓传,如下圖,打開 gradle project芹关,很多 task —— 如果沒有點(diǎn)擊同步一下续挟,雙擊就可以運(yùn)行。
Build Variants
首先一個(gè)技巧是通過 Build Variants 來選擇運(yùn)行時(shí)的任務(wù)侥衬,做過多渠道打包應(yīng)該遇到過诗祸。
另外一個(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)往堡。
關(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è)試類归露。
在 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)試往果,有空再說疆液,囧