Edit
Android(アンドロイド)とは?

これはGoogleによって開発された携帯端末向けプラットフォームであり、開発環境も現在無償で提供されている。

Edit
機能的な特徴

AndroidのOSは、Linuxをカーネルにした、JavaVM(Dalvik)を独自実装し、Nativeで動作するモジュールなどをJavaと連携できるような仕組みとなっている。

Edit
Dalvik(JavaVM)

Javaは非常に洗練された言語構造を持ち、またハードに依存しないように、VM(Virtual Machine)という仮想マシンを想定した中間コードをインタプリタ言語のように実行するため動作が遅い。しかしAndroidのJavaVMである、DalvikではJIT(JustInTime、Android 2.2以降)により、実行時に中間コードをNativeコードとして保管し実行させることで高速化がはかられ、また通常のJavaVMでは、ハードウェアに依存しないように、スタックベース(計算などに利用する値などを一旦スタックに置いてから計算が実行される。これによってハードが何個レジスターを持っていようが、レジスターの種類などハードに依存せずに計算実行できる)で動作するが、Dakvikは高速化させるために、レジスターベースの動作が行われ、通常のJavaVMよりも高速化されている。そのためにDalvikでは中間コードに、DEX(Dalvik Executable)という形式で、レジスター方式の弊害である中間コードの増大に対して自動的に最適化を行い、極力中間コードを減らすように設計されている。(Dalvikは開発者の名前から命名)

Edit
Activity(画面)

Edit
Intent(インテント)

Intentは直訳すると意図や意思という意味であるが、Androidでは基本的にデータをやり取りするフォーマットのような認識が近いだろう。基本的にはActivityに対してIntentデータを送る事で他のActivityが起動される。ただIntentには2種類の仕組みがある。1つは明示的で、Intentは送り先のアクティビティを指定して送信する基本的なパターンと、Activityを指定せず、Intentは設定されたActionを元に、システムに登録されているアクティビティの中から同じActionを持つActivityを起動する暗黙的なIntentがある。この暗黙的Intentは分かりづらいが、例を見ると分かりやすい。

//壁紙を変更するIntentを作成し
Intent int = new Intent(Intent.ACTION_SET_WALLPAPER);
startActivity(int);

これは、ACTION_SET_WALLPAPERというActionを持つActivityを起動するコードであり、ポイントは明示的Intentと違い、起動するActivity名を指定していない。このようなコードが起動されると、この壁紙を変更するという機能を持ったActivityの一覧が画面に自動的に表示され、どのActivityを起動するかユーザーに通知する。(1つしかActivityが無い場合は自動起動)
さらにAndroid2.2では、これらのIntent通知をネットワークを介したCloud to Device Messaging(C2DM)が提供されており、例えばPCのブラウザで見たページを、Android端末のActivityに通知をすることで連携が取れるようになっている。詳しくはこのページを参照の事

Edit
ABI

EABI と legacy ABI

Edit
libc(bionic)

Edit
識別のためのID(IMEI)

ID名概要
電話番号内蔵される SIMカードに記録されている、電話を利用するための番号
International Mobile Equipment Identity(IMEI)ほぼすべての携帯電話に付与される15桁の端末固有ID。
Android IDAndroid OSが初回起動時に生成する16桁の乱数。端末によってはnull(ヌル)値を返すこともあり、端末識別子としては不完全という指摘もある。

Edit
開発環境

IDEはEclipseを利用し、Android Pluginを導入することで、開発環境が一式そろう。
Androidの公式サイト

Edit
導入方法

Androidの開発環境は大きくわけて3つ。

  1. eclipseのインストール(Android Plugin込み)
  2. Android SDKのベースのインストール(Emulator等を含む)
  3. Android SDKの全ライブラリをインストール

Edit
Eclipse3.6.2 (Helios)の設定

  1. Eclipseをダウンロードして設置(eclipseはインストーラーが無くファイルを展開するだけで利用可能)
  2. この日本語ファイルを、dropinsに展開する。
  3. EclipseのHelpから新しいプラグインのインストールを選択する。
  4. https://dl-ssl.google.com/android/eclipse/」を入力してサイトの登録(遅い場合にはhttpsではなくhttpでも問題無い)
  5. 表示されたプラグインをすべて選択してインストール
  6. Subversiveを導入する場合にはプラグインインストールのページで、[--すべての使用可能なサイト--]を選択し、検索文字に「subversive」を入力すると下記の3つが表示されるので、すべてを選択しインストールする。
    • Collaboration
    • General Purpose Tools
    • Subversive SVN Connectors
  7. eclipseの再起動後、自動的にSubversionの接続kitの選択がでるので「SVN Kit 1.3.5」を選択する。その後指示に従いインストール。

Edit
Android SDK のベースのインストール

  1. Android SDKをここからダウンロード
  2. ファイルを展開後、EclipseのWindowから設定を選んで、Andoroidの設定項目に展開したフォルダを選択し設定
     

Edit
Android SDKの全ライブラリのインストール''

  1. EclipseのWindowから、Android SDK & AVD Managerを選択しマネージャーの起動
  2. 左のメニューのAvaiable Packageを選択し、右がわの項目を選択してインストール
    (このインストールで、先ほどのAndoroidSDKフォルダにさらにファイルが追加される)

Edit
Android NDK のインストール方法

http://dl-ssl.google.com/android/eclipse/

以前のADTでは、PreferencesのAndroidの項目に、NDKという項目があったが、最新のADTからは、どうやら方式が変わったようだ。

Preferences -> C/C++ -> Build -> Environment のページに、

new_var.JPG

Edit
プロジェクトの作り方

通常、Androidのプロジェクトを作成するには、Eclipseのメニューから「ファイル」を選択し「新規」−>「Android Project」を選択する。但しその際には以下の項目を必須とする。

Project Name自分ですきなプロジェクト名を設定する。英語が推奨
Build targetAndroid SDK のバージョンを指定する
Application Name必要ないが通常はここでアプリ名を設定しておく
Package Namecom.domain.android.helloworld などのような命名規則でパッケージ名を指定
Create ActivityチェックはONにして、Activity Nameを設定する

