2011年9月20日火曜日

アンドロイドアプリケーションの圧縮について

画像や音声を多く含む、Androidアプリケーションはサイズが大きくなりがちです。工夫次第で品質を保ったままでも、相当量アプリケーションのサイズを縮めることができます。サイズの小さなアプリケーションはユーザーのダウンロードも快適になります。
画像などのサイズが小さな場合プログラムの効率もよくなるでしょう。同じアプリの場合、3G回線で、画像未圧縮で20MBのサイズをダウンロードすることにユーザは躊躇するかもしれませんが、2MB程度になっていれば我慢してダウンロードしてくれるかもしれません

どこをどう圧縮すればいいかは、apkの拡張子を一旦zipにしてアーカイバで確認するとわかりいいです。

以下その手法について


①proguardを用いて不要コードを取り除き、classes.dexファイルを圧縮する
default.propertiesに'proguard.config=proguard.cfg'の行を追加すると、
コードが暗号化され、利用されてないコードが削除されます
⇒ただしライブラリなどを利用している場合無視する条件などを設定しなければいけずそこそこ学習が必要です
⇒生成されたクラスファイルそれ自体はzipすると圧縮されやすいファイルですのでそこまで気にすることはないです
⇒サイズも重要ですが構築に必要なライブラリはまあ使いましょうという話


②ビットマップ画像・音声などのメディアファイルを圧縮する
◎画像、メディアの圧縮はウェブでも共通するノウハウ、効果は高いです
◎PNGはアルファ透過が必要ない場合はたいてい8bitPNGで構わないです。
⇒アルファ透過は変えが利かないので32bit止む無し
⇒スマホやフィーチャーホンの場合ディスプレイの色表現力がそもそもなかったりします
⇒写真でなければ、だいたい256色で表示してもあまり見栄えはかわりません
◎PNG24bitの画像などはJPGで置き換えが利かないか検討しましょう
⇒フルカラーの写真画像であればJPGの方がより縮まります
⇒たいていの場合です。ベタ塗の画像など、「この色が何個続いて、その次にこの色が何個…」という感じな画像はPNGの方が高圧縮になまります。(つまりランレングス圧縮が有効な場合)
◎JPG画像の品質は100%⇒60%くらいまで縮めてもあまりわかりません。
ノイズが気になる場合は80%くらいに。
それも気になるなら95%に
⇒100%と95%では格段にサイズが違いますが品質は変わらないと聞いた記憶が
◎RIOT(Radical Image Optimization Tool)というアプリケーションを使うと、面倒な画像最適化を自動でやってくれます
⇒http://luci.criosweb.ro/riot/
◎音声も圧縮しましょう。
⇒圧縮形式の検討、ビットレートの検討、モノ、ステレオの検討など
⇒高品質な音声がスマホで常に必要かは…その人の主義やアプリによります
◎豆知識
ではJPGファイルはどのように圧縮をしているのか
⇒RGBで表現されるピクセルデータを「輝度」と「二種類の色相」で表現するように変換します
⇒人間の目は輝度には敏感ですが色相には敏感ではないです、ですので色相データを荒くします
⇒色相の部分はわかんない程度にモザイク状にしてしまいます
⇒DCT変換⇒整列⇒エントロピー符号化は難しいので省略
⇒つまり人間の感覚の許容範囲を元に画像を縮めているので場合によっては
他の圧縮形式のが効率がよいということを理解できればOKです
◎画像フォーマットそれ自体に知識を持つといろいろ役に立ちます


③SVGファイルを用いる
画像を使う場合ビットマップでなくSVGファイルを用いるようにすると劇的にサイズを縮められます。
⇒PNGなどのビットマップはどうあがいても画像サイズ分のデータを持ちますがSVGは描画に必要なパスデータしか含んでません
⇒これは制作が使ってるライブラリが対応してればというのもありますね。
  ⇒幸いsvg-androidという名前でgoogleprojectを検索するとモノがありますのでこれを使うようにしましょう

④不要なファイルを削除する
基本的なことですが忘れがちです、使ってないファイルはapkファイルに含まれないように取り除きましょう

⑤サイズの縮小にあまり頑張りすぎない
手のひら返し的ですが あんまがんばんな、圧縮は単に手段のひとつですよというお話
⇒いいコンテンツならかりかりに圧縮されてなくてもユーザーはおとしてくれるさ
⇒上にあげたようなツールでさくりとできる程度以上の圧縮は必要ないと思います
⇒サイズの圧縮に時間をかけて、ギリギリの線を目指すような必要はないということです。
⇒縮まらないものはどうしても縮まらないです