2012/11/30

Xperia acro HD (SO-03D) を 4.0 にしたら重くなったのでプリインアプリを無効化してみた

au の IS12S に遅れること約4ヶ月、やっと docomo SO-03D も4.0へのバージョンアップが発表されました。
もう、このままバージョンアップしない可能性もあるかと思っていたので、嬉しい限りです。

さて、喜び勇んでバージョンアップしたものの、起動したら動作がモッサリ…
いや、モッサリっていうか重い。激重。
ANR (Application not responding) 出まくるし。
それも、今まで問題なく動いていたアプリで。
他の4.0端末では問題なく動いているアプリで。

「なんじゃこりゃーーーー!」

一瞬で使い物にならない端末になってしまいました。

もしかしたら、バージョンアップ後の一時的なものかもしれませんが、それにしたってこれはひどすぎる。
原因を調査しようと思い、実行中のアプリを見てみると、やはり docomo 系のアプリが何やら動いている様子。
どう見ても、使わないものばかりのようなので、無効にしてみることにしました。
(4.0 からはプリインを無効に出来るようになったと、以前どこかで読んだことがあったので。)

設定 → アプリ

本当は「すべて」というタブがないといけないのですが、見当たりません。
実は、タブを左にスライドさせると出てきます。
たまたまだと思うのですが、わざと見せないようにしてるのではと勘ぐってしまいますね。

2012/11/20

R.id.xxx を switch 文で使うと case expressions must be constant expressions

これまで1プロジェクトで作成していた Androidアプリを機能別にライブラリ化してみました。
すると、 case expressions must be constant expressions というエラーが。


Migrate Android Code をクリックしてみると、以下のような文が表示されました。

ざっと意訳すると、以下のような感じでしょうか。

ADT 14 以降のライブラリプロジェクトでは R.id.menu_settings のようなリソースフィールドが定数ではなくなります。これは、再コンパイル無しでライブラリを使用できるようにするためです。

この変更により、(リソース)フィールドを switch 文の中で直接使うことが出来なくなります。代わりに、if-else を使用するようにしてください。

Eclipse では switch を自動的に if-else に変更することが出来ます。switch 文の上にカーソルを置き、Quick Fix を呼び出してください (Windows, Linux の場合は Ctrl-1, Mac の場合は Cmd-1)。
そして、 Convert switch to if-else を選択します。

リンク先の http://tools.android.com/tips/non-constant-fields を見てみると、ほぼ同じことが図入りで説明されています。


というわけで、「ライブラリプロジェクトにおいて、リソースフィールドを条件分岐に使用する場合は、switch ではなく if-else を使うように」ってことだそうです。

ちなみに、「ライブラリプロジェクト」とは
Project → Properties → Android で Is Library にチェックを入れたプロジェクトのことです。


configChanges=”orientation” を指定しているのに回転時に Activity が再生成される!?

Android の Activity は回転時に再生成されるという事実は、かなり有名だと思います。
そして、AndroidManifest.xml に android:configChanges="orientation" を記述しておくと、再生成を抑制してくれるというのも結構有名だと思います。
参考: Handling Runtime Changes | Android Developers
<activity android:name=".MyActivity"
          android:configChanges="orientation"
          android:label="@string/app_name">

ところが、我が家の Nexus7 では、上記のように設定しているのにも関わらず、回転すると Activity が再生成されてしまいます。
おかしいなぁ、と思って調べたところ、以下のサイトに情報が。

Kiroru Official Blog : onConfigurationChanged が呼ばれない!

「minSdkVersion か targetSdkVersion で 13以上の数字を設定している場合は、 orientation の他に screenSize も指定するように」とのことです。


しかし、よく見てみたら Handling Runtime Changes | Android Developers に書いてあったのね…
以前、読んだことがあるからと言って、読み飛ばしてしまったのが失敗でした。



ところで、この「回転時に再生成される仕様」って、Activity は長いこと放置されても(つまり、Destroy されても)、同じ状態に復活すべき。という発想から来てるんだと思います。
そう設計されているものは、一度削除してから生成しなおしても問題ないはずだと。

しかし、実際は、長い間放置された場合はホーム画面に戻る方が良いけど、回転時は現状を維持して欲しい。みたいなケースがあるわけです。
そういう場合には、configChanges を使用するのは有効です。

が、安易に使用すると、ちょっと他のアプリを起動していたら初期化されてしまうという問題につながるので、気を付けた方が良いかもしれません。

2012/11/08

Android Open Source Project を Eclipse に取り込む (2)

Android Open Source Project を Eclipse に取り込む で Android のソースコードを Eclipse に取り込むところまではうまくいったのですが、残念ながらエラーが出てしまいました。

Project 'AndroidOpenSourceProject' is missing required library: 'out/target/common/obj/JAVA_LIBRARIES/google-common_intermediates/javalib.jar'

Project 'AndroidOpenSourceProject' is missing required library: 'out/target/common/obj/JAVA_LIBRARIES/gsf-client_intermediates/javalib.jar'
だそうです。

2012/11/07

Android Open Source Project を Eclipse に取り込む (1)

@ Eclipse 4.2.0 Indigo

先日、Nexus7 用に Android をビルドしてみたので、次はコードをいじってみることにしました。
まずは、 Using Eclipse | Android Open Source を参考にして、 ソースコードを Eclipse に取り込みたいと思います。
注意
今回は Android Open Source Project (AOSP) を丸々取り込む方法です。
普段の Android アプリ開発時に、ソースコードを参照したいという場合は、以下の方が簡単でしょう。
穀風: Android のソースコードを Eclipse から使用できるようにする
参考
本エントリーは、既にAOSPのソースコードをダウンロード済みの前提で書かれています。
まだ、ダウンロードしていないという方は以下からどうぞ。
穀風: Nexus7 用に Android をビルドしてみた (2)


それでは早速 Eclipse に取り込んでいきたいと思います。
$ cd ~/android_src
$ cp development/ide/eclipse/.classpath .
$ chmod u+w .classpath

.classpath の内容を見てみると、 out/target/common が必要のようです。
つまり、ビルド済みのライブラリを用意しなければならないということですね。
私の場合は、Nexus7 用に Android をビルドしてみた でビルドしてあったので、そのまま使えそうです。

また、eclipse.ini のメモリ設定も書き換える必要があると書いてありますが、こちらも既に設定済みでした。
私の設定は以下です。
推奨よりさらに大きい値になっていましたが、大きい分には問題ないはずです。

-XX:MaxPermSize=256m
-Xms512m
-Xmx1024m


続いて、指示に従い Eclipse を起動します。
workspace はデフォルトのままで良いと書いてありますが、私は別の workspace にしてみました。
そのへんは好みだと思います。

Eclipse が起動したら
File → New → Java Project

細かい話ですが、このメニューは Perspective によって変わってしまうので、もし Java Project が出てこない場合は Java Perspective になっているかを確認してみると良いと思います。
もし、それでもメニューに出てこない場合は、
File → New → Other...
ダイアログで
Java → Java Project
とたどれば、Java Project が作成できるはずです。