Edit
フォルダ構成

androidでは、特殊なフォルダ構成が存在する。詳しくはここのサイトに詳しく記載されている。
上記のページに書かれているリソースフォルダに入れたリソースファイルには、自動的にプロジェクトフォルダ配下のgenフォルダに、R.javaというファイルが自動生成(F5キーを押して、最新の状態にプロジェクトを更新するタイミングで生成)され、androidのソースからアクセスするためのresidという形式になって、アクセスできるようになる。

Edit
eclipseの環境設定の注意点

ビルドパスエントリーをプロジェクトにする
eclipseの環境設定から、Java -> ビルドパスを選択すると、デフォルトのビルドパスエントリーの設定をする画面がある、ここでプロジェクトを選択しておく。

Edit
トラブルシューティング

INSTALL_FAILED_INSUFFICIENT_STORAGE
通常、上記のようなエラーの場合にはtemp容量が足りない場合が多い。そのため、一度adbからアプリをアンインストールしてから実行してみると良い。

adb uninstall com.example.android.apis

logcat を見たい時

adb logcat

オプションの詳細を確認したい場合にはここを参照。
Failed to installが表示され、インストールが出来ない

  1. すべてのプロジェクトをクリーンしてからインストール
  2. 実機からアプリをアンインストール
  3. 実機の電源を一度切る。

Edit
プログラムの基礎

Androidでは携帯電話特有の少ないリソース(メモリ、CPU速度など)でアプリを稼働されるため、プログラムが動作する上で下記のような動作が行われる。

  1. メインメモリには実際に動く時だけ展開される。
  2. 画面表示を細かいビュー毎に分割し、表示している所だけメモリを割り当てる。
  3. 動作していないビューは、CPU割り当てを解除する。 このように、メモリやCPUのリソースを、表示されるべきビューという概念を用いて、きめ細かく管理を行うことが、androidアプリの基本といえる。

このビューの事をAndroidでは、Activityという言い方をする

Edit
メインループ(Activityという概念)

androidでは、このActivityを継承することがメイン処理ということになる。

import android.app.Activity;
public class MyApps extends Activity { メイン }

また先の説明の通りこのアクティビティには下記の規定されたメソッドが必要となる。

生存期間種別メソッド名機能概要
entire lifetime (必須メソッド)onCreateアプリがロード時に処理される。コンストラクタ
onDestroyActivityが終了した時
visible lifetimeonStartアプリが動き出した時に呼び出される
onStop長期に見えない所にあるActivityの場合呼び出される。メモリ解放も行う。
onRestartonStopの状態が復帰した場合に呼び出される。onRestartの後はonStartも呼ばれる
foreground lifetimeonPauseActivityからForegroundが外れた時
onResumeActivityにForegroundが戻った時

Edit
設計上のポイント

上記の特徴を鑑みるに以下基本設計を心がける

Edit
Activity連携の為のIntent概念

Androidでは、このActivityという概念が重要であることは、上記の説明で伝わっていると思われるが、これに付随する仕様でIntent(直訳:行うべき事・意志)というものがある。これは端的に説明すると、Activityが持つ呼び出しのインターフェイスと、戻り値の引き渡しインターフェイスを纏めた概念である。
注意点として、アプリ名指定するのではなく、機能を指定するということが大きな特徴であり、該当するIntentを持つアプリが複数あった場合は、ユーザーがその中から選ぶ仕組みになっている
呼び出し側のActivityで記述する内容例

// 他のActivityの呼び出し
public void onClick(View v) {
    Intent intent = new Intent("com.google.zxing.client.android.SCAN");
    startActivityForResult(intent, REQUEST_CODE);
}
// Activityの呼び出し結果の処理
protected void onActivityResult(int reqCode, int resCode, Intent data) {
    if( reqCode == REQUEST_CODE && resCode == Activity.RESULT_OK){
        String contents = data.getStringExtra("SCAN_RESULT");
        TextView t = (TextView)findViewById(id.Text);
        t.setText(contents);
    }
}

