apkは普通のzipアーカイブなので誰でも解凍することができます。
本来含まれるはずのないテストに使っているデータが含まれてしまい、とてもよくないのでなんとかしたくなります。
% zipinfo build/apk/app-debug-unaligned.apk | grep androidTest
-rw---- 2.0 fat 169 bl defN 20-May-14 19:07 androidTest/resources/fixtures/foo.json
-rw---- 2.0 fat 100 bl defN 20-May-14 19:07 androidTest/resources/fixtures/bar.json
-rw---- 2.0 fat 655 bl defN 20-May-14 19:07 androidTest/resources/fixtures/baz.json
-rw---- 2.0 fat 144 bl defN 20-May-14 19:07 androidTest/resources/fixtures/foobar.json
Eclipse(Ant)の時とAndroid Studio(Gradle)のプロジェクトでは、ディレクトリ構成が大きく変わりました。このプロジェクトではRobolectricを使っていて、gradle-android-test-plugin 0.10.0ではテストコードのディレクトリをsrc/androidTestかsrc/testにしなければ動かないという仕様があります。
そのため、Ant時代から引き継いだsrcディレクトリの下にアプリのコードとテストのコードを入れなければならないという制約があります。
Gradleで
build.gradle
aaptOptions {
ignoreAssetsPattern '<dir>foo'
}
と書くとディレクトリfoo
が除外されるはずなのですが、これを書いている時点で最新のGradle Android plugin 0.10.2では除外されませんでした…
% /Users/itochan/local/android-sdks/build-tools/19.0.3/aapt
(中略)
--ignore-assets
Assets to be ignored. Default pattern is:
!.svn:!.git:!.ds_store:!*.scc:.*:<dir>_*:!CVS:!thumbs.db:!picasa.ini:!*~
ここではデフォルトで <dir>_* が除外されるということに着目し、ディレクトリ名をアンダースコアで始めるようにします。
% tree src
src
├── androidTest
│ ├── java
│ │ └── jp
│ │ └── itochan
│ │ └── android
│ │ └── test
│ │ └── foo
│ │ └── FooTest.java
│ └── resources
│ └── _fixtures
│ ├── foo.json
│ ├── bar.json
│ ├── baz.json
│ └── foobar.json
├── jp
...
% ./gradlew assembleDebug
% zipinfo build/apk/app-debug-unaligned.apk | grep androidTest
これでapkに含まれることはなくなりました。