Taizoo's Tech note

技術系の備忘録

Android Studio Arctic Foxでjavadoc生成でエラーになったので代替案を考えてみた

AndroidStudioをArcticFoxにアップデートしたらjavadoc生成でエラーが出るようになってしまいました。色々調べたのですが、すぐに解決できなかったので代替方法として直接javadoc.exeを実行してjavadocを生成する方法をメモしておきます。

 

 

環境

Android Studio Arctic Fox | 2020.3.1 Patch 4

 

書式

最小限のオプションを指定したコマンド書式です。

javadoc -public -splitindex -encoding UTF-8 -charset UTF-8 -d "出力先パス" -classpass "参照するクラスのパス" "出力対象ファイル"

 

指定しているオプションについて
-public publicなクラスとメンバのみを出力する
-splitindex 索引ファイルを分割する場合に指定する
(AndroidStudioでは、本オプションが有効)
-encoding ソースファイルのエンコーディングを指定する
-charset HTMLファイルのエンコーディングを指定する
-d 生成したjavadocを出力するパスを指定する
-classpath 参照するクラスパスを指定する

 

出力対象ファイル

javadocに出力する対象のソースファイルを指定します。

 

手順

android.jarパスをメモる

②AndroidStudioでjavadoc生成を実行し、javadoc_argsの内容をメモる

javadocコマンドを作る

④バッチファイルを作る

⑤バッチファイルを実行する

書式の説明で記載しているように、javadoc.exeを実行するにあたり、-classpathを指定する必要があります。
-classpathにしかるべきクラスを指定しないとエラーが発生します。
①~②で-classpathに指定する情報を取得します。
また、②で取得する文字列が長すぎるため、コマンドプロンプトに直接コピペすることができないため、
バッチファイルに記載し、バッチファイルを実行することでjavadocを実行する手順となっています。

android.jarのパスをメモる

android.jarは、

SDKのインストールパス/platforms/android-〇

の中に格納されています。

②AndroidStudioでjavadoc生成を実行し、javadoc_argsの内容をメモる

①で取得したandroid.jarのクラスパスを指定しても、javadocへの出力対象のソースでandroid.jar以外のクラスを参照している場合にエラーが発生します。
androidxやcom.google.android.gms:play-services-mapsを使っている場合などにエラーが発生しました。

これらのクラスパスを手っ取り早く取得するために、一度AndroidStudioでjavadocの生成機能を実行します。

1. Tools > Generate JavaDoc をクリック

2. "OK"ボタンをクリック

f:id:Taizoo:20220121074350p:plain

すると、下記のようにjavadocの実行結果が表示されると思います。

f:id:Taizoo:20220121075236p:plain

ここで見たいのが、、、
画面を少し右にスクロールすると表示されている、"javadoc_args"の内容です。
javcadoc_argsをクリックすると、-classpathに指定している内容を確認することができます。赤枠の内容を全てコピーします。

f:id:Taizoo:20220121081609p:plain

javadocコマンドを作る

書式のコマンドをベースに、まずは出力先パス出力対象ファイルを実際のパスに置き換えます。

javadoc -public -splitindex -encoding UTF-8 -charset UTF-8 -d D:\javadoc -classpass "参照するクラスのパス" C:\Users\xxx\AndroidStudioProjects\TestJavadoc\app\src\main\java\com\example\testjavadoc\*.java

 

次に、-classpathには、①と②で取得した情報をセミコロン(;)で繋げた文字列を指定します。

-classpath C:\Users\xxx\AppData\Local\Android\Sdk\platforms\android-31\android.jar;C:\Users\xxx\AndroidStudioProjects\SampleMap\app\build\generated\data_binding_base_class_source_out\debug\out\com\example\samplemap\databinding;C:/Users/xxx/AndroidStudioProjects/SampleMap/app/src/main/java;~以下長すぎるので省略。

 

ここで作ったコマンドをそのままコマンドプロンプトに貼り付けて実行できれば良いのですが、文字列が長すぎて途中で途切れてしまうため、コピペで実行することができませんでした。そのため、バッチファイルを作ってjavadocを実行します。

④バッチファイルを作る

バッチはたった3行です。