呼び出される側のActivityで記述する内容例(参考もとのサイト
AndroidManifest.xml内に記述

<intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:scheme="foo" android:mimeType="text/html" />
</intent-filter>

代表的な共通インテント実装の呼び出し(その他の詳細はここを参照

// 明示的インテント(自分のアプリ内のActivityを起動)
Intent intent = new Intent(this, xxx.xxx.xxx.class); //xxxにはパッケージのパスが入る
// WEBブラウザ
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("http://www.gamvaro.com/kswiki/"));
// 指定した緯度・経度の位置をGoogleマップで開く
Intent intent = new Intent(Intent.ACTION_VIEW,Uri.parse("geo:latitude,longitude"));
// 指定した番号のダイヤル画面を表示する
Intent intent = new Intent(Intent.ACTION_DIAL,Uri.parse("tel:03-1111-2222"));

Edit
システムからの通知受け取り

Edit
アプリが最初に呼び出すActivityの設定

androidでは、アプリの起動や利用しているOSの機能などを、AndroidManifest.xmlで記述している。そのため、アプリが最初に呼び出すActivityクラスもここで指定される。通常、Activityの追加には、このxmlに下記の様な行を追加する。

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".myAppMainActivity" android:label="@string/app_name">
    </activity>
</application>

このmyAppMainActivityが、ソースに記述されるActivityクラスを継承した、自分のActivityである。ここの自分の継承クラスを最初に呼び出す場合には、次の様に変更する

<application android:icon="@drawable/icon" android:label="@string/app_name">
    <activity android:name=".myAppMainActivity" android:label="@string/app_name">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"></action>
            <category android:name="android.intent.category.LAUNCHER"></category>
        </intent-filter>
    </activity>
</application>

これは、自分のActivityが、上記の様にintentを受け付けることを宣言し、またそのActionとCategoryについて、MAINでLAUNCHする旨を記述することで、このActivityがアプリの起動時に呼び出される。

Edit
マルチスレッドについて

Edit
リソースについて

Androidでは、リソースについてプロジェクト単位で管理される。その為、多くのリソースを利用する場合には管理方法に注意する必要がある。リソースの利用方法は以下のように、R.raw.sample_movie など、「R.」をつける。これはandroidでは、プロジェクトの/resフォルダ以下を、/gen/R.java ファイルが自動的にresidとの関連付けを行ってくれる為。

また、システム画像などのリソースには、android.R.drawable.ic_menu_star などの指定方法を利用する。このシステムリソースを確認するには、android SDKをインストールしたフォルダの下の「android-sdk-mac_x86/platforms/android-7/data/res/drawable」の中を確認すれば良い。

item.setIcon( android.R.drawable.ic_menu_add );

※各フォルダ名はsdkのバージョンなどによって変化する点は注意。sdkのバージョンによって、システムリソースが違うため

Edit
Layoutについて

Androidでは小さい画面での利用を強く意識している。
基本main.xmlファイル

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout>
    <TextView />
</LinearLayout>

この例では、1行目はお約束だが、2行目のLinearLayoutというタグが、レイアウトタイプを指定している。レイアウトタグには以下のようなタイプが存在する。

レイアウトタグ名概要
FrameLayout主にフレームのレイアウト
LinearLayout主にボタンなどのUIパーツを縦に並べるレイアウト方式。設定画面などに便利
RelativeLayout
TableLayoutテーブル形式のレイアウトなどに利用

Edit
GUIビルダーについて

AndroidでもiPhone Interface Builder(以下IB)を同じような、画面をレイアウトするツールが提供されている。ただIBと同じでダイナミックに作成されるビューにはあまり向いているとはいえず、デザイン変更などで分かりづらくなってしまうことが散見する。よって、設定ページや固定レイアウトのページでは効果的であるものの、一般的なアプリのメイン画面では使いづらいと思われる。

ちなみに、Javaの特性上、リソースを一切含まないプロジェクトであるなら、それをjarの形のライブラリにしておくことができるという情報もあり、配慮の必用がありそうだ。

Edit
メニューボタンについて

androidでは、すべての機種にメニューボタンというものがついており、ここを押すことで対象となる画面のメニューがモーダルで現れるようになっている。ここのコードはActivityのメソッドで定義することでメニューの遷移を記述できる。

private static final int MENU_ITEM_ADD = 0;
private static final int MENU_ITEM_SET = 1;
// メニューボタンが最初に押された場合に呼ばれる
@Override public boolean onCreateOptionsMenu( Menu menu ) {
	super.onCreateOptionsMenu(menu);
	MenuItem itemAdd = menu.add( 0, MENU_ITEM_ADD, 0, "Add" );
	MenuItem itemSet = menu.add( 0, MENU_ITEM_SET, 1, "Seeting" );
	itemAdd.setIcon( android.R.drawable.ic_menu_add );
	itemSet.setIcon( android.R.drawable.ic_menu_preferences );
	return true;
}
// メニューが表示された時に呼ばれる。
@Override public boolean onPrepareOptionsMenu( Menu menu ) {
	super.onPrepareOptionsMenu(menu);
	menu.findItem(MENU_ITEM_ADD).setEnabled(true);
	menu.findItem(MENU_ITEM_SET).setEnabled(false);
	return true;
}
// メニューが選択された時に呼ばれる。
@Override public boolean onOptionsItemSelected( MenuItem item ) {
	super.onOptionsItemSelected(item);
	if( item.getItemId() == MENU_ITEM_ADD ){
		Log.d( "DEBUG_TEST", "code = MENU_ITEM_ADD" );
	}else{
		Log.d( "DEBUG_TEST", "code = MENU_ITEM_SET" );
	}
	return true;
}	

Edit
CPUの違いについて。

Androidでは、複数のcpuに対応しているため、出来上がった apk には複数の cpu に対応したバイナリが作成できる。そのため、apk のバイナリ認識順番がパフォーマンスにも影響します。(例:arm7v の cpu なのに、arm5vのソースを優先ロードしてしまうなど)

<8桁のバージョンコードの解説>

第1桁:ABIの種類(1..arm5v, 2..arm7v, 6..x86)
第2~3桁:APIのバージョン(14, 21 などの API番号)
第4~5桁:スクリーンサイズ種別コード
第6~8桁:アプリのバージョン番号

Edit
Emulatorや実機接続時のデバッグについて

Android Emulator や、実機とPCの接続では、adb というコマンドを利用するが、その際の端末に割り振られた情報を利用する場合以下のようなコマンドがある。

Edit
端末のインターフェイスの確認

# adb shell ls /sys/class/net

また、上記の情報を元に割り振られたIPアドレスを確認するには、

# adb shell ifconfig eth0

Edit
テストについて

Edit
android仮想領域にファイルをコピーする。

emulatorなどでテストをする場合に、androidの仮想領域にデータを保存しておきたい場合がある。その場合には以下のコマンドでファイルをコピーすることができる。

adb push source_file.mp4 /data/source_file.mp4

これは、source_file.mp4 を、仮想領域の/dataフォルダにコピーする。また、コピーしたデファイルなどを削除する場合には、以下のコマンドで削除できる。

adb shell rm /data/source_file.mp4

基本的にandroidはLinuxで稼働していることから、adb shell コマンドを利用することで、androidのOSに対して、Linuxコマンドを発行できる。よってこのようなrmコマンドを利用することで、ファイルの削除ができる。

Edit
DDMS(Dalvik Debug Monitor Service)の起動

android開発環境にはDDMSというデバッグモニタが付いている。eclipseの「ウィンドウ -> パースペクティブを開く -> DDMS」でDDMSが起動する。上記のファイル操作なども、ここのFile Explolerを利用することで、マウスでファイルを操作することができる。またDDMSはアプリ(JavaVM)が起動されると、自動的にアプリとの通信用にポート8600番からを占有する。また、8700番はEclipseとの接続用に固定される。(下記写真を参照の事)

主な機能

  1. Emulatorデバイスの選択
  2. 仮想デバイスで稼働しているアプリの一覧表示(割り当て割れたポート番号も表示)
  3. 仮想デバイスのフォルダ管理
  4. ポート-フォワーディングサービス
  5. スクリーンキャプチャー
  6. 仮想デバイス上のスレッド情報の取得
  7. 仮想デバイス上のヒープ情報の取得
  8. logcat
  9. プロセス管理
  10. 無線状態の取得
  11. テスト用に疑似音声着信と疑似SMSの設定
  12. テスト用に疑似位置情報データの設定

DDMSのデバイスリスト画面

DDMS_DeviceList.png

Edit
Logの出力

多くの開発においてLog出力は重要なデバッグ手法である。androidでも、Logコマンドを利用し、logcatにlog情報を出力できる。

Logの例

int x = 10;
Log.d("MyApp", "x=" + x);

Logにはメソッドの指定によって、d=debug(デバッグ用、上記例ではこのdが指定されている), w=warning(注意), v=verbose(詳細), i=info(報告), e=error(エラー)という分類を指定できる。また第1引数には自分のアプリ名、第2引数にはLog文章を入れる。

Edit
メモリーリークについて

Edit
スレッドすら停止してしまう現象について

Androidでは、なぜかMediaPlayerの利用ミスによる、バグによってThreadなどが停止してしまうバグが存在する。MediaPlayerのテストは十分かつ、念入りなテストと動作確認をしてから、本編に組み込み用に心がけた方が良いだろう。

Edit
Topコマンドについて

Androidでは、adb shell コマンドを利用することで、実機にshellのログインができる。ここでTopコマンド利用することが多いと思うが、各項目は以下の通りと思われる。

項目名説明
PIDプロセスID、DDMSのTIDと同じLinux上でのプロセス管理番号
CPU%CPUの利用比率
Sプロセスのステータス。Rは実行可能,Sは停止,Dは割り込み不可の停止,Tは停止またはトレース中,Zはゾンビ・プロセス,Wはスワップ・アウトしたプロセス,Nはナイス値が正であることを表す
#THRスレッドの数、DDMSのThreads項目でその明細を確認できる
VSS(virtual set size)使用している仮想メモリー量
RSS(resident set size)使用中の物理メモリー量
PCY
UIDユーザーID、通常アプリケーションの場合は、app_xxという名前が割り振られる
Nameアプリケーションのパッケージ名

Edit
デバッグモードにおける証明書の情報

Keystore name: debug.keystore
Keystore password: android
Key alias: androiddebugkey
Key password: android
CN (common name): CN=Android Debug,O=Android,C=US

Edit
開発TIPS

Edit
小技系

Edit
アプリのタイトルネーム表示を消す

通常はアプリケーションの名前が一番上に表示されるため少しだけ表示エリアが狭くなっている。このアプリ名表示エリアを消す方法。(onClickメソッド等に記述)

requestWindowFeature(Window.FEATURE_NO_TITLE);

Edit
ライブラリプロジェクトを作成し自作アプリからクラス参照する。

ライブラリのプロジェクトを作成し、いろいろなアプリで共有したい場合は多いと思われる。その際には、以下の手順でAndroidプロジェクトを作成する。

  1. プロジェクトを通常の方法で作成する。Activityは作らないのでチェックを外しておく。
  2. できあがったプロジェクトを右クリックし、プロパティーの中にあるAndroidタグに、isLibraryというチェックがあるので、ここをチェックする。
  3. リソースのdrawableのicon.pngや、layoutのmain.xmlなど無駄なファイルを削除し、AndroidManifest.xmlの中も、Application以下をすべて削除する。
  4. 最後にアプリ側のプロジェクト設定の中のAndroidタグに「Add」ボタンで先程の作成したライブラリの名前が表示されるので、選択してプロジェクトにリンクするライブラリと指定することで、自動的に/gen の下にライブラリとして追加される。


※このライブラリ登録がされていないと、コンパイルがうまく行っても実行時に「Could not find xxxx class...」などのライブラリとして作成したクラスが見つからないエラーを表示してアプリが落ちる

Edit
機種情報の取得

Androidの機種情報は以下のコードで取得できる。

import java.lang.reflect.Field;
Field[] fs = Build.class.getDeclaredFields();
for(Field f : fs){
   f.setAccessible(true);
   String key = f.getName();
   String name = f.get(null).toString();
}

このサイトでこのキーの概要について説明している。
また、機種毎のデバイス名などの詳細情報については、ここのページが詳しい。

Edit
プロファイリング

Android SDKに含まれているトレースツールの使い方。Activityの本体に下記のソースを埋め込む。

onCreateメソッドの中の先頭に以下の行を追加

//プロファイリング開始
Debug.startMethodTracing("profile");

onDestoryメソッドの中の先頭に以下の行を追加

//プロファイリング終了
Debug.stopMethodTracing();


その後、Androidの実機からトレースデータを取得して表示

# adb pull /sdcard/patom.trace ./tmp/profile.trace
# traceview ./tmp/profile.trace

Edit
SOファイルの中身をみる

Androidでは、NDKで作成したSOファイルの中身は、LinuxのELFファイルという形式で保存されている。そのため、ARMにあわせたreadelfコマンドが、android ndkで提供されており、以下のように指定することで、SOファイルの中を確認できる。 <登録されているダイナミック情報>

# arm-linux-androideabi-readelf -d libtest.so

<登録されているシンボル情報の一覧>

# arm-linux-androideabi-readelf -s libtest.so

<登録されているすべての情報>

# arm-linux-androideabi-readelf -a libtest.so

この readelf コマンドは、linuxのコマンドでありandroid用かつ各アーキテクチャ用の実行ファイルが存在する。

Edit
画像読み込み

Edit
ZipFile

Edit
データ保存

Edit
Androidのソース本体の取得

Androidでは、オープンソースで開発されているため、本体のソースコードを取得することができる。開発を行う上ではDebugの為や、勉強に為にソースを入れておくことを推奨する。

URL : http://android.git.kernel.org/?p=platform/manifest.git;a=summary
# mkdir android-src
# cd android-src
# repo - init -u git://android.git.kernel.org/platform/manifest.git -b android-2.1_r2
# repo sync

※android-2.1_r2の部分は、自分が開発するSDKのバージョンに合わせてURLのページから取得する
※またrepoコマンドは、iPhone開発のページを参照の事
※上記のデータ取得が面倒な場合には、ここに纏めたものをおく

取得したデータからeclipseで利用できるようにファイルをコピーする
eclipseからandroidのソースをみれるようにするには、上記で作成された android-src のフォルダの中から、すべてのフォルダにおいて、srcフォルダ以下のソースを、android-sdkの中に入れ、eclipseを再起動するだけで、F3でandroid本体のソースがみれる。

%android-sdk-windows等%/platforms/android-7/sources/ <- このフォルダ以下に入れる。

Edit
アプリからLogcatの取得

Edit
余分なデータの削除

arm-eabi-strip

Edit
参考ページ

Edit
アイコンについて

Edit
Macでの開発

Edit
OSX版のEclipseで便利なキー

キー機能
CTRL + Space入力中の単語の保管を行う。メソッド入力時はメソッドリストを表示
F3キー選択されているコマンドの定義ファイルにジャンプする
F4キー型階層を開く
F5キー最新の状態にする。主にプロジェクトにリソースを追加した時など(R.javaの更新)
command + 1カーソル付近の単語の選択修正
command + /選択行をコメントアウトする。もう一度押すと解除
command + m選択中のビューを最大化する。もう一度押すと解除
command + w選択中のビューを閉じる。
command + eエディットファイルの切り替え
command + s選択しているファイルの保存
command + d選択している行を1行削除する
command + f検索と置換
command + iインデントの自動修正(便利)
command + [ビュー移動を戻る
command + ]ビュー移動を進める
command + zundo
command + option + q各種ビューを開く。選択ウィンドウが表示される
command + option + jカーソルのあるメソッドにJavaDocを元にコメントを追加
command + oクイック・アウトライン。ファイルのアウトラインを表示
command + Shift + o不足しているimport分を選択で簡単追加
command + gメソッドを呼び出している個所を検索し、検索ビューに表示
CTRL + hクラス名を入力して、メソッドを呼び出している個所を検索し、検索ビューに表示
command + t型階層ウィンドウの表示
command + option + t該当メソッドを呼び出しているものを階層表示
command + option + rリファクタリング。プロジェクト内に対して対象語を置換

Edit
トラブルシューティング

Android Emulator (AVD)が起動しない


リソースを足したのに、R.javaが更新されない
androidでは、以下の条件の時に自動生成のはずのR.javaが更新されない。

  1. mail.xmlなどのxmlファイルにエラーが存在する。
  2. resフォルダ以下のフォルダよりも更に深いフォルダにファイルをおいた場合。


.svnのファイルがプロジェクトに認識されwarningを出力してしまう
eclipseの「環境設定」->「Java」->「コンパイラー」->「ビルド」の中の、出力フォルダの左の矢印をクリックするとテキストボックスが出てくる。デフォルトでは「*.launch」のみだが,これを「*.launch, .svn」に変更することで解決する。


使っていないクラスのimport文を自動的に削除する
Eclipseの「環境設定」->「Java」->「Editor」->「保管アクション」を選択し、「保管時に選択したアクションを実施」と「インポートの構成」の二つをチェックする。


osxにEasyTetherをインストールするとadbがデバイスを認識しなくなる
Android開発時には、EasyTetherをOFFにする。

# sudo kextunload /System/Library/Extensions/EasyTetherUSBEthernet.kext

ONにする

# sudo kextload /System/Library/Extensions/EasyTetherUSBEthernet.kext

状態を見る

# kextstat |grep EasyTether

Edit
Android端末の解像度

Edit
ドコモ機種一覧

機種製造CPUCore数RAMROM解像度GPUAndroidOS
MEDIAS LTE N-04DNECAPQ8060 1.5Ghz21GB16GB1280x720Adreno 2202.3
Galaxy S II LTE SC-03DサムスンAPQ8060 1.5Ghz21GB16GB800x480Adreno 2202.3
ARROWS X LTE F-05D富士通Cortex-A9 1.2Ghz21GB8GB1280x720PowerVR SGX540 304Mhz2.3.5
Optimus LTE L-01DLGAPQ8060 1.5Ghz21GB4GB1280x720Adreno 2202.3
ARROWS μ F-07D富士通MSM8255 1.4Ghz1512MB1GB800x480Adreno 2052.3.5
MEDIAS PP N-01DNECMSM8255 1.4Ghz1512MB2GB800x480Adreno 2052.3
REGZA Phone T-01D東芝Cortex-A9 1.2Ghz21GB4GB1280x720PowerVR SGX540 304Mhz2.3
AQUOS Phone SH-01DSHARPCortex-A9 1Ghz21GB1GB1280x720PowerVR SGX540 304Mhz2.3
GALAXY NEXUS SC-04DサムスンCortex-A9 1.2Ghz21GB16GB1280x720PowerVR SGX540 384Mhz4.0
ARROWS kiss F-03D富士通MSM8255 1.4Ghz1512MB1GB800x480Adreno 2052.3
Q-pot.Phone SH-04DSHARPMSM8255 1GHz1512MB2GB960x540Adreno 2052.3
AQUOS PHONE slider SH-02DSHARPMSM8255 1GHz1512MB2GB960x540Adreno 2052.3
LUMIX Phone P-02DPanasonicOMAP4430 1GHz21GB2GB960x540PowerVR SGX540 304MHz2.3
P-01DPanasonicMSM8255 1GHz1512MB1GB800x480Adreno 2052.3
Xperia PLAY SO-01DSONYMSM8255 1GHz1512MB1GB854x480Adreno 205 245MHz2.3.4
Xperia ray SO-03CSONYMSM8255 1GHz1512MB1GB854x480Adreno 2052.3
MEDIAS WP N-06CNECMSM8255 1GHz1512MB1GB854x480Adreno 2052.3
Xperia acro SO-02CSONYMSM8255 1GHz1512MB1GB854x480Adreno 2052.3.3
GALAXY S II SC-02CサムスンExynos 4210 1.2GHz21GB16GB800x480Mali-4002.3
P-07CPanasonicOMAP3630 1GHz1512MB1GB854x480PowerVR SGX5302.3
F-12C富士通MSM8255 1GHz1512MB1GB800x480Adreno 2052.3.4
AQUOS PHONE f SH-13CSHARPMSM8255 1GHz1512MB2GB960x540Adreno 2052.3.4
Optimus bright L-07CLGOMAP3630 1GHz1512MB2GB800x480PowerVR SGX 5302.3
AQUOS PHONE SH-12CSHARPMSM8255T 1.4GHz1512MB2GB960x540Adreno 2052.3
Xperia arc SO-01CSONYMSM8255 1GHz1512MB1GB854x480Adreno 2052.3
MEDIAS N-04CNECMSM7230 800MHz1512MB1GB854x480Adreno 2052.2
Optimus chat L-04CLGMSM7227 600MHz1512MB1GB480x320Adreno 2002.2
REGZA Phone T-01C東芝QSD8250 1GHz1512MB1GB854x480Adreno 2002.1
LYNX 3D SH-03CSHARPQSD8250 1GHz1512MB1GB800x480Adreno 2002.1
GALAXY S SC-02BサムスンS5PC110 1GHz1512MB512MB800x480PowerVR SGX5402.2
LYNX SH-10BSHARPQSD8250 1GHz1512MB4GB960x480Adreno 2001.6
Xperia SO-01BSONYQSD8250 1GHz1384MB1GB854x480Adreno 2001.6
HT-03AHTCMSM7201a 528MHz1192MB512MB480x320none1.5
GALAXY Tab SC-01CサムスンS5PC110 1GHz1512MB512MB1024x600PowerVR SGX5402.2

Edit
au機種一覧

機種製造CPUCore数RAMROM解像度GPUAndroidOS
INFOBAR A01SHARPMSM8655T 1.4GHz1512MB1.1GB960x540Adreno 2052.3
IS-03SHARPQSD8650 1GHz1512MB512MB960x640Adreno 2002.1
REGZA Phone IS-04富士通QSD8650 1GHz1400MB1GB854x480Adreno 2002.1
IS-05SHARPMSM8655 1GHz1512MB512MB854x480Adreno 2052.2
SIRIUS α IS-06P&CQSD8650 1GHz1512MB512MB800x480Adreno 2002.2
Evo WiMAX ISW11HTHTCQSD8650 1GHz1512MB1GB800x480Adreno 2002.2
Xperia acro IS11SSONYMSM8655 1GHz1512MB1GB854x480Adreno 2052.3
AQUOS PHONE IS11SHSHARPMSM8655T 1.4GHz1512MB2GB960x540Adreno 2052.3
G'zOne IS11CANECMSM8655 1GHz1512MB1GB800x480Adreno 2052.3
AQUOS PHONE IS12SHSHARPMSM8655T 1.4GHz1512MB2GB960x540Adreno 2052.3.3
REGZA Phone IS11T東芝MSM8655T 1.4GHz1512MB1GB854x480Adreno 2052.3.4
Evo 3D ISW12HTHTCMSM8660 1.2GHz21GB4GB960x540Adreno 2202.3.4
MOTOROLA PHOTON ISW11MMotorolaTegra250 1GHz21GB16GB960x540ULP GeForce GPU (Tegra2 AP20H)(Tegra250)2.3.4
AQUOS PHONE IS13SHSHARPMSM8655T 1.4GHz1512MB4GB960x540Adreno 2052.3.5
MEDIAS BR IS11NNECMSM8655T 1.4GHz1512MB2GB800x480Adreno 2052.3.5
MIRACH IS11PTP&CMSM8655 1GHz1512MB1GB800x480Adreno 2052.3
DIGNO ISW11K京セラMSM8655T 1.4GHz11GB4GB800x480Adreno 2052.3.5
ISW11F富士通OMAP4430 1.2GHz21GB8GB1280x720PowerVR SGX540 304MHz2.3.5

Edit
Softbank機種一覧

機種製造CPUCore数RAMROM解像度GPUAndroidOS
AQUOS PHONE 102SHSHARPOMAP4430 1GHz21GB2.2GB1280x720PowerVR SGX540 304MHz2.3
AQUOS PHONE 104SHSHARPOMAP4460 1.5GHz21GB-1280x720PowerVR SGX540 384 MHz4.0
LUMIX Phone 101PPanasonicOMAP4430 1GHz21GB2GB960x540PowerVR SGX540 304 MHz2.3
HONEY BEE 101K京セラMP5225 1.2GHz2512MB1.5GB800x480PowerVR SGX543 MP2.3
AQUOS PHONE 101SHSHARPMSM8255 1GHz1512MB-854x480Adreno 2052.3
AQUOS PHONE 103SHSHARPMSM8255T 1.4GHz1--960x540Adreno 2052.3
STAR7 009ZZTEMSM8255 1GHz1512MB4GB800x480Adreno 2052.3
MEDIAS CH 101NNECMSM8255T 1.4GHz1--800x480Adreno 2052.3
STREAK PRO 101DLDELLMSM8260 1.5GHz21GB8GB960x540Adreno 2202.3
AQUOS PHONE 007SHSHARPMSM8255 1GHz1512MB2GB854x480Adreno 2052.3
AQUOS PHONE 006SHSHARPMSM8255T 1.4GHz1512MB2GB960x540Adreno 2052.3
AQUOS PHONE 009SHSHARPMSM8255 1GHz1512MB1GB960x540Adreno 2052.3
Sweety 003PPanasonicOMAP3630 1.0GHz1512MB1GB854x480PowerVR SGX5302.3
Vision 007HWHuaweiMSM8255 1GHz1512MB2GB800x480Adreno 2052.3
シンプルスマホ 008ZZTEMSM8255 1GHz1512MB4GB800x480Adreno 2052.3
GALAPAGOS 003SHSHARPMSM8255 1GHz1512MB1GB800x480Adreno 2052.2
GALAPAGOS 005SHSHARPMSM8255 1GHz1512MB1GB800x480Adreno 2052.2
Libero 003ZZTEMSM7227-1 600MHz1512MB115MB800x480Adreno 2002.2

Edit
アップル製品

機種製造CPUCore数RAMROM解像度GPUOS version
iPhone4SAppleApple A5 800MHz2512MB16GB-64GB960x640PowerVR SGX543MP2iOS 5
iPhone5AppleApple A621GB16GB-64GB1136x640PowerVR SGX543MP3iOS 6
iPhone5sAppleApple A721GB16GB-64GB1136x640PowerVR G6430iOS 7
iPad 4thAppleApple A6X21GB16GB-64GB2048x1536PowerVR SGX554MP4iOS 6
iPad MiniAppleApple A52512MB16GB-64GB1024x768PowerVR SGX543MP2iOS 6

※APQとMSMはQualcomm社製。CortexはARM社製。OMAPはTexas Instruments社製。ExynosとS5PC110はサムスン社製(ベースはARM)。ZTEは中国の会社。


密度の違い(Density Per Inch)記述(res/drawable)
high(190〜250dpi:基準240dpi)res/drawable-hdpi
midium(140〜180dpi:基準160dpi))res/drawable-mdpi
low(100〜140dpi:基準120dpi)res/drawable-ldpi
dpi に関係なく使用する画像を保存する場合res/drawable-nodpi


