DataBindingのコード取得とデバッグ

Kenji Abe
9 min readFeb 3, 2018

--

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の開始のとこでブレークポイントを貼ります。
AppPluginapply メソッドにブレークポイントを貼ります。場所は以下のキャプチャのとおりです。

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を再起動します。

デバッグ実行

あとは普通のアプリと同様にデバッグ実行します。

参考

--

--

Kenji Abe

Programmer / Gamer / Google Developers Expert for Android, Kotlin / @STAR_ZERO