Edited at

apkにテストのファイルを含めない

More than 5 years have passed since last update.

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に含まれることはなくなりました。