c:
cd C:\Program Files\Android\Android Studio\jre\bin
javadoc -public -splitindex -encoding UTF-8 -charset UTF-8 -d D:\javadoc -classpath C:\Users\xxx\AppData\Local\Android\Sdk\platforms\android-31\android.jar;C:/Users/xxx/AndroidStudioProjects/TestJavadoc/app/src/main/java;C:/Users/xxx/AndroidStudioProjects/TestJavadoc/app/src/main/res;C:/Users/xxx/AndroidStudioProjects/TestJavadoc/app/build/generated/ap_generated_sources/debug/out;C:/Users/xxx/AndroidStudioProjects/TestJavadoc/app/build/generated/source/buildConfig/debug;C:/Users/xxx/AndroidStudioProjects/TestJavadoc/app/build/generated/res/resValues/debug;C:/Users/xxx/.gradle/caches/modules-2/files-2.1/androidx.collection/collection/1.1.0/1f27220b47669781457de0d600849a5de0e89909/collection-1.1.0.jar;C:/Users/xxx/.gradle/caches/modules-2/files-2.1/androidx.lifecycle/lifecycle-common/2.4.0/1fdb7349701e9cf2f0a69fc10642b6fef6bb3e12/lifecycle-common-2.4.0.jar;C:/Users/xxx/.gradle/caches/modules-2/files-2.1/androidx.arch.core/core-common/2.1.0/b3152fc64428c9354344bd89848ecddc09b6f07e/core-common-2.1.0.jar;C:/Users/xxx/.gradle/caches/modules-2/files-2.1/androidx.annotation/annotation/1.3.0/21f49f5f9b85fc49de712539f79123119740595/annotation-1.3.0.jar;C:/Users/xxx/.gradle/caches/transforms-3/b98e6b9fdda11fe260c03c8fafde63ff/transformed/material-1.3.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/b98e6b9fdda11fe260c03c8fafde63ff/transformed/material-1.3.0/res;C:/Users/xxx/.gradle/caches/transforms-3/b98e6b9fdda11fe260c03c8fafde63ff/transformed/material-1.3.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/19075c4677e37e538c54d7f745fc8af4/transformed/appcompat-1.4.1/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/19075c4677e37e538c54d7f745fc8af4/transformed/appcompat-1.4.1/res;C:/Users/xxx/.gradle/caches/transforms-3/19075c4677e37e538c54d7f745fc8af4/transformed/appcompat-1.4.1/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/3504aa656f9d00f9e2cadffb281d01d0/transformed/jetified-viewpager2-1.0.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/3504aa656f9d00f9e2cadffb281d01d0/transformed/jetified-viewpager2-1.0.0/res;C:/Users/xxx/.gradle/caches/transforms-3/3504aa656f9d00f9e2cadffb281d01d0/transformed/jetified-viewpager2-1.0.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/3fa0452599eafa04f96460f5edb0e212/transformed/fragment-1.3.6/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/3fa0452599eafa04f96460f5edb0e212/transformed/fragment-1.3.6/res;C:/Users/xxx/.gradle/caches/transforms-3/3fa0452599eafa04f96460f5edb0e212/transformed/fragment-1.3.6/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/979d22e60a188fda7431e38d4f6f14e6/transformed/jetified-activity-1.2.4/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/979d22e60a188fda7431e38d4f6f14e6/transformed/jetified-activity-1.2.4/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/7f55b507be3e8b5a35b1621b2feee964/transformed/jetified-appcompat-resources-1.4.1/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/7f55b507be3e8b5a35b1621b2feee964/transformed/jetified-appcompat-resources-1.4.1/res;C:/Users/xxx/.gradle/caches/transforms-3/7f55b507be3e8b5a35b1621b2feee964/transformed/jetified-appcompat-resources-1.4.1/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/3f7821781e94f81fee824a3c8b7db309/transformed/drawerlayout-1.0.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/3f7821781e94f81fee824a3c8b7db309/transformed/drawerlayout-1.0.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/7504ccfe757c3b8251dde7494000f3ff/transformed/coordinatorlayout-1.1.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/7504ccfe757c3b8251dde7494000f3ff/transformed/coordinatorlayout-1.1.0/res;C:/Users/xxx/.gradle/caches/transforms-3/7504ccfe757c3b8251dde7494000f3ff/transformed/coordinatorlayout-1.1.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/fbc7e087a85ee6ec45b41cbf6736a7e8/transformed/dynamicanimation-1.0.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/fbc7e087a85ee6ec45b41cbf6736a7e8/transformed/dynamicanimation-1.0.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/07202513350ea83f4d6257994e0c248b/transformed/recyclerview-1.1.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/07202513350ea83f4d6257994e0c248b/transformed/recyclerview-1.1.0/res;C:/Users/xxx/.gradle/caches/transforms-3/07202513350ea83f4d6257994e0c248b/transformed/recyclerview-1.1.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/82e137d0499d09a449d2463aa5974f15/transformed/transition-1.2.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/82e137d0499d09a449d2463aa5974f15/transformed/transition-1.2.0/res;C:/Users/xxx/.gradle/caches/transforms-3/82e137d0499d09a449d2463aa5974f15/transformed/transition-1.2.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/bad80395f89f9c8d7e39c1b2b41b5525/transformed/vectordrawable-animated-1.1.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/bad80395f89f9c8d7e39c1b2b41b5525/transformed/vectordrawable-animated-1.1.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/ec79f9c58b64c498772908f9ba77a8d1/transformed/vectordrawable-1.1.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/ec79f9c58b64c498772908f9ba77a8d1/transformed/vectordrawable-1.1.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/70815d79092ecd9fc6461dffc8a2c5cb/transformed/viewpager-1.0.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/70815d79092ecd9fc6461dffc8a2c5cb/transformed/viewpager-1.0.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/653456c4a641da75de4b4a9638a8683c/transformed/legacy-support-core-utils-1.0.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/653456c4a641da75de4b4a9638a8683c/transformed/legacy-support-core-utils-1.0.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/26a7debbd02593a460c2da8b73b1a684/transformed/loader-1.0.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/26a7debbd02593a460c2da8b73b1a684/transformed/loader-1.0.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/b2ba3d5ed78786779fe2371dcc849edb/transformed/customview-1.0.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/b2ba3d5ed78786779fe2371dcc849edb/transformed/customview-1.0.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/9339927e08badd09bc5459e4ba900d5f/transformed/core-1.7.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/9339927e08badd09bc5459e4ba900d5f/transformed/core-1.7.0/res;C:/Users/xxx/.gradle/caches/transforms-3/9339927e08badd09bc5459e4ba900d5f/transformed/core-1.7.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/fdf82ea01639be3b378e3d8ae26d9fb7/transformed/cursoradapter-1.0.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/fdf82ea01639be3b378e3d8ae26d9fb7/transformed/cursoradapter-1.0.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/481e173be89c72b2339cfb90a0d0dfe3/transformed/jetified-lifecycle-viewmodel-savedstate-2.3.1/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/481e173be89c72b2339cfb90a0d0dfe3/transformed/jetified-lifecycle-viewmodel-savedstate-2.3.1/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/2a57aba640d6987b70d76bbd37348ac4/transformed/jetified-savedstate-1.1.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/2a57aba640d6987b70d76bbd37348ac4/transformed/jetified-savedstate-1.1.0/res;C:/Users/xxx/.gradle/caches/transforms-3/2a57aba640d6987b70d76bbd37348ac4/transformed/jetified-savedstate-1.1.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/a2242387247aa8432093d2a01af71dba/transformed/cardview-1.0.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/a2242387247aa8432093d2a01af71dba/transformed/cardview-1.0.0/res;C:/Users/xxx/.gradle/caches/transforms-3/a2242387247aa8432093d2a01af71dba/transformed/cardview-1.0.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/bca1bb61c15ab5807e64593ca04debef/transformed/lifecycle-runtime-2.4.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/bca1bb61c15ab5807e64593ca04debef/transformed/lifecycle-runtime-2.4.0/res;C:/Users/xxx/.gradle/caches/transforms-3/bca1bb61c15ab5807e64593ca04debef/transformed/lifecycle-runtime-2.4.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/8a9cae927f9316cf7d269ce5dd3eaa14/transformed/versionedparcelable-1.1.1/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/8a9cae927f9316cf7d269ce5dd3eaa14/transformed/versionedparcelable-1.1.1/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/dabda3dcb43df8ec4c551ac08ba381df/transformed/lifecycle-viewmodel-2.3.1/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/dabda3dcb43df8ec4c551ac08ba381df/transformed/lifecycle-viewmodel-2.3.1/res;C:/Users/xxx/.gradle/caches/transforms-3/dabda3dcb43df8ec4c551ac08ba381df/transformed/lifecycle-viewmodel-2.3.1/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/1cb4c19a0747461aa679ba30d4bab2d0/transformed/lifecycle-livedata-2.0.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/1cb4c19a0747461aa679ba30d4bab2d0/transformed/lifecycle-livedata-2.0.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/ebd7630bfb4c047fea30074c62d6420c/transformed/lifecycle-livedata-core-2.3.1/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/ebd7630bfb4c047fea30074c62d6420c/transformed/lifecycle-livedata-core-2.3.1/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/3e108d352bff2b84e595703a9f580dc7/transformed/core-runtime-2.1.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/3e108d352bff2b84e595703a9f580dc7/transformed/core-runtime-2.1.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/70be178243629fefb8ce9adf6a292e12/transformed/interpolator-1.0.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/70be178243629fefb8ce9adf6a292e12/transformed/interpolator-1.0.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/c37e8f3de07728d5aa1483e75a377c93/transformed/documentfile-1.0.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/c37e8f3de07728d5aa1483e75a377c93/transformed/documentfile-1.0.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/30559646bdc9f3290097ba378eb99203/transformed/localbroadcastmanager-1.0.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/30559646bdc9f3290097ba378eb99203/transformed/localbroadcastmanager-1.0.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/b618f929228947d1fd03b4a852d85b00/transformed/print-1.0.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/b618f929228947d1fd03b4a852d85b00/transformed/print-1.0.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/b521f32a8ca2115704fce9eaa65230c1/transformed/jetified-annotation-experimental-1.1.0/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/b521f32a8ca2115704fce9eaa65230c1/transformed/jetified-annotation-experimental-1.1.0/res;C:/Users/xxx/.gradle/caches/transforms-3/b521f32a8ca2115704fce9eaa65230c1/transformed/jetified-annotation-experimental-1.1.0/AndroidManifest.xml;C:/Users/xxx/.gradle/caches/transforms-3/1f79276959ca9fb7f15de4c6158306e1/transformed/constraintlayout-2.1.3/jars/classes.jar;C:/Users/xxx/.gradle/caches/transforms-3/1f79276959ca9fb7f15de4c6158306e1/transformed/constraintlayout-2.1.3/res;C:/Users/xxx/.gradle/caches/transforms-3/1f79276959ca9fb7f15de4c6158306e1/transformed/constraintlayout-2.1.3/AndroidManifest.xml C:\Users\xxx\AndroidStudioProjects\TestJavadoc\app\src\main\java\com\example\testjavadoc\*java

