Help us understand the problem. What is going on with this article?

65K問題が起きた時の犯人を調べる方法

More than 3 years have passed since last update.

前置き

いろいろとライブラリを導入していったら、プロジェクトの初期にもかかわらず65K 問題が発生・・・。
2日ぐらい悪戦苦闘してベスト・プラクティスを発見したのでメモ。

Proguradで挫折

とりあえずは下記ページを参考にした。

Multidex化してもよいのだけれど、アプリのサイズが増えるのがどうしても許容できなかったため、proguardで利用していないメソッドを消す戦略をとった。

頑張った結果、アプリケーションの65K問題を回避できた。
ただdebugビルドにもproguardファイルが必須となり、testで65k問題が発生する・・・!ヽ(`Д´)/

Instrumentation周りのproguard設定はかなり辛くて挫折。。。

JakeWharton神

現実逃避しながらgithubの海を漂っていると神スクリプトが・・・!

ソースは、GooglePlayService 5.0のmethod数を数えてみたって内容の記事だった。

65k問題の犯人探し

私の場合、leakcanaryを導入する前と後でmethod数が65kをちょうど超えたので、コレを導入する前のプロジェクト内のmethod数を数えた。

1. Smaliのinstall

smaliをinstallする

必要なのは下記の4ファイル

  • smali
  • smali-x.y.z.jar
  • baksmali
  • baksmali-x.y.z.jar

downloadしてPathを通しておく。

2. dex-method-countのinstall

~/.zshrc とか ~/.bashrc とかに上のスクリプトを突っ込む。
あるいは普通にsource dex.shしても。

3. 確認

65Kに至る前の状態で、dexファイルを作成する。

$ ./gradlew assemble
$ find . -type f -name '*.dex'
./app/build/intermediates/dex/debug/classes.dex

対象のdexファイルのmethod数を数える

$ dex-method-count-by-package ./app/build/intermediates/dex/debug/classes.dex
...
28197   com.google.android.gms
3370    android.support.v7.widget
3325    android.support.v4.view
3120    android.support.v7.internal
2098    android.support.v4.app
1758    android.support.v4.widget
1729    io.fabric.sdk.android
1491    android.support.v4.media
924 com.crashlytics.android.core
...

確認した結果、JakeWhartonさんのブログにもある通り、com.google.android.gmsが膨大なmethod数を参照している犯人だった。

対処

map部分のライブラリだけが必要だったので、コレのみを参照するようにした。

変更前
compile 'com.google.android.gms:play-services:7.0.0'
変更後
compile 'com.google.android.gms:play-services-maps:7.5.0'

実行するとmethod数が激減!!

6737    com.google.android.gms

というか、普通にGooglePlayの導入ページに注意書きで書いてあった.. orz

結論

GooglePlayServicesが大体犯人なので、コレを分割して必要なパッケージだけ導入しましょう。

参考

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away