2014年11月29日土曜日

[Android] アプリのメソッド数を知るには

dex-method-countsというツールを使うと、APK内に含まれるメソッド数をパッケージ毎に知ることができる。

レポジトリをクローンしてきたらまずはツールのビルド。

./gradlew assemble

ビルドしたら、レポジトリのディレクトリで下記のコマンドを実行すると、指定のAPKのメソッド数をカウントしてくれる。

./dex-method-counts path/to/app.apk

アウトプットはこんな感じ

Read in 49877 method IDs.
<root>: 49877
    : 8
    android: 8768
        accessibilityservice: 6
        accounts: 4
        animation: 2
        app: 308
        bluetooth: 2
        content: 260
            pm: 24
            res: 51
            ...
        support: 6302
            annotation: 3
            v4: 6299
                accessibilityservice: 41
                app: 1371
        ...
    butterknife: 161
        internal: 89
    com: 30662
        bumptech: 2113
            glide: 2113
                ...
        google: 22969
            ...
Overall method count: 49877

ご覧のように、パッケージごとに細かくメソッド数を算出してくれる。

下記のようなエラー(いわゆる65K問題)が出てしまった時、削るライブラリの候補を考えるのに便利。

trouble writing output:
Too many field references: 131000; max is 65536.
You may try using --multi-dex option.

2014年11月13日木曜日

Nexus 5にAndroid 5.0(Lollipop)のFactory Imageを焼く

11/13についにAndroid 5.0のNexusu端末向けFactory Imageが公開されました。
Nexus4など一部端末は遅れるようですが、楽しみですね

前提条件

  • adbfastbootがコマンドラインから使えること
  • 端末内の必要なデータはバックアップしてあること

手順

  1. Factory Imageをダウンロード、解凍する

  2. Factory Imageを回答したディレクトリ内にターミナルで移動する

  3. bootloaderに再起動する。

    adb reboot bootloader
  4. bootloaderをアンロックします。

    fastboot oem unlock

    端末上で音量ボタンで"Yes"を選択し、電源ボタンでOKしてください。
    ※これを実行しないとFactory Imageを焼けませんが、保証がなくなるので充分注意してください。
    当方では一切責任を負いません。
    ※実行すると端末内のデータがすべて消えます。予めバックアップをとっておいてください。

  5. 予め用意されている、必要なデータをすべて焼くスクリプトを実行します。

    sh flash-all.sh

以上で手順は終わりです。 作業が終わったら端末が自動的に再起動します。

※"missing system.img"ダイアログが表示される場合

稀に"missing system.img"と出てうまくFactory Imageが焼けない事があるようです。
そんな場合は、下記の手順で進めるとうまくいくようです。

  1. image-hammerhead-lrx21o.zipを解凍する
  2. bootloaderを焼く

    fastboot flash bootloader <bootloaderファイル名>
  3. radioを焼く

    fastboot flash radio <radioファイル名>
  4. 一度bootloaderを再起動する

    fastboot reboot-bootloader
  5. 残りのファイルを焼く(image-hammerhead-lrx21o.zip内のファイル)

    fastboot flash recovery recovery.img
    fastboot flash boot boot.img
    fastboot flash system system.img
    fastboot flash cache cache.img
    fastboot flash userdata userdata.img
  6. 再起動する

    fastboot reboot

こちらからは以上です。 よいLollipopライフを!

参考:

2014年11月6日木曜日

GooglePlayストアで英語圏のレビューを見る方法(ブラウザ限定)

アドレスバーのURL末尾に下記内容を追記する。

&hl=en

hl=xxがすでにURLについている場合は置き換えてください。

hlhost languageの略です。enは英語。
このあたりに他の言語コードも書いてあるので、置き換えてみると他の言語のレビューも閲覧できます。

日本ではマイナーなアプリの評判を見るときに重宝します。

2014年9月9日火曜日

[Android] ActionBarPullToRefreshがうまく動かない時にやるべきたった一つのこと

ActionBar-PullToRefreshはAndroidでいわゆるpull-to-refreshな画面を実装するときによく使われるライブラリですが、いつの間にかDeprecatedになっていたようです。

README.mdを見ると、

PLEASE NOTE, THIS PROJECT IS NO LONGER BEING MAINTAINED

と思いっきり書いてあるのですが、すっかり見落としてました。

じゃあ代わりに何使えばいいのよ、ということで色々探してみたのですが、Commitをさかのぼってたら見つけました

dostiharise commented on 94da7fc on 5 May
Why is the project being abandoned? Is there a better version?

asfdfdfd commented on 94da7fc on 15 May
That's why: https://twitter.com/chrisbanes/status/460799199941230593

dostiharise commented on 94da7fc on 27 Jun
Ah, thanks! @asfdfdfd :+1:

で、貼り付けられてるtweetを見ると

