asciidocで書いたドキュメントをgradleでpdfにビルドする設定
adocで書いていたドキュメントをgradleでpdfにビルドできるように色々やりました。今回のミソはjrubyのgradle pluginを使うとgemを使えるようになるということです。
asciidoctorのプラグインと依存関係のgemを使えるようにするために、次のプラグインをプロジェクトルートのbuild.gradleのdependenciesに追記する。
classpath 'org.asciidoctor:asciidoctor-gradle-plugin:1.5.9.2' classpath 'com.github.jruby-gradle:jruby-gradle-plugin:1.6.0'
gemを読み込んだりasciidoctorタスクの設定を行ったりする。PlantUMLで図を描いているので、これをPDFに入れるためにasciidoctor-diagramを入れている。これの画像を出力するディレクトリをちゃんと指定しないとPDFに正しく画像が差し込まれない。いい感じのディレクトリレイアウトを知りたい。
また、日本語環境で改行をいい感じにするためにasciidoctor-pdf-cjkを入れている。
apply plugin: 'org.asciidoctor.convert' apply plugin: 'com.github.jruby-gradle.base' dependencies { gems 'rubygems:asciidoctor-diagram:1.5.9' gems 'rubygems:asciidoctor-pdf:1.5.0.alpha.16' gems 'rubygems:asciidoctor-pdf-cjk:0.1.3' } asciidoctor { dependsOn jrubyPrepare requires = [ 'asciidoctor-diagram', 'asciidoctor-pdf-cjk' ] gemPath = jrubyPrepare.outputDir sourceDir = file('docs') sources { include 'toc.adoc' } backends = ['pdf'] outputDir = file('docs/output') separateOutputDirs = false attributes = [ 'imagesoutdir': 'art', // docs ディレクトリから見た相対パス 'imagesdir': 'art' ] }
oboeのコードラボをやった時のメモ
かねてより気になっていたoboeのコードラボをやってみた。とりあえず最後まで流してみたという程度で、詳しい動きは追えていない。そこまでのメモということで何卒ご容赦を。
Build a Musical Game using Oboe
IllegalStateException: Failed to find Build Tools revision 26.0.2
とか言われる。SDKツール26.0.2をインストールする。RuntimeException: No toolchains found in the NDK toolchains folder for ABI with prefix: mips64el-linux-android
とか言われる。mips64...?となってすこし調べたところbuild toolが古いのが原因なのではないかと考えてsamples/build.gradle
のcom.android.tools.build:gradle
を3.0.1->3.2.1に変更。gradle wrapperのgradleのバージョンも古くて怒られたので4.1->4.10に変更。- そのあともいくつかBuild tools revisionのXXXがない!というのが出るのでその都度インストールするととりあえずビルドできる状態になる。
- あとは説明を読みながら順番に書いていけばとりあえず動くものは出来上がる。
- エミュレータで動作確認してたからかもしれないが、タップした後に鳴らす音の出始めを早くする(レイテンシを下げる)処理を書いたんだけど早くなった感じがしなかった。
- バックボタンでアプリを閉じても音が鳴り続けるので止める方法を知りたい。
clearという名前のメソッドをもつViewModelのサブクラスをdalvikvm上で見つけられない人へ
年末、android-ktxをプロジェクトに入れようとして思わぬところで躓いたのでメモしておく。現象としては、Android 5.0以上が動いているエミュレータでは問題ないのに、4.4のエミュレータではアプリが起動するときにクラッシュしてしまうというもので、LogCatには特定のViewModel
のサブクラスをロードするときにClassNotFoundException
が発生した旨のスタックトレースが出ていた。
以下、手短に:
- 前提知識
- dalvikvmではpackage-privateなメソッドがパッケージ外からoverrideされてしまう(https://issuetracker.google.com/issues/36980050)。
- Javaではpackage-privateなメソッドと、そのサブクラスのメソッドとが同じ名前であった場合、それぞれ別のメソッドという扱いになる。
- ARTではこの不具合は修正されている様子。
- viewmodel 2.1.0-alpha01でpackage-privateな
final void clear()
というメソッドがViewModel
に追加された(https://android.googlesource.com/platform/frameworks/support/+/cc482665dae9b47b09bc818f39fbb01c36cf0d75%5E%21/#F5)- fragment-ktx 1.1.0-alpha03の依存関係で入ってきた模様。
- dalvikvmではpackage-privateなメソッドがパッケージ外からoverrideされてしまう(https://issuetracker.google.com/issues/36980050)。
- クラッシュする理屈:
clear()
という名前のメソッドを持つViewModel
のサブクラスは、dalvikvm上では親クラスのViewModel.clear()
をoverrideすることになるが、ViewModel.clear()
はfinal
なのでoverrideできない*1。これによってViewModel
のサブクラスは仮想マシンに読み込まれず、クラスが見つからない系のランタイムエラーが発生する。 - 対応
- サブクラスのclearメソッドの名前を変えました…
- こういうのはAOSPに報告すべき?