Hatena::ブログ(Diary)

Islands in the byte stream

2014-07-16

YAPC::Asia 2014でninjinkunといっしょにモバイルアプリ開発について話します

以下のトークが採択されました。2日目の藤原洋記念ホールにて、15:20からです。

Mobile First Development for Perl Mongers

最近はPerlはあまりやっていないのですが、サーバーサイドとクライアントサイド(モバイルアプリ)をいい感じに協調して働くための仕組みを考えたりしています。YAPC::Asiaにくるエンジニアはサーバーサイドの方が多いと思うので、そういう方たちにとって面白い話ができたらいいなと思っています。

ところで、このトークは ninjinkun といっしょにやります。トークの内容が似た感じなので合体してみたのですが、せっかくだから2人でお互いの状況を話つつ、モバイルアプリ開発やサーバーサイドとの連携についてディスカッションしようと思います。

2014-07-09

maven artifactsのupload/downloadサーバは簡単につくれる

Androidのエコシステムをなんとかしないといけないとの思いから、maven repository serverを作り始めた。

https://github.com/android-frontier/tiny-maven-repository

要は、特定のパスにPUT(bodyはjarなどのbinaryがそのまま渡る)でアップロードし、GETでPUTしたファイルを配信する仕組みだけがあれば最低限の機能としては十分だ。上のサーバはアップロードしたファイルの maven-metadata.xml を読んでgradleのdependencies宣言を生成するなど、多少の便利機能をつけてある。

今後の予定としては、アップロードをgithubアカウントでできるようにしたり、aarの場合は要求するAndroidのバージョンや依存ライブラリを表示したりなどしたい。また、いまはRailsで実装しているが、Androidとの親和性を考えてJavaで実装しなおそうと思っている。

2014-07-04

DalvikバイトコードのMethod数65k制限について

Androidアプリケーションにはアプリケーションのメソッド数が65kを超えられないという制限があるのだけど、その詳細を知らなかったので調べた。

参考: Does the Android ART runtime have the same method limit limitations as Dalvik?

まとめると

  • メソッド数制限の実体は(VMとしての)DalvikではなくDalvik bytecodeのinvoke系で使うmethod idが16bit intであること
  • つまり、アプリケーションで定義したメソッド数が65kを超えるかどうかではなく、ひとつのdex fileで参照しているメソッド数が65kを超えるときに問題が起きる
  • ARTもDalvik bytecodeを一旦介する以上、同じ制限をもつ

という感じか。さらに手元で試してみたところ、問題が起きるケースではdx(1)が例外を吐くので、そもそもビルドが通らなくなる。メソッド数Android 2.3系でのみインストールできなくなるという問題があったと思ったが、最近のツールだとそもそもビルドが通らなくなるのでapkのなかのメソッド数をCIで数えてチェックする必要はないのかもしれない。


以下検証実験:

まず、ひとつのdexでメソッドを沢山定義するとdx(1)が以下のようなエラーを報告する。

https://github.com/gfx/Android-TooManyMethodsInDex/tree/over65k-definitions

$ ./gradlew assembleDebug

(snip)

:app:dexDebug

trouble writing output: Too many method references: 65569; max is 65536.
You may try using --multi-dex option.
References by package:
     2 android.app
     1 android.util
     1 android.widget
 65559 com.example.gfx.over65methods
     6 java.lang
:app:dexDebug FAILED

ひとつのdexでの定義数を65k未満に抑えつつ、Android frameworkのメソッドを参照してmethod ref idが65kを突破したケースも同様:

https://github.com/gfx/Android-TooManyMethodsInDex/tree/by-external-refs

:app:dexDebug

trouble writing output: Too many method references: 65537; max is 65536.
You may try using --multi-dex option.
References by package:
     2 android.app
     5 android.util
     1 android.widget
 65523 com.example.gfx.over65methods
     6 java.lang
:app:dexDebug FAILED

外部ライブラリによってメソッド数が増えすぎる場合、以下のような例外が出ることもあるようだ:

https://github.com/gfx/Android-TooManyMethodsInDex/tree/method-id-not-in-range

:app:dexDebug

UNEXPECTED TOP-LEVEL EXCEPTION:
java.lang.IllegalArgumentException: method ID not in [0, 0xffff]: 65536
	at com.android.dx.merge.DexMerger$6.updateIndex(DexMerger.java:501)
	at com.android.dx.merge.DexMerger$IdMerger.mergeSorted(DexMerger.java:276)
	at com.android.dx.merge.DexMerger.mergeMethodIds(DexMerger.java:490)
	at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:167)
	at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)
	at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:439)
	at com.android.dx.command.dexer.Main.runMonoDex(Main.java:287)
	at com.android.dx.command.dexer.Main.run(Main.java:230)
	at com.android.dx.command.dexer.Main.main(Main.java:199)
	at com.android.dx.command.Main.main(Main.java:103)
:app:dexDebug FAILED

2014-06-19

WEB+DB PRESS Vol.81にAndroidの記事を書きました

Google I/O 2014が来週に迫った今日このごろですが、I/Oの前日に発売されるWEB+DB Vol.81に同僚たちとAndroidの特集記事を寄稿しました。私の担当はAndroid Studio+Gradleについてです。

とにかく変化の早いAndroid開発環境ですが、この一年で開発環境周りは格段に良くなってきています。また、いまから開発を始めるアプリなら2.x系のサポートも必須ではないでしょう。今回の記事ではそのあたりを踏まえて、Android開発の知見をまとめました。Androidの特集記事は以下の様な構成です。どうぞよろしく!

Androidアプリ開発最前線

設計,実装,デザインの新定石!

第1章:最新Android開発環境構築ガイド

Android StudioとGradleの基礎知識……藤 吾郎

第2章:あとで苦労しないための設計と実装

簡単なルールの導入で,可読性,メンテナンス性を高めよう……八木 俊広

第3章:使い勝手の良いデザイン

UIの基本,モックアップ,デザイナとの連携……日高 一明

第4章:チーム開発での改善サイクル

テスト,CI,段階的リリース,定量・定性データの収集……滝口 健太郎

電子版の定期購読もできるようですよ!

2014-06-15

最近作ったAndroid用ライブラリ

すべてMaven Centralに公開している。

ところでこれらは一口にAndroid用といっても上からgradle plugin、pure Javaandroid-libraryとそれぞれ微妙にプロジェクトフォーマットが違うのだけど、maven archiveの作り方も微妙にちがっていて共有できるところが少なく非常につらい。Maven系ではないAndroidエコシステムを作らなければならないという思いを新たにした。