参考ソース

/* DIPとピクセルの変換 */  
mMetrics = new DisplayMetrics();  
getWindowManager().getDefaultDisplay().getMetrics(mMetrics);  
scaleDensity = mMetrics.scaleDensity;  
pixcels = dips * scaleDensity;  
/* 画面サイズの取得ソースコード */  
Display display = getWindowManager().getDefaultDisplay();  
int height = display.getHeight();  
int width = display.getWidth();  
/* Supports-Screensの記載例 */  
<supports-screens  
    android:largeScreens="true"  
    android:normalScreens="true"  
    android:lSmallcreens="true"  
    android:andDensity="true" />  
<uses-sdk android:minSdkVersion="4" />

Edit
実際のスペック(Quadrant Standard Editionで調査)

メーカー機種名(型番)TotalCPUMemI/O2D3D
SamsungSC-02D30684724384339449901839
SC-03D37225740287871056672220
SC-04D19295415185410621961119
SonySO-01D1176195013929162981326
SO-02D22624311164335262301602
富士通F-03D15052753140812473881727

Edit
機種依存情報

Edit
トラブルシューティング

Edit
Galaxy Tabでインストール時にTime outになる。

Eclipseの全体のPreferencesに、Androidタグのあるので、その中のDDMSの項目の中に、ADB connection timeoutという項目があるので、その時間を5000から20000などの長い時間に変更する。