SwipeRefreshLayoutの方がイケてるからそっち使ってね、ということらしいです。

ちゃんとREADMEに書いておいてほしいところですが、Googleの提供するSupport Libraryでまかなえるようになったのはうれしいですね。

2014年8月26日火曜日

Pebbleを一年間使ってきた私がLG G Watchを使ってみて思ったこと

2013/5/19から約1年3ヶ月ほどPebbleを使ってたけど、この度ちょっと魔が差してLG G Watchを購入した。
一週間ほど使ってみて、Pebbleとくらべて感じたことをまとめておく。

Pebbleのよい点

- 文字盤(画面)が見やすい

Pebbleはe-paper displayなので、白黒ではあるけれども、外でも画面が確認しやすい。

- 電池持ちがよい

Pebbleは毎日使っても約一週間電池が持つ。

- シェイクして通知を削除、が気持ちいい。

これはPebbleというよりもYaNCというPebbleの拡張アプリの機能だけど、腕を振ることでPebbleに来た通知を消去できる。Pebble本体を触ることなく確認した通知を消せるので、慣れると非常に楽。

- 入力方法の制限

Pebbleにはボタンが4つしかついてないので、入力デバイスとしてできることは非常に限られてしまっている。
ただ、ボタンが4つしかないからこそ使い方に迷うことは少ないし、シンプルにまとまっていると思う。

Pebbleのちょっと足りない点

- 日本語表示に対応していない。

日本語というか、アルファベット以外は表示できない。
Pebble単体で使おうとするとGmailや電話の通知はすべて内容が白い四角になってしまう。(Unicodeもサポートするよ!って公式は言ってるけどいつになるのやら…)
ただし、前に述べたYaNCというアプリを使うと日本語も表示できる。

G Watch(Android Wear)のよい点

- 日本語が標準機能で表示できる

起動してすぐ、特に複雑な設定もなく日本語を使えるのはありがたい。

- フルカラーで見た目キレイ。

キレイ。日光の下でもちゃんと見れるとなおよかった。

- Google Now/Androidとの連携

やはりGoogle謹製なだけあってGoogle Nowのカードがそのまま見れたりするのはとても便利。

- 入力方法が多彩。

タッチパネルなのでまあ、スマートフォンと同じような操作ができる。サードパーティ製のAndroid Wear用キーボードアプリもあるし。使いやすいかどうかは別として。
あと、時計に話しかけてメモ作成とかメッセージ送信とか未来を感じるよね。ナイトライダーとかスーパージェッターとか。

- 拡張性の高さ

PebbleもSDK提供されててサードパーティ製アプリたくさんあったけど、スペック的にもAndroid Wearの方が色々できそうで高まる。何つくろうかな。

G Watch(Android Wear)のちょっと足りない点

- 日光の下で文字盤(画面)が見づらい。

というか見えない。手で覆ってあげればなんとか見えるかなー、っていうレベル。
これは時計としてはかなり致命的なのでは…

- 電池が持たない

一日ちょっと使うともう電池がなくなってしまう。
一週間充電しなくても大丈夫なPebbleに慣れてしまっているとちょっと不満。
スマートフォンと一緒に充電するようにしてしまえばいいんだけれども、専用のクレードルが必要なので充電をうっかり忘れてしまうと致命的。
そうか、書いてて気づいたけど旅行に行くときはクレードル持ち歩かなきゃなのか…

- たまに時刻の更新が遅れる

バッテリーの消費対策のためなのか、待機モードの時に時刻が更新されないことがあるみたい。時刻を確認→20秒もたたないうちにもう一度確認したら2分進んでる、とか。駅に向かってる途中にこれやられると脱力するよね。

まとめ

時計+スマートフォンに来た通知の確認、という程度の用途だとまだPebbleの方に軍配が上がる。
G Watchだと日光の下で時刻の確認すら満足にできないし、稼働時間もまだまだ心許ない。
ただ、音声入力とか「子どもの頃に夢見た未来デバイス」という感じでテンションは上がる(現状テンション上がるだけなのが…うん…) 。
まあまだ人柱感の強いデバイスではあるし、今後の発展に期待、という感じでした。

2014年5月6日火曜日

超チューニング祭に参加してきた

2014/04/26(土) - 04/27(日)に開催されたニコニコ超会議3の、超チューニング祭に参加してきました。

SP版ニコニコ動画のトップページをチョッパヤにしてくれ、という課題に友人と二人で二日間かけて取り組んできました。

特に賞には引っかからなかったのですが、せっかく参加したので今回行った高速化の施策を軽く紹介しようと思います。

  1. jQueryからZepto.jsに変更
  2. JavaScriptの結合・圧縮
  3. 画像をCSSスプライトにまとめる
  4. 画像を減色
  5. HTMLの書き直しと圧縮
  6. CSSの書き直しと圧縮
  7. ファーストビューより下の画像を遅延読み込み

