冒死總結!有些地方不知道怎么描述,自己動手感受一番吧。
我只總結了前面五分多鐘講的快捷方式。后面的高級技巧我還在學習中,坑慢慢填。
已將 Tor Norbye 演講的編輯技巧補充完。
再來一波更新duang還有最后的 NDK 調試和 CPU 優化調試沒總結,有空再說,囧
補充一點:我的測試環境是 win7 + as 1.5,有錯誤的地方還請指出,謝謝。
昨天@陳啟超同學發了 Android Studio for Experts (Android Dev Summit 2015) 的視頻,我也跟著學習了一下。這個視頻講的非常好!做點小結,分享交流。
Completion
-
使用 Tab 補全,會自動編輯光標之后的字符串,如下,你在光標處鍵入 c 然后選擇
contentEquals
然后回車,magic!
c.png -
使用 ctrl + shift + space 智能補全,比如下圖,按下組合鍵,magic!可以按兩次哦!
c2.png 補充一個,嘗試在編輯器中輸入:
new Bitmap().var
Selection
ctrl+ w 選中,繼續操作會擴大選中范圍,相反的操作是 ctrl + shift + w
選中后可以使用 Extra 快捷鍵重構為變量、方法等,這個可以在 Refactor -> Extra 下看到。
ctrl+ alt+ v:變量
ctrl+ alt+ c:常量
ctrl+ alt+ f:域值
ctrl+ alt+ p:參數
ctrl+ alt+ m:方法這里我有一個快捷鍵沒有聽出來,就是從構造函數提取 parameters 為 fields,
public static class Init {
public Init(String first, boolean second, int third) {
}
}
感謝評論區的 @Will92Wang 指出,這個快捷鍵就是 alt + enter ,這是一個很強大的組合鍵。
LiveTemplates
這個內容極度豐富,我以前發過微博,可以在 Setting -> Editor -> Live Templates 下查看。舉幾個例子:
fori
和foreach
,在需要使用for
循環時,嘗試輸入這兩種for
試試;你還可以在數據集合變量后輸入
.for
,例如list.for
,這時候你看一下補全,會列出三種for
循環形式讓你選擇;logt
,logd
,logm
,在方法外輸入logt
,在方法內輸入logd
試試;另外還有
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>
另外你還可以把這個加入設置中,由編輯器自動檢查,不符合規則的代碼就會變黃,alt + enter 組合鍵進行修改。
這個方法對 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的效果!
如果你夠細心的話一定會發現異常:那就是那個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 ,我就不做二次消化了。
擴展閱讀
這是 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 一下。
對于第一個紅框,它不是可選狀態的,Siva 說的是有可能因為被混淆過了,但是我的 demo 并沒有混淆,有待研究吧。然后,這就像我們在 Android Monitor 中抓到的 log 一樣,可以直接跳轉到出錯代碼處了。另外,可以點開左下的 Show files modification info,它會顯示文件修改記錄,讓 Peter 現形。
View As
這個技巧講的是 debug 的時候,在想要查看的 變量上面右鍵 -> View as ,選擇合適的數據類型,可以更直觀的看到該數據的狀態:
Customize Data View
我們還可以定制顯示形式,這對于查看比較復雜的數據很有幫助,方法如上,右鍵選擇 Customize Data View,然后如下圖般做一些配置,就可以更直觀的看到我們關注的信息了。我修改了渲染一個節點時的表達式,所以顯示的是 5 。 Siva 演講的時候修改的是 expanding a node 的表達式,這是錯的,默認就好。
Evaluate Expression
另外還可以用 Evaluate Expression 來直接觀察,它會跟隨變化,也是右擊進入,或者 alt + f8 。
Break Point
可以在斷點上右擊,給斷點加上生效條件;或者設置斷點不是 suspend,而是打印一些信息,ctrl + shift + f8
接下來是 Alex Ruiz -- 我還以為 Ruiz 是瑞茲大魔王呢...
Android 導入 jar/aar module
這個比較簡單,如圖,new module,然后選擇 import .JAR/.AAR project,然后一步步操作。
很值得注意的一點是,所有演講的工程師都喜歡用 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 組合鍵,操作如下:
Run Any Gradle Task
這個 tip 很方便,如下圖,打開 gradle project,很多 task —— 如果沒有點擊同步一下,雙擊就可以運行。
Build Variants
首先一個技巧是通過 Build Variants 來選擇運行時的任務,做過多渠道打包應該遇到過。
另外一個技巧是,重構方法名或者類名時,讓 Android Instrumentation Tests 和 Unit Tests 都能夠隨之一起被重構(默認只有一個是 active 的,project 窗口會高亮選中的 Tests),這需要打開 Android Studio 的一個選項,如下圖。這個可能是 2.0 的功能,我在 1.5 上未發現該設置選項。
關于兩種測試的最大區別從名字上就看的出來,Unit Tests 是 local tests,直接運行在電腦的 JVM 中,而則需要運行在 Android device 或者 emulator 上。更多可參考官方文檔:Building Effective Unit Tests 。
這是 Michal Bendowski 的演講
Create Test Classes
很簡單,光標移動到被測試類名上,alt + enter,選擇 create test,即可創建,使用組合鍵 ctrl + shift + t 可以在二者之間來回切換,當然,它還可以用于創建測試類。
在 1.5 上創建測試類的時候和 build variants 中的選擇有關,但是 Michal 演示的時候不需要擔心這個,而且重構的時候也能同時被一起重構,應該是 2.0 的新功能。
后面還有 NDK 調試和 CPU 優化調試,有空再說,囧