Edit
android java.lang.ClassNotFoundException:が発生する。

AndroidManufest.xml のパッケージ名など、パッケージに関する設定がおかしい場合に発生する。

Edit
GLSurfaceViewや、SurfaceViewを複数使った場合に順番がおかしくなる。

Androidでは、SurfaceViewの継承クラスが複数あるような場合、SurfaceFlingerというOSの上に直結した特殊な画面合成レイヤーが存在し、それらが複数のSurfaceの描画順を、内部のZ値(深度)を元に処理を行うが、Z値がシーン切り替えなどの画面に変化があったときに、再度、それぞれのSurfaceに動的に値が設定されるが、その値は同一のActivity内のSurfaceの場合、適当になるという恐ろしいバグのような仕様がある。そこで、onCreateを代表する、onSuspendやonResumeなどすべての画面変化があるタイミングで、一番上になるSurfaceに対して、SurfaceView.setZOrderOnTop(true); という形でZを強制的にTOPする機能を使い表示順を調整する必要がある。

Edit
GLSurfaceViewにRenderを登録したが、RenderのonSurfaceCreateなどが呼び出されない。

GLSurfaceViewは特殊なSurfaceViewであり、通常のSurfaceView用の、SurfaceHolder.callback関数として登録するべき、surfaceCreatedやsurfaceChangedなどは、Render登録をしたクラスの中に、onSurfaceCreatedや、onSurfaceChangedなどという名前に変更して登録する必要がある。ただしsurfaceDestroyedは、Renderでは定義できない為、GLSurfaceViewのメソッドとして登録する必要がある。
※もし、GLSurfaceViewにも、Renderクラスにも、surfaceCreatedの関数を両方に記述した場合、Renderのクラスで定義されたonSurfaceCreatedなどは、呼び出されない。ただし、そのメソッド内で、super.surfaceCreated(holder)のように、superクラスに転送を行うと、無事にRenderのonSurfaceCreatedにもイベントが届く。