1. jQueryからZepto.jsに変更

共通ライブラリとして読み込まれていたjQueryをZepto.jsに変更しました。
これだけで、68KBくらい削減できます

2. JavaScriptの結合・圧縮

トップページだけで10個ものJavaScriptファイルが読み込まれていたので、uglify.jsを利用して1ファイルに結合・圧縮してしまいました。
また、アカウント設定なしでGoogle Analyticsのurchin.jsが読み込まれていたので削除してしまいました(なお本番のトップページでもアカウント設定なしで読み込まれている模様)。そもそもurchin.jsとかかなり古いコードなのでやめてほしいですね…

3. 画像をCSSスプライトにまとめる

サムネイルとか動的に切り替わる画像以外はCSSスプライトにまとめると、リクエスト数が減っていい感じです。
画像のスプライト化には自作のGruntタスクであるgrunt-spritesheet-generatorを利用しました。

4. 画像を減色

imageoptimとimagealphaを使って画像を減色します。特にpng画像はimagealphaを使うことで60-70%ほどサイズを削減できます。

5. HTMLの書き直しと圧縮

UIの改善のための書き直しと併せて、タグのネストを浅くしたりしました。
その上でgrunt-contrib-htmlminを使いコメントや改行コード、不要なスペースを削除しました。

6. CSSの書き直しと圧縮

grunt-cssoを使ってcssの圧縮をしました。cssoを利用すると、コメントや空行の削除だけでなくcssの構造的な最適化まですることができます。
また、SASSに書き直して利便性を上げるとともに未使用のCSSプロパティを消しています。

7. ファーストビューより下の画像を遅延読み込み

CSSスプライトにまとめられない画像(バナーや動画のサムネイルなど)は、ユーザーのスクロールに合わせて遅延読み込みされるようにしています。こうするとファーストビューより下の画像のリクエストを遅らせることができます。表示領域に入らなかった画像はリクエストされることもありません。この機能の実装にはlazyloadというライブラリを使っています。


以上です。

js/css/画像をすべてインラインで書いてしまいリクエストを一つにする、とか思いもよらない(でも言われてみれば合理的)な施策があったり、なかなか勉強になりました。(個人的には画像をローカルストレージにキャッシュするのが面白かったです)

他の人と同じ課題をもらって実装を競うとかしたことのない経験だったのでなかなか面白かったです。
次こんな機会があったらLTもしてみたいですね。

※一応実際のコードもおいておきます

参考(他の参加者の記事):
- 本の虫: 超会議3の超チューニング祭の感想
- レポート - 超チューニング祭で努力賞(最速賞)をとるためにやったこと - Qiita
- ニコ動 超チューニング祭で最優秀賞もらいました
- 超チューニング祭に参加した - masarakki's blog
- JavaScript - 超チューニング祭に参加&表彰した - Qiita
- kmizu/slide_cho_tuning
- 超会議の偏った感想 - mizchi's blog

2014年4月25日金曜日

Homebrewで入れたNode.jsのnpmが更新できない時にすべきたった一つのこと

一度Node.jsをアンインストールして、再インストールしましょう。

HomebrewからインストールしたNode.jsのnpmを npm update で更新しようとすると、下記のようなエラーが出る事があります。

npm ERR! error rolling back Error: Refusing to delete: /usr/local/bin/npm not in /usr/local/lib/node_modules/npm
npm ERR! error rolling back     at clobberFail (/usr/local/Cellar/node/0.10.15/lib/node_modules/npm/lib/utils/gently-rm.js:41:12)
npm ERR! error rolling back     at next (/usr/local/Cellar/node/0.10.15/lib/node_modules/npm/lib/utils/gently-rm.js:27:14)
npm ERR! error rolling back     at /usr/local/Cellar/node/0.10.15/lib/node_modules/npm/lib/utils/gently-rm.js:36:12
npm ERR! error rolling back     at Object.oncomplete (fs.js:107:15)
npm ERR! error rolling back  npm@1.3.7 { [Error: Refusing to delete: /usr/local/bin/npm not in /usr/local/lib/node_modules/npm] code: 'EEXIST', path: '/usr/local/bin/npm' }
npm ERR! Refusing to delete: /usr/local/bin/npm not in /usr/local/lib/node_modules/npm
File exists: /usr/local/bin/npm
Move it away, and try again.

参考: Error: Refusing to delete: /usr/local/bin/npm #3794

これ、8ヶ月くらい前(2014/04現在)からずっと問題になっていたんですが、3週間ほど前に解決したようです。

参考: node: install npm using tarball. #28075

解決方法は簡単。HomebrewからインストールしたNode.jsを一旦削除して、再インストールするだけ。

brew uninstall node
brew install node

これでnpmが npm update で更新できるようになります。