1. Cドライブに移動

2. javadoc.exeが存在するパスへ移動

3. javadoc実行

⑤バッチファイルを実行する

ここまで来れば簡単ですね。

作成したバッチファイルをダブルクリックすれば、いつでもjavadocを生成できます。

f:id:Taizoo:20220121090650p:plain

調べたことメモ

-bootclasspath でandroid.jarを指定すると解決するといった情報を見かけましたが、私の環境では、-bootclasspathを指定すると、

エラー: オプション--boot-class-pathはターゲット11とともに指定できません

といったエラーが出て使えませんでした。

このエラーについて調べてみると、java10から拡張機能が使えなくなったようで、代わりに-classpathを使う必要があるようです。

ですが、手順②で記載したように、AndroidStudioのjavadoc生成機能では、既に-classpassを使用しており、other command line argumentに-classpathを指定しても、うまく機能しませんでした。

 

そこで、AndroidStudioがjavadocを生成する際に指定している-classpathの引数をコピーし、android.jarとともに-classpathを指定して、直接javadoc.exeを実行すればよいのでは?と思い、今回の代替案になりました。

 

一度バッチファイルを作れば、こっちの方が早いかもしれませんね。

 

参考にさせて頂いたサイト

javadoc - Java API ドキュメントジェネレータ

javacのオプションextdirsでのエラー