Edit
GLSurfaceViewでsurfaceDestroyedで落ちる。

上記の項目とも関係するが、GLSurfaceViewのメソッドに記述する、surfaceDestroyedメソッドは、特殊でこのメソッドの最後に、super.surfaceDestroyed(holder); という形で、superクラスのメソッドを呼ぶことで、Renderの破棄を行うのため、必ず指定すること。

Edit
NullPointerException at android.view.ViewGroup.dispatchDrawで落ちる

自分のプログラムではなく、AndroidOSの内部で落ちるようなバグの場合、基本的にはスレッドによる問題である場合が多い。タイマースレッドやOpenGLのスレッド内から、UI関係の処理(SurfaceViewなどへの描画処理が多い)を行うような場合に発生する。このような場合は、Handlerクラスを用いて、UIスレッド(メインスレッド)で行わなくてはならない処理を、通知して実行させる必要がある。

Edit
Androidの「Debug certificate expired」エラーの対処方法(OSX)

シェルを起動し、ターミナルのエンコードを、SHIFT-JIS に変更後以下のコマンドを実行する。(passwordは 'android' )

keytool -genkey -v -keystore debug.keystore -alias androiddebugkey -keyalg RSA -validity 10000 -dname "CN=Android Debug,O=Android,C=US"

できあがった debug.keystore を、eclipseの設定->Android->Buiildに書かれている、default keystoreの場所のdebug.keystoreに上書きする。
また、すでにテストしていたアプリはuninstallしてから、テストするようにする。

