Android1.6でLinearLayoutを子要素なしで表示するとRuntimeExceptionになる

Xperia(2.1)で検証していて、別のXperia(1.6)で動かしたところこんなエラーが発生。

E/AndroidRuntime(10100): Uncaught handler: thread main exiting due to uncaught exception<br />
E/AndroidRuntime(10100): java.lang.RuntimeException: mBaselineAlignedChildIndex of LinearLayout set to an index that is out of bounds.<br />
E/AndroidRuntime(10100): 	at android.widget.LinearLayout.getBaseline(LinearLayout.java:151)<br />
E/AndroidRuntime(10100): 	at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:644)<br />
E/AndroidRuntime(10100): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:280)<br />
E/AndroidRuntime(10100): 	at android.view.View.measure(View.java:7755)<br />
E/AndroidRuntime(10100): 	at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:892)<br />
E/AndroidRuntime(10100): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)<br />
E/AndroidRuntime(10100): 	at android.widget.ScrollView.onMeasure(ScrollView.java:276)<br />
E/AndroidRuntime(10100): 	at android.view.View.measure(View.java:7755)<br />
E/AndroidRuntime(10100): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989)<br />
E/AndroidRuntime(10100): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)<br />
E/AndroidRuntime(10100): 	at android.view.View.measure(View.java:7755)<br />
E/AndroidRuntime(10100): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989)<br />
E/AndroidRuntime(10100): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)<br />
E/AndroidRuntime(10100): 	at android.view.View.measure(View.java:7755)<br />
E/AndroidRuntime(10100): 	at android.widget.LinearLayout.measureVertical(LinearLayout.java:464)<br />
E/AndroidRuntime(10100): 	at android.widget.LinearLayout.onMeasure(LinearLayout.java:278)<br />
E/AndroidRuntime(10100): 	at android.view.View.measure(View.java:7755)<br />
E/AndroidRuntime(10100): 	at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989)<br />
E/AndroidRuntime(10100): 	at android.widget.FrameLayout.onMeasure(FrameLayout.java:245)<br />
E/AndroidRuntime(10100): 	at android.view.View.measure(View.java:7755)<br />
E/AndroidRuntime(10100): 	at android.view.ViewRoot.performTraversals(ViewRoot.java:748)<br />
E/AndroidRuntime(10100): 	at android.view.ViewRoot.handleMessage(ViewRoot.java:1614)<br />
E/AndroidRuntime(10100): 	at android.os.Handler.dispatchMessage(Handler.java:99)<br />
E/AndroidRuntime(10100): 	at android.os.Looper.loop(Looper.java:123)<br />
E/AndroidRuntime(10100): 	at android.app.ActivityThread.main(ActivityThread.java:4203)<br />
E/AndroidRuntime(10100): 	at java.lang.reflect.Method.invokeNative(Native Method)<br />
E/AndroidRuntime(10100): 	at java.lang.reflect.Method.invoke(Method.java:521)<br />
E/AndroidRuntime(10100): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)<br />
E/AndroidRuntime(10100): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)<br />
E/AndroidRuntime(10100): 	at dalvik.system.NativeStart.main(Native Method)<br />

どうも1.6の不具合らしく、LinearLayout, TableLayout あたりをaddView()なしで表示しようとするとこういうエラーになるようで…。
何も表示しないビュー(テキストなしのTextView)を該当のレイアウトにはめ込んだら問題なく動くようになりました。

参考:

Issue 3484 – Creating LinearLayout without child views programatically fails.(Android Issues)

apk パッケージの AndroidManifest.xml を解析するには

.apk ファイルに含まれる AndroidManifest.xml はバイナリ形式になっているため、そのままでは設定を読むことが出来ません。
 
元のXMLに戻すのではなく、XMLの情報を読みたいだけであれば、Android SDKに付属している aapt (Android Asset Packaging Tool)というツールを使うことで可能です。
 

aapt l -a <apkファイル>

aaptプログラムはapk作成のためのツールです。
それぞれのバージョン毎に独立した実行ファイルになっていて、platforms 以下それぞれのSDKバージョンのフォルダ以下に存在しています。
(追記)以前は platforms以下に分かれて配置されていましたが、現在は platform-tools フォルダに統合されました。

android-sdk/platform-tools/aapt

実行すると以下のようなダンプが出力されます。
AndroidManifest.xml について書かれているのは “Android Manifest:”以下ですね。

