fkm blog

software開発に関することを書いていきます

Google I/O 2019: Android Studio: Tips and Tricks

Android Studioを使い倒すためのセッション。何度も巻き戻しながら操作を確認したほうがよいです。

youtu.be

全編デモというなかなかにクレイジーなセッション。

プロファイラ

Command+Shift+up でウィンドウの大きさが変更できる。

メモリプロファイラ

  • Command + GでGC実行。
  • Command + マイナスでズームアウト
  • Command + 0(ゼロ)でデフォルトの大きさに

電力(energy)プロファイラ

システムイベントがとれる。

IDEのtips

ツールウィンドウ(上下左右にくっついてるやつ)は、Command+書かれてる数値 でOpen/Closeできる。Windowsの場合はAlt+書かれてる数値

Switcher(Ctrl+tab)を使うと、数値の書いてないツールウィンドウ(例えばGradle)もぱっと選べる。

Shift+Escapeで最近開いたウィンドウを閉じれる。

F12で直近のウィンドウに戻れる。

Command+Shift+F12(Ctrl+Shift+F12 on Windows)で、すべてのウィンドウを隠す。もう一度押すと元に戻る。

Projectウィンドウとかで探したい文字列を直で入力すると、フィルタされる。これは結構使ってる人多そう。

エディタで、隣のタブに行きたいときはalt+左右。これもすでに使ってる人多そう。なおレイアウトエディタのように、下にもタブがある場合はalt+shift+左右で切り替わる。

エディタは上下左右に分割できる。タブの部分をドラッグすれば分割した別のとこに持っていくことも可能。

分割を元に戻したいときは、Shiftx2(Search everywhere)でunsplitを選べば戻せる。

Command+O(Ctrl+Shift+N on Windows)でファイルを探す。

Ctrl+1でブックマーク1に飛ぶ。

Ctrl+左右でカーソルを単語単位で移動。Shiftをつければ当然選択される。

CamelHumps wordを使うモードがある。

メソッドでCtrl+上下(Alt+上下 on Windows)で、次のメソッド/前のメソッドに飛べる。

Command+Shift+Backspace(Ctrl+Shift+Backspace on Windows)で、最後に編集したところに飛べる。

インテリジェンス系

F1(Ctrl+Q on Windows)でtooltipを表示。メソッドの説明が欲しいときに。

引数の中でCommand+P(Ctrl + p on Windows)で、引数の説明を読んだりするモードになる。tabで次の引数に移動したりとかもできるようになる。

Ctrl+spaceで基本的なコード補完。この時、引数名から推測して「この変数?」というのを提案してくれる。引数を書き換える時はEnterではなくtabを押そう。

() まで書かれた状態で、引数をいい感じにうめたい時はCtrl+Shift+Spaceでいい感じに候補を絞り込める(スマートタイプというらしい)。引数が2つかある場合、まとめて設定とかもできちゃう。

編集に関するtips

Command+Shift+a(Ctrl+Shift+a on Windows)でアクションを探せる。

Ctrl+Shift+jで行を連結。

Option+w(Ctrl+w on Windows)で選択範囲を広げる。

Command+D(Ctrl+D on Windows)で選択してるのを複製。

Command+/(Ctrl+/ on Winddows)でコメント化

行を選択した状態でCommand+Shift+上下で持ち運べる。ちゃんとブロックの中とか意識してくれる。

Command+Backspace(Ctrl+Y on Windows)で1行削除

Command+F(Ctrl+F on Windows)で検索。

Ctrl+G(Alt+J on Windows)で、選択してるのと同じものを選択範囲に追加。

Command+Shift+v(Ctrl+Shift+v on Windows)で、履歴からペースト。

Option+Command+M(Ctrl+alt+m on Windows)で、選択してたのを関数化。このとき似たようなのがあったら同時に関数を呼ぶスタイルに変更してくれる。

Option+Command+v(Ctrl+alt+v on Windows)で、選択してたのを変数化

Option+Command+n(Ctrl+alt+n on Windows)で、変数のインライン化

範囲選択してOption+Command+t(Ctrl+alt+t on Windows)で、ifで囲んだりtry-catchにしたり。

Command+Shift+Enter(Ctrl+Shift+Enter on Windows)で、現在のステートメントを完成させる。

Option+Command+p(Ctrl+alt+p in Windows)で、指定したものをメソッドの引数に移動させる。ちゃんと呼び出し側も変更される。

Command+b(Ctrl+b on Windows)で、定義に移動。

例えば戻り値のないメソッドで return true と書いた場合、alt+enterで戻り値のあるメソッドに変更してくれる。

もしメソッドがbooleanを返す場合、呼び出し側で .if のように追加してあげると、if文に変更してくれる。

alt+enterを使えば、if文の条件をひっくり返すことも可能。

デザインツール

ナビゲーションエディタ

auto arrangeボタンを使うと、いい感じに整形してくれる。

複数選択して、右クリックで別のナビゲーショングラフに移動させることができる。

レイアウトエディタ

Command+クリックでサンプルデータにも飛べる。

Viewが重なってる時は、左側のツリーでドラッグで移動させるのも手。

リソースマネージャー

画像をレイアウトに放り込むと、ImageViewとして追加してくれる。

レイアウトファイルをレイアウトに放り込むと、includeとして追加してくれる。

なお、上記2つの操作はXMLに対しても行える。すでに配置されているImageViewに対し、別の画像を放り込んだ場合はsrcを書き換えてくれる。

ImageViewで、選択後右側のAttributeのところでマージンの中央の左上(図でないとわからないな。。。)をクリックすると、アスペクト比を保持する設定が追加できる。

ビルドと実行

例えば core プロジェクトを libraries/core に移動させたい場合、何もしないと :libraries:core になっちゃう。しかし settings.gradle で、次のように書けば :core のまま使うことができる。また、名前も好き勝手に変更できる。

include ':app'
include ':core-lib' // フォルダ名はcoreだが、core-libとして使おう

project(":core-lib").projectDir = new File(rootDir, "libraries/core")

アプリやライブラリの build.gradle で、 buildDir = new File(適当なパス) とすると、ビルド時のフォルダ指定ができる。例えば高速なディスクを使いたい時とかに有効(かなりマニアックな気がする)。

マルチモジュールで、ライブラリの依存関係をハードコードした場合、アップデートする時に全部手作業で直す必要があるので危険。その場合は library_versions.gradle ファイルをトップに作り、次のように記述する。

def androidx = [:]
androidx.appcompat = 'androidx.appcompat:appcompat:1.0.2'

ext.libs = [:]
ext.libs.androidx = androidx

そしてルートにある build.gradle で、次のようにapplyする

buildscript {
    apply from: 'library_versions.gradle'
    repositories {
        google()
    }
    // 以下はそのまま
}

こうすると、アプリ側とかのdependenciesが次のように書ける。

dependencies {
    implementation libs.androidx.appcompat
}

どのライブラリがどの依存関係なのかを調べるには、File→Project StructureのDependenciesで確認できる。

ビルド速度を高めよう。理想は修正なしでリビルドした場合、全タスクがUP-TO-DATEになること。例えば buildConfigField()で、値に日付を使っちゃったりすると、毎回ビルド時に変更しないといけなくなっちゃう。

Apply Changesを使おう。Instant runとは違うアプローチになっている。

ブレークポイントでとめて、バグに気づいて修正。Apply codeで変更を適用したあと、Drop frameしてメソッド呼ぶ前に戻すと、なんとそこから再開できる。