AOSPからDataBindingのコード取得方法とデバッグ方法について簡単にまとめておきます。
DataBindingと書いてますが、依存してるAndroid StudioとGradle Pluginあたりのコードも取得します。
環境
- mac OS High Sierra
Setup
コードを取得する前に事前準備をします
Disk Image作成
Macは通常、ファイル名の大文字と小文字を区別していません。そのため、問題が発生することがあります。
なので、大文字と小文字を区別するDisk Imageを作って、それをマウントして使います。
以下のコマンドで作成します。容量は80Gとしています。
$ hdiutil create -type SPARSE -fs 'Case-sensitive Journaled HFS+' -size 80g ~/android.dmg
これを実行すると、 android.dmg.sparseimage
というファイルができてると思います。これをダブルクリックすることでマウントできます。
マウントすると、 untitled
みたいな名前になってますが、右クリックして名前を変更しておきます。今回は android
としています。
Repo インストール
AOSPのコードの取得やパッチを投げるときはRepoというツールを使います。
適当にPATHが通ってるとこにダウンロードします。この例では ~/bin
にインストールします。
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
その他
とりあえず、最低限の設定でやっていますが、何か足りない等あれば、公式ドキュメントを参考にしてみてください。
DataBindingのコード入手
先ほどのDisk Imageをマウントしておきます。
$ cd /Volumes/android
$ mkdir studio-master-dev
$ cd studio-master-dev
$ repo init -u https://android.googlesource.com/platform/manifest -b studio-master-dev
$ repo sync
これでコードが入手できます。 repo sync
はかなり時間がかかるので、余裕があるときにやりましょう。
補足として、DataBindingやGradle Pluginは studio-master-dev
が最新のブランチになります。masterではないので注意です。
ビルドとインストール
ビルド
$ cd tools
$ ./gradlew assemble
この記事を書いてるとき(3.0)は以下のエラーが出ました。
Execution failed for task ':sdk:find-java:assemble'.
ちょっとこのあたり詳しく見れてないですが、特に無くても大丈夫そうだったので、 tools/buildSrc/base/settings-real.gradle
の以下の箇所をコメントにして、実行し直したらエラー出ずにビルドできました。
include ':sdk:find-java'
project(':sdk:find-java').projectDir = new File(rootDir.getParentFile(), "sdk/find_java")
インストール
ローカルにインストールします。
$ ./gradlew publishLocal
/Volumes/android/studio-master-dev/out/repo
に色々作られます。
Androidプロジェクト設定
先程、ビルドしてローカルにインストールしたものをAndroidのプロジェクトで使うようにします。
プロジェクト直下の build.gradle
を以下のようにします。
buildscript {
repositories {
// 追加
maven { url '/Volumes/android/studio-master-dev/out/repo' }
google()
jcenter()
}
dependencies {
// 変更
classpath 'com.android.tools.build:gradle:3.0.0-dev'
}
}allprojects {
repositories {
// 追加
maven { url '/Volumes/android/studio-master-dev/out/repo' }
google()
jcenter()
}
}
mavenリポジトリをローカルのものを追加して、Gradle Pluginをdevのものを指定します。
Gradle Pluginデバッグ
Gradle PluginでもDataBindingの処理があるので、こちらもデバッグできるようにしておきます。
IntelliJ IDEAを使ってやります。
IDEAから Open
で、 /Volumes/android/studio-master-dev/tools/base
のディレクトリを開きます。
ブレークポイント
とりあえず、Gradle Pluginの開始のとこでブレークポイントを貼ります。AppPlugin
の apply
メソッドにブレークポイントを貼ります。場所は以下のキャプチャのとおりです。
Remoteデバッグ
次にRemoteデバッグできるようにします。
メニューの Run
-> Run...
から、 Edit Configurations...
を選択します。
左上の +
を押して、 Remote
を選択します。そのまま内容は変更せずに右下の OK
を押します。
デバッグ実行
まず、AndroidプロジェクトでGradleタスクを以下のように実行します。
$ ./gradlew clean assembleDebug -Dorg.gradle.debug=true
その後、IDEAの方に戻って先程つくったRemoteデバッグのConfigurationでデバッグ実行します。
タイミングとかで、うまくブレークポイントで止まってくれないときは、何度かGradleタスクを実行してみてください。
これでGradle Pluginをデバッグ実行できるようになります。
DataBinding Compilerデバッグ
次にDataBindingのAnnotation Processorのデバッグです。コード生成している箇所です。
これもIntelliJ IDEAでやります。Open
で、 /Volumes/android/studio-master-dev/tools/data-binding
を開きます。
ブレークポイント
とりあえず、Annotation Processorの開始のところにブレークポイントを貼ります。
ProcessDataBinding
クラスの process
メソッドのとこです。
Remoteデバッグ
これは先程のGradle Pluginのとこと同じです。
デバッグ実行
こちらもGradle Pluginのとこと同じです。
DataBinding 生成コードのデバッグ
AndroidプロジェクトでDataBindingが生成したコードのデバッグ方法です。ここからAndroid Studioの話になります。
ブレークポイント
生成されたコードに適当にブレークポイントを貼ります。
デバッグ設定
このままデバッグすると、ブレークポイントで止まったときにコードが表示されず、よくわからない感じになります。これをなんとかします。
設定から、 Editor
-> Data Binding
とこから、下の方をチェックしてAndroid Studioを再起動します。
デバッグ実行
あとは普通のアプリと同様にデバッグ実行します。