res/drawable/icon.png
res/layout/items.xml
res/layout/main.xml
AndroidManifest.xml
resources.arsc
classes.dex
META-INF/MANIFEST.MF
META-INF/CERT.SF
META-INF/CERT.RSA
 
Resource table:
Package Groups (1)
Package Group 0 id=127 packageCount=1 name=com.example.foo
~中略~
Android manifest:
N: android=http://schemas.android.com/apk/res/android
  E: manifest (line=2)
    A: android:versionCode(0x0101021b)=(type 0x10)0x3
    A: android:versionName(0x0101021c)=”1.2″ (Raw: “1.2”)
    A: package=”com.example.foo” (Raw: “com.example.foo”)
    E: application (line=6)
      A: android:label(0x01010001)=@0x7f040000
      A: android:icon(0x01010002)=@0x7f020000
      E: activity (line=7)
        A: android:label(0x01010001)=@0x7f040000
        A: android:name(0x01010003)=”.Foo” (Raw: “.Foo”)
        E: intent-filter (line=9)
          E: action (line=10)
            A: android:name(0x01010003)=”android.intent.action.MAIN” (Raw: “android.intent.action.MAIN”)
          E: category (line=11)
            A: android:name(0x01010003)=”android.intent.category.LAUNCHER” (Raw: “android.intent.category.LAUNCHER”)
    E: uses-sdk (line=16)
      A: android:minSdkVersion(0x0101020c)=(type 0x10)0x3

インテントごとの実行権限など一通りの設定を参照することが出来ます。
その他にもリソースID情報などもapkに関係する様々な情報を得られます。
 
参考:
How to parse the AndroidManifest.xml file inside an .apk package(stackoverflow)
エンコードされたAndroidManifest.xmlをデコードする

HTC Desire で急に通知バイブが鳴動しなくなる問題の対策

HTC Desire, Droid Incredible などで gmail の通知などでバイブが鳴らなくなる不具合があるようです。
調べてみたところSound Managerというアプリでバイブレーション設定することで解決するとのこと。
バイブが鳴るようになったら Sound Manager はアンインストールしてもOKです。
 
ダウンロード用QRコード(クリックでAndroid Merketへジャンプします)
画像
参考:
No notification vibration(Android Forum)

Eclipseでプラグイン更新後エラーで起動しなくなった時の対処方法

MESSAGE バンドル org.eclipse.equinox.app (913) を自動的に有効化している間にエラーが発生しました。

と出て、Eclipse が起動しなくなった。
Eclipse ディレクトリの

eclipse.exe -clean.cmd

を実行して解決しました。
ない場合はコマンドラインから

eclipse -clean

でOKです。

ADT – うまく動作しない時の対処方法

ADT(Android Development Tools) 0.6 を Eclipse 3.5(Galileo), Java 6.0 の環境でインストールしたものの色々不安定です。

Conversion to Dalvik format failed with error 1

というエラーが出て、プロジェクト→クリーンすればいいよという情報があったのでやってみたけど解決に至らず、試行錯誤の結果次の手順でプロジェクト設定を修正したところエラーが消えました。
 
1.パッケージプロパティーでプロジェクトを右クリック
2.Androidツール→プロジェクトプロパティを修正を選択 (Android Tools > Fix Project Properties)
3.最後にプロジェクト→クリーン
 
gen フォルダがおかしい時や、Android のライブラリの欠落もこれで修正されます。
 
参考:
Android Eclipse Classpath – want to add classpath container path but eclipse won’t let me.

デコンパイラ JD-Eclipse を入れてみた

デコンパイラといえば jad と、 Eclipse 組み込み版の Jadclipse が主流でした。
しかし最近は Jadclipse がメンテナンスされていなかったり、そもそもjad が公式配布停止していたりで残念なことに事実上完全に開発停止になってしまったようです。
 
そこで代わりを探していたところ、JD-Eclipse というものを見つけました。
 
Eclipse 3.5 (galileo)ですんなりダウンロード完了。
Java 5 の逆コンパイルにも対応していて、Jad よりも高機能なようです。
 
Eclipse アップデートサイトからの更新はこちら。

http://java.decompiler.free.fr/jd-eclipse/update

 
日本語での使い方説明記事はこちら。
究極の問題解析ツール、逆コンパイラJD-Eclipseとは(@IT)
 
参考:
JD-Eclipse Java Decompiler
究極の問題解析ツール、逆コンパイラJD-Eclipseとは(@IT)