Edit
NoClassDefFoundErrorの場合のエラー対応

  1. 利用しているクラスが、プロジェクト設定のJava Build Pathの、ライブラリの項目に追加されているか。
  2. 上記で追加されたライブラリが、となりのタブのOrder and Exportの項目で、正しい適用順となっており、かつ、ライブラリの左の、export指定を表すチェックにマークが付いているか?

Edit
Android端末における機種依存問題

Edit
Nativeメモリはfreeしても、gcに渡されるだけ。

どうやらAndroidのNativeでのmallocとfreeは特殊なようだ。mallocやfreeの対象となるシステム上のヒープ領域は、実際、Dalvik管轄下でGC(ガーベージコレクション)と連動されている。そのため、基本的にはmallocすると新規の領域が確保され、freeした場合には解放されるべき領域として解放待機に入る。これはメモリの使用量などを表示すると、一見無尽蔵に確保されつづけ、一定の量になるとgcは発動して未使用領域を解放する。

Edit
Xperia系の機種では、Nativeのメモリ空間の未使用領域の解放が自動で行われない。

多くのメーカーのAndroidのNative実装の部分においては、メモリ管理が機種によって微妙に異なっており、問題となる。Xperiaでも、他のメーカーのものと同じように、DalvikのGCとの連携をはかってはいるのだが、System.gc()のように、明示的にGCを起動させないと、Nativeメモリの解放が行われない。そのため、この点を意識せずに作ると長時間稼働などで落ちる。

Edit
MediaPlayerなどのサウンド再生クラスの機種依存

サウンドなどハードに依存しそうな機能も当然ながら機種依存となる。特にmp3などの圧縮フォーマットへの対応や、ギャップレス対応など、millisecond単位の再生位置指定の正確性などは、典型的な部分となる。特にサウンドなどは、JNIのC言語ライブラリで、ハードを直接たたき、CPUの複数コアを利用したマルチスレッドになっている場合も多く、非常に複雑なため、メーカー毎の差が出やすい。

Edit
グラフィックチップによる機種依存

GPU名称圧縮テクスチャー
Mali-400ETC1

特にスプライト系(四角い画像の描画)の描画は以下の順で速度が違う。

処理方法早さ
基本的描画:vertex arraysを利用遅い
VBOを使って、頂点情報の再利用早い
DrawTextureExtensionを利用して描画一番早い


OpenGLの機能Type-AType-B
OES_rgb8_rgba8
OES_fbo_render_mipmap
OES_compressed_ETC1_RGB8_texture
OES_EGL_image
OES_EGL_sync×
OES_EGL_image_external×
OES_mapbuffer×
OES_vertex_half_float
OES_vertex_type_10_10_10_2×
OES_texture_half_float
OES_texture_float
OES_texture_3D×
OES_texture_half_float_linear×
OES_texture_npot×
OES_depth_texture×
OES_depth24×
OES_element_index_uint×
OES_fragment_precision_high×
OES_get_program_binary×
OES_packed_depth_stencil×
OES_standard_derivatives×
EXT_Cg_shader×
EXT_packed_float×
EXT_texture_array×
EXT_texture_compression_latc×
EXT_texture_compression_dxt1×
EXT_texture_compression_s3tc×
EXT_texture_filter_anisotropic
EXT_bgra×
EXT_texture_format_BGRA8888
EXT_unpack_subimage×
EXT_texture_type_2_10_10_10_REV×
NV_fence×
NV_platform_binary×
NV_depth_nonlinear×
NV_draw_path×
NV_texture_npot_2D_mipmap×
NV_framebuffer_vertex_attrib_array×
NV_coverage_sample×
NV_get_tex_image×
NV_read_buffer×
NV_shader_framebuffer_fetch×
NV_fbo_color_attachments×
ARB_draw_buffers×
QCOM_driver_control×
QCOM_perfmon_global_mode×
QCOM_extended_get×
QCOM_extended_get2×
QCOM_tiled_rendering×
QCOM_writeonly_rendering×
QCOM_memory_monitor×
AMD_compressed_3DC_texture×
AMD_compressed_ATC_texture×
AMD_performance_monitor×
AMD_program_binary_Z400×
Type-ANVIDIA Tegra(Motorola Xoom)
Type-BQualcomm Adreno(Nexus One)

Edit
まめ知識

Edit
SOファイルについて

NDKで作成される、.a や .so ファイルは、コンパイラに自動的に「-fPIC」オプション(position-independent codeの事)が指定され、再リンクが可能な形になっている。

Edit
neonでコンパイル

gcc のオプション指定で、-mfpu=neon -mfloat-abi=softfp の両方を指定しないとneon稼動しない。

Edit
Androidにインストールされているパッケージの一覧

# adb shell pm list package

Edit
Androidでインストールされる証明書について

sdk>/tools/ant/build.xml で apk にインストールされる。 key.stone の場所は、主に c:\User\<user>\.android\key.stone

Edit
apkの証明書確認方法

# jarsigner -verify -verbose -certs my_application.apk

Edit
証明書のエラー(INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES)

以前にインストールした apk と、これからインストールする apk の証明書が違うため、一度、以前にインストールした apk をアンインストールする。

また、apk をアンインストールしても、エラーになる場合は、デバイスの下記フォルダを消す。

/data/data/<アプリケーション名> /data/app/<アプリケーション名>

Edit
vCARDの参考ページ

Edit
その他のリンク

添付ファイル: fileDDMS_DeviceList.png 1352件 [詳細] filenew_var.JPG 848件 [詳細]