2010年12月25日土曜日

android.util.Logのtag用にログ出力元のクラス名を取得する

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
android.util.Logの各種ログ出力メソッドの第一引数にはtagを指定しますが、
普通、どういった値を指定するものなのでしょうか?
現在のDDMSではログの絞込みにandやorや正規表現とか使えないので、
ある機能を満たすモジュール群で統一するとかいった感じでしょうか。

個人的には、「ログを実際出力させているクラス名」を常に使うようにしています。
毎回クラスの頭で
private final static String TAG = クラス.class.getSimpleName();
とやっています。
ところがこれ、クラス.class.getSimpleName()って書くのが地味にめんどくさいんですね。
なんとか統一的な書き方が出来ないものか、と思ってやってみました。

クラス名取得の為にスタックトレースを拝借する

とりあえず、tagの値を生成するUtilクラスを作る事にします。
Utilクラスは以下のメソッドを持ってます。
public static String tag()                        //クラスのフルネームを返す
public static String sTag()                     //クラスのパッケージ名を除いた名前を返す                
private static String getTag(int depth)     //クラスのフルネーム取得用メソッド

■getTag(int depth)
色々考えた結果、下記の用にスタックトレースでメソッドの呼び出し元のクラス名を引っ張る、てのを思いついたのでやりました。
引数にintを貰って、スタックトレースのどこまで遡るか決めます。直前の呼び出し元なら1を指定します。
private static String getTag(int depth) {
try {
throw new Exception();
} catch (Exception e) {
StackTraceElement[] es = e.getStackTrace();
if (es != null && es.length >= depth) {
return es[depth].getClassName();
}
}
return "DEFAULT";
}

■tag()
クラスのフルネームを取り出します。コールグラフは
-呼び出し元
    -tag()
        -getTag(int)
になるので、depthに2を指定しています。
/**
 * 呼び出し元のクラスのフルネームを返す.ex:jp.dip.sys1.android.aozora.util.Util
 * 
 * @return クラスのフルネーム
 */
public static String tag() {
return getTag(2);
}

■sTag()
クラスのフルネームからパッケージ名を取り除いてクラス名だけ返してます。
単純に最後の"."以降を返すようにしてるだけです。
/**
 * 呼び出し元のクラスのパッケージ名を除いた名前を返す.ex:Util
 * 
 * @return クラス名
 */
public static String sTag() {
String tag = getTag(2);
int i = tag.lastIndexOf(".");
return tag.substring(i == -1 ? 0 : i + 1);
}

使う&パフォーマンス

実際使ってみます。
■TestUtil.java
public void testTag() {
String correctString = "jp.dip.sys1.android.util.TestUtil";
String tag = Util.tag();
Log.d(tag, "testTag()");
assertTrue("is not match:" + tag, correctString.equals(tag));
}
public void testSTag() {
String correctString = "TestUtil";
String tag = Util.sTag();
Log.d(tag, "testSTag()");
assertTrue("is not match:" + tag, correctString.equals(tag));
}

いい感じで取り出せたっぽいですね

なんだかExceptionをいちいちthrowしてごにょごにょって何だか気持ち悪いなーと思う所なんですが、
まぁ
private final static String TAG = Util.sTag();
と統一して書けるからいいのかなぁ・・・と。
パフォーマンスとかどーなんだろう、と思って、正しい計測の仕方かどうかよくわかって無いんで是非ご指導頂きたいんですが
1000回ずつログを出してかかった時間を比較する以下の様なテストコードで測ってみました。
Util.startCountTimeとかUtil.endCountTimeはSystem.currentTimeMillis()で取った時間を保存しておいて後で引く感じになってます。内部的に。
private final static String TAG = TestUtil.class.getSimpleName();
public void testTagPerformance() {
Util.startCountTime(this);
for (int i = 0; i < 1000; i++) {
Log.d(TAG, "test" + i);
}
Log.d("test", "time1:" + Util.endCountTime(this));
Util.startCountTime(this);
for (int i = 0; i < 1000; i++) {
Log.d(Util.tag(), "test" + i);
}
Log.d("test", "time2:" + Util.endCountTime(this));
}

結果
TAG: 752ms
Util.getTag():6768ms

9倍。かなり遅い。けど、

private final static String TAG = Util.sTag();
の書き方ならクラスローディングの時一回実行されるだけだしいいんじゃないのかなーと。

どうなんでしょ。

※2010/12/25 1:49 追記
@zaki50さんから一瞬でアドバイスが!

Eclipseの設定でクラス作るときにクラスのbody部分にテンプレートを定義できるとの事!

Eclipseのメニューの
[Window]-[Preference]
で設定を開き、
[Java]-[Code Style]-[Code Templates]-[Code]-[Class body]

private static final String TAG = ${type_name}.class.getSimpleName();
を追加する。

そして、
クラスを新規で作成してみると・・・


おおおおおお!
超楽。Eclipse万歳!
Eclipseもっと活用しないと・・・。本買うか・・・!

@zaki50さんありがとうございました!!

2010年12月23日木曜日

DDMSを改造"せず"に、logcatに日本語出す!

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

目的

だってDDMSを改造して、logcatに日本語を出す!みたくAndroidのソース落としてソースいじってビルドとかって、しゃらくせぇじゃないですか!


環境

試した環境は
Windows 7 64bit Home Premium

手順

  1. Bytemanをダウンロード/インストール
  2. Byteman用のルール、環境変数設定バッチを作る
  3. DDMSの起動バッチ"ddms.bat"をちょっといじる
  4. 起動→できた!

1.Bytemanをダウンロード/インストール

先日このエントリ「BytemanによるJava黒魔術」を見てピーン!ときました。
「DDMSの日本語文字化けって一行修正したら直るんだから、もうBytemanでバイトコードいじっちゃったらいいんじゃねーの!」
Android OSならdexという別世界に行ってしまいますが、DDMSは幸いclassの住人。バイトコードイチコロ。

早速Bytemanからbyteman binary + docsあたりを落としてきて、zipを展開、
android-sdk-windows/tools配下に持って行きます。

2.Byteman用のルール、環境変数設定バッチを作る

Bytemanを使う為に環境変数を設定するバッチファイルと、Byteman用ルールを作成します。
これらもandroid-sdk-windows/toolsに置いておきます。

■rule.txt
どのクラスをどう書き換えるかの定義ファイルです。
今回はjava.lang.StringのコンストラクタにStringのcharsetを指定した場合に内部で呼び出されるjava.lang.StringCoding#decodeをやっつけました。
decodeの第一引数にcharsetが渡ってくるので、
AT ENTRY:メソッドが呼び出された直後
DO $1 = "UTF-8":第一引数を"UTF-8"に書き換える
って感じの事をしてもらっています。
RULE logcat hack
CLASS java.lang.StringCoding
METHOD decode(String , byte[], int, int)
AT ENTRY
IF TRUE
DO $1 = "UTF-8"
ENDRULE

■byteman_env.bat
bytemanを動かす為の環境変数を設定してます。
bytemanはjava.lang.instrument APIを利用するJava言語エージェントなので、Java実行時に-javaagentで「俺が出る!」という設定をしてあげます。
@echo off
set BYTEMAN_HOME=byteman-1.4.1
set BYTEMAN_RULE=rule.txt
set BYTEMAN_OPTS=-javaagent:%BYTEMAN_HOME%\lib\byteman.jar=listener:true,script:%BYTEMAN_RULE%,boot:%BYTEMAN_HOME%\lib\byteman.jar -Dorg.jboss.byteman.transform.all -Dorg.jboss.byteman.debug

DDMSの起動バッチ"ddms.bat"をちょっといじる

ほぼもう準備完了
あとはddms.bat内で実際ddmsを起動しているとこのjavaのオプションに-javaagentでbytemanさんもご一緒して頂く様追記するだけです。
赤字が追記部分です。
■ddms.bat(抜粋)
call byteman_env
call %java_exe% %java_debug% %BYTEMAN_OPTS% -Dcom.android.ddms.bindir= -classpath "%jarpath%;%swt_path%\swt.jar" com.android.ddms.Main %*

起動->できた!

あとはコマンドラインで
>ddms
るだけ!
できた!

2010年12月22日水曜日

ListViewで最後尾までスクロールしたら自動的に要素を追加読み込みするサンプル

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク

概要

Android Marketみたく、ListViewの最後尾に来たらクルクル出して要素追加したいなーと思ったのでやってみました。
内容的には、文字のリストを10個表示し、最後尾までスクロールすると10個さらに追加していく感じです。

ファイル構成

ファイル構成としては以下の様な感じです。
・src
    jp.dip.sys1.android.listview_additional_reading.ListViewAdditionalReading.java

・res
    layout
        listview_footer.xml
        main.xml
他は普通のAndroidプロジェクトと同じです。

ListView最後尾のクルクルはListView#addFooterView(View)で。

ListViewにはaddFooterView(View)なるメソッドがあり、そこに任意のViewを突っ込むと、
ListViewの要素の最後尾に常に表示されるViewを設定する事が出来ます。
という事で、クルクルするViewをListViewにまず突っ込みます。

■listview_footer.xml
単純にProgressBarを真ん中に表示するだけのViewです。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:textAppearance="?android:attr/textAppearanceLarge"
android:minHeight="?android:attr/listPreferredItemHeight"
android:gravity="center">
<ProgressBar android:id="@android:id/text1"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:gravity="center_vertical" />
</LinearLayout>

■ListViewAdditionalReading#onCreate(Bundle)
onCreateの中でListViewのaddFooterViewしときます。多分タイミングはいつでもいいです。多分。
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ListView listView = getListView();
listView.addFooterView(getFooter());
listView.setAdapter(getAdapter());
listView.setOnScrollListener(this);
}

■ListViewAdditionalReading#getFooter()
getFooter()の中でlistview_footerをinflateしてます。
private View getFooter() {
if (mFooter == null) {
mFooter = getLayoutInflater().inflate(R.layout.listview_footer,
null);
}
return mFooter;
}

クルクルは以下の様な感じになります。

ListView最後尾までスクロールしたよね判定はOnScrollListenerで。

フッタは勝手に出るので良いとして、あとは最後尾までスクロールしたという判定が必要です。
そこでandroid.widget.AbsListView.OnScrollListenerを利用しました。

■OnScrollListener#onScroll(AbsListView, int, int, int)
onScrollにはスクロールしているListViewと、表示されている要素の先頭インデックス、要素の表示数、要素の総数が渡ってきます。
「表示されている要素の先頭インデックス」と「要素の表示数」を足した値が「要素の総数」となる時、
ListViewの最後尾まで来た、と判定できそうです。赤字の所で判定を行い、追加読み込みの処理を呼び出すようにしました。

@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (totalItemCount == firstVisibleItem + visibleItemCount) {
additionalReading();
}
}

追加読み込みしたらListView#invalidateViews()で再描画。

■ListViewAdditionalReading#additionalReading
ListViewに要素を追加させる処理です。
AsyncTaskを使っていますが、doInBackgroundでランダムでsleepさせてるだけです。通信処理等が必要な場合はdoInBackground()でメインの処理を行うといいでしょう。
onPostExecute()でListViewの要素追加、そしてListView#invalidateViews()を呼び出しています。
ListViewはデータを表示させる為にAdapterをsetします。AdapterはデータのListを持っています。
要素を追加する場合はListにデータ追加してListView#invalidateViews()を呼び出してあげます。すると表示に反映されます。
private void additionalReading() {
// 読み込み回数が最大値以上ならスキップ。フッタを消す
if (mCount >= MAX_COUNT) {
invisibleFooter();
return;
}
// 既に読み込み中ならスキップ
if (mTask != null && mTask.getStatus() == AsyncTask.Status.RUNNING) {
return;
}
mTask = new AsyncTask<Long, Void, Void>() {
@Override
protected Void doInBackground(Long[] params) {
try {
Log.d(TAG, "sleep..." + params[0]);
Thread.sleep(params[0]);
} catch (Exception e) {
e.printStackTrace();
}
return null;
};

protected void onPostExecute(Void result) {
addListData();
getListView().invalidateViews();
};
}.execute(Math.abs(new Random(System.currentTimeMillis()).nextLong() % 3000));
}

■ListViewAdditionalReading#invisibleFooter()
追加読み込み回数がMAXになるとフッタを消してます。
private void invisibleFooter() {
getListView().removeFooterView(getFooter());
}
こんな感じになります。



詳細はプロジェクトのソースを参照して下さい。
サンプルプロジェクトは下記リンクのListViewAdditionalReading.zipです。

2010年12月16日木曜日

DDMSを改造して、logcatに日本語を出す!

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
なんだかんだで出したいじゃないですか、日本語。
という事で頑張りました。


目的

Logcatの日本語が文字化けするから直したい。気長にやる。
とりあえずWindows版を作る事を目的とする。
Linux版は改造部分だけ持っていけばすんなりいけると思う。っていうかそもそもちゃんと日本語出るんじゃね?

環境

SDKのビルド
OS:Ubuntu 8.04

前提として、Ubuntu8.04の中にAndroidのソースをrepo syncで持ってきてる状態とします。

DDMSのソース

ソースは
$ANDROID_SRC_ROOT/sdk/ddms
にある。
使用したソースはfroyo。ハッシュ値はわからず。多分あんま関係ない。

改造

以下のファイルを修正する。このクラスがログのオブジェクト受け取って実際に出しているっぽい。
$ANDROID_SRC_ROOT/sdk/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogPanel.java

1121行目あたりが怪しい。
以下のコード
mc.msg = line.replaceAll("\t", "    ")
の下に
try{
mc.msg = new String(mc.msg.getBytes("shift_jis"), "utf-8");
}catch(Exception e){
e.printStackTrace();
}
を追加する。
ログはutf-8で来るのだけど、表示はshift_jisな為文字化けていたっぽい。
そこでshift_jisに文字コードを変換してあげる。と、いける。

追記-2010/12/18 10:54
・・・が!
コメントやTwitterで@androidzaurus @zaki50 @15myさんから色々指摘を頂きましたので色々追記します。

まず、
mc.msg = new String(mc.msg.getBytes("iso-8859-1"), "utf-8");
の方がいいのではなかろうか!とのこと。
そしてむしろ、
$ANDROID_SRC_ROOT/sdk/ddms/libs/ddmlib/src/com/android/ddmlib/MultiLineReceiver.java
でデータ受け取っている部分で
 s = new String(data, offset, length, "ISO-8859-1");
s = new String(data, offset, length, "UTF-8");
にしたら根本的に解決できるのでは、
という事。

全くそのとおりでした。
むしろなぜ
mc.msg = new String(mc.msg.getBytes("shift_jis"), "utf-8");
で正しく表示できていたのか自分でも不思議になってきました。

■LogPanelを改造する場合
$ANDROID_SRC_ROOT/sdk/ddms/libs/ddmuilib/src/com/android/ddmuilib/logcat/LogPanel.java
1121行目あたりの
mc.msg = line.replaceAll("\t", "    ")
の下に
try{
mc.msg = new String(mc.msg.getBytes("iso-8859-1"), "utf-8");
}catch(Exception e){
e.printStackTrace();
}
を追加する。

■MultiLineReceiver.javaを改造する場合
$ANDROID_SRC_ROOT/sdk/ddms/libs/ddmlib/src/com/android/ddmlib/MultiLineReceiver.java
54行目辺り
public final void addOutput(byte[] data, int offset, int length) 
の中の
s = new String(data, offset, length, "ISO-8859-1"); //$NON-NLS-1$
s = new String(data, offset, length, "UTF-8"); //$NON-NLS-1$
に修正する。

DDMSのビルド-実行

・Linux側でmake sdk

・以下の場所にddms.jar, ddmlib.jar, ddmuilib.jarなどがビルドされる
    $ANDROID_SRC_ROOT/out/host/linux-x86/sdk/android-sdk_eng.xx_linux-x86/tools/lib

・Windows側のAndroidSDKにddms.jar, ddmlib.jar, ddmuilib.jarをコピーする。(すでにddms.jar, ddmlib.jar, ddmuilib.jarが存在するので注意)
    $ANDROID_SDK/tools/lib
・あとはddms.batを実行

※ddms.batで起動しようと思ったらNoClassDefErrorが出た。(Windows7 64bit Home Premium使用)
その場合はddms.batの48行目辺りのjarpathをsetしている所を以下の様に修正する。
set jarpath=%frameworkdir%%jarfile%;%frameworkdir%ddmuilib.jar;%frameworkdir%ddmlib.jar;%frameworkdir%org.eclipse.jface_3.4.2.M20090107-0800.jar;%frameworkdir%sdkstats.jar;%frameworkdir%androidprefs.jar;%frameworkdir%org.eclipse.equinox.common_3.4.0.v20080421-2006.jar;%frameworkdir%org.eclipse.core.commands_3.4.0.I20080509-2000.jar;%frameworkdir%jfreechart-1.0.9-swt.jar;%frameworkdir%jfreechart-1.0.9.jar;%frameworkdir%jcommon-1.0.12.jar;%frameworkdir%osgi.jar
※ようするにクラスパス通ってないよ!という事です。↑はAndroid2.3が出た時に持ってきたSDKの場合のパスです。他バージョンや今後のバージョンでは異なる可能性があるので適宜書き換えてください。NoClassDefErrorに見つからなかったクラスのフルネームが出てくるので、なんとかエスパーしてjarを追加していって下さい。

できた・・・!


おまけ

■DDMSってフォント設定できるので、日本語出せるフォントにしておいて下さいね。

■MultiLineReceiver.javaに対する修正は既にパッチが上げられ議論されているようです。
「そう単純な話じゃねぇ!」とったコメントが入ってたりしてどうなるのかわかりませんが、
公式でマルチバイト文字の対応を実現してもられると助かりますね。

@androidzaurus @zaki50 @15myさんありがとうございました!


2010年12月8日水曜日

Android 2.3 Platform Highlights 日本語版 超訳

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
間違ってる部分も多くあると思いますがご了承下さい。というかご指導下さい。
2.3の新機能については随時試して訳があっているかチェックしていく予定です。

The Android 2.3 platform introduces many new and exciting features for users and developers. This document provides a glimpse at some of the new features and technologies in Android 2.3. For detailed information about the new developer APIs, see the Android 2.3 version notes.
Android2.3はユーザやデベロッパの為にエキサイティングな新しい機能を沢山追加したぜー!
この文書はAndroid2.3のやばさを垣間見せちゃうよ!
新しいAPIの詳細につきましては、「Android 2.3 version notes」を参照下さい。

新しい機能(ユーザ向け)


UIをシンプルにして、スピードアップしますた


The user interface is refined in many ways across the system, making it easier to learn, faster to use, and more power-efficient. A simplified visual theme of colors against black brings vividness and contrast to the notification bar, menus, and other parts of the UI. Changes in menus and settings make it easier for the user to navigate and control the features of the system and device.
システム全体に渡ってUIを刷新したよ!簡単に作れるようになったし、速度もうpしたし、消費電力も抑える事に成功!黒色に対する簡略化された色のテーマは、通知バーやメニューや他のUIに鮮明さとコントラストをもたらします。メニューや設定が変わる事で、ユーザがシステムとかデバイスをいじるが簡単になったよ。

より直感的なテキストの入力ですっげー捗る(Android Keyboardのみ)


The Android soft keyboard is redesigned and optimized for faster text input and editing. The keys themselves are reshaped and repositioned for improved targeting, making them easier to see and press accurately, even at high speeds. The keyboard also displays the current character and dictionary suggestions in a larger, more vivid style that is easier to read.
Androidのソフトキーボードをより早い入力、編集のために再度デザインしなおし、最適化しました。キー自身を押しやすく改善するために再度作り直し、配置しなおしました。キーを見やすく、早い入力でも正確に押せるように作りました。現在の文字や、入力候補を大きく表示し、よりいい感じで見やすくしました。
The keyboard adds the capability to correct entered words from suggestions in the dictionary. As the user selects a word already entered, the keyboard displays suggestions that the user can choose from, to replace the selection. The user can also switch to voice input mode to replace the selection. Smart suggestions let the user accept a suggestion and then return to correct it later, if needed, from the original set of suggestions.
選択した文字列を入力候補で出た文字列に置き換える機能が追加されました。既に入力された文字列をユーザが選択すると、他の候補が表示され、その候補と入れ替えができます。その他音声入力で選択した文字列を置き換えたりもできます。ユーザが入れ替えをおkとやると入れ替わります。元に戻す事もできます。要チェック
New multitouch key-chording lets the user quickly enter numbers and symbols by pressing Shift+<letter> and ?123+<symbol>, without needing to manually switch input modes. From certain keys, users can also access a popup menu of accented characters, numbers, and symbols by holding the key and sliding to select a character.
新たなマルチタッチ的な入力で、Shift+文字、「?123」+記号素早く数字や記号を通常の入力モード切替をせずに入力できます。特定のキーを押すことで強調された文字、数字、記号のポップアップが表示され、スライドして文字を選択する事が可能になりました(例えば[a]を押すと[a...]というポップアップが出て、さらに押しっぱなしにしているといろんなaに関連する文字が横に並んで、それを選択できる感じでした。)
↓こんな感じ

ワンタッチで選択、コピペし放題。


When entering text or viewing a web page, the user can quickly select a word by press-hold, then copy to the clipboard and paste. Pressing on a word enters a free-selection mode — the user can adjust the selection area as needed by dragging a set of bounding arrows to new positions, then copy the bounded area by pressing anywhere in the selection area. For text entry, the user can slide-press to enter a cursor mode, then reposition the cursor easily and accurately by dragging the cursor arrow. With both the selection and cursor modes, no use of a trackball is needed.

テキストを入力している時や、webページを見ている時、文字列とかを押しっぱなしにすると、文字列の選択が手早くできるようになりました。んで、コピーとかペーストとかもできます。単語を選択すると自由選択モードになります。ドラッグして、必要な範囲を選択できます。そして選択範囲のどこかを押すとコピーができます。文字入力の際、カーソルモードが使えます。現在のカーソルに矢印的なものが現れて、それをドラッグして移動できます。選択も移動も、トラックボールなしでできますね!

電源管理を改善


The Android system takes a more active role in managing apps that are keeping the device awake for too long or that are consuming CPU while running in the background. By managing such apps — closing them if appropriate — the system helps ensure best possible performance and maximum battery life.
Androidシステムがより積極的にアプリ管理をやっちゃいます。そうバックグラウンドで走り、あまりに長い間デバイスのCPUを消費してしまうアプリお前だー!必要に応じてそういうイケナイアプリを終了させたり色々管理する事で、最高のパフォーマンスを出しつつもバッテリーが最大限持つようにします。
The system also gives the user more visibility over the power being consumed by system components and running apps. The Application settings provides an accurate overview of how the battery is being used, with details of the usage and relative power consumed by each component or application.
電力消費してるアプリやシステムどもをより可視化しました!「アプリケーション設定」は正確なバッテリー使用量の概要やら詳細を提供します。


アプリケーションの制御


A shortcut to the Manage Applications control now appears in the Options Menu in the Home screen and Launcher, making it much easier to check and manage application activity. Once the user enters Manage Applications, a new Running tab displays a list of active applications and the storage and memory being used by each. The user can read further details about each application and if necessary stop an application or report feedback to its developer.
アプリ管理へのショートカットは、HomeやLauncherのオプションメニューに表示されます。アクティビティの管理を簡単にします!(ようするに今まで[メニューボタン]-[設定]-[アプリケーション]-[アプリケーションの管理]ってやってたのを、[メニューボタン]-[アプリケーションの管理]って感じにしただけだよ!)「アプリケーションの管理」を選択したら、タブ表示の画面が起動されて、アクティブなアプリケーションのディスク使用量やメモリ使用量などがリスト表示されます。さらに、アプリの詳細を見たりもできます。そこで必要であればアプリを停止したり、そのアプリの開発者に文句などをフィードバックできます。



New ways of communicating, organizing


An updated set of standard applications lets the user take new approaches to managing information and relationships.
更新された標準アプリのセットは情報の管理とか交友関係だかに新たなアプローチを提供するよ!



Internet calling
The user can make voice calls over the internet to other users who have SIP accounts. The user can add an internet calling number (a SIP address) to any Contact and can initiate a call from Quick Contact or Dialer. To use internet calling, the user must create an account at the SIP provider of their choice — SIP accounts are not provided as part of the internet calling feature. Additionally, support for the platform's SIP and internet calling features on specific devices is determined by their manufacturers and associated carriers.
SIPアカウントを持っている相手に対して、インターネットを通して音声通話ができるようになったよ。アドレス帳にSIPアドレスを追加できるようになって、アドレス帳やらダイヤラからSIP通話が簡単にできますよ。ろんもちインターネット通話を行う場合は、適当なSIPプロバイダでSIPアカウント作っておかないと駄目です。(このインターネット通話機能の中にSIPアカウント払い出し機能なんてものはない、つまりそういう事さ!)さらに、このSIP系機能の利用可否は端末ベンダーや携帯キャリアに依存すっからそこんとこよろしく。

Near-field communications
An NFC Reader application lets the user read and interact with near-field communication (NFC) tags. For example, the user can “touch” or “swipe” an NFC tag that might be embedded in a poster, sticker, or advertisement, then act on the data read from the tag. A typical use would be to read a tag at a restaurant, store, or event and then rate or register by jumping to a web site whose URL is included in the tag data. NFC communication relies on wireless technology in the device hardware, so support for the platform's NFC features on specific devices is determined by their manufacturers.
NFCリーダーアプリは、NFCタグを読んだり連携したりできます。例えば、ポスターやステッカーや広告に埋め込まれたNFCタグをタッチしたりする事でデータを読みこんだりできますよ!(Felicaみたいにね)まぁ、大体レストランやらお見せやらイベントの時とかに使うよねこれは。
でタグに埋め込まれたURLとかを読んでWebサイトに飛んだりして登録とかやるよね。NFCはデバイスの無線技術に依存していますんで、使えるかどうかは端末ベンダーや携帯キャリアに依存すっからそこんとこよろしく。

Downloads management
The Downloads application gives the user easy access to any file downloaded from the browser, email, or another application. Downloads is built on an completely new download manager facility in the system that any other applications can use, to more easily manage and store their downloads.

ダウンロードアプリはブラウザとかメールとかそのほかのアプリでなんかダウンロードするのを簡単にします。このダウンロード機能はシステムに完全に統合されとるので、他のアプリからも使えて、その辺の管理が簡単になりましたよ~

Camera
The application now lets the user access multiple cameras on the device, including a front-facing camera, if available.
フロントカメラなどなど、アプリケーション側から複数のカメラの操作ができるようになりました。もちデバイスが対応していればですが。

新しい特徴(デベロッパー向け)

Android 2.3 delivers a variety of features and APIs that let developers bring new types of applications to the Android platform.
Android2.3は様々な特徴のAPIを提供しまくります。デベロッパはAndroidにまったく新しいタイプのアプリケーションをもたらす事ができるようになります。

ゲームのための拡張機能

パフォーマンス
Android 2.3 includes a variety of improvements across the system that make common operations faster and more efficient for all applications. Of particular interest to game developers are:
Android2.3は、全てのアプリの為に基本的な処理をより早く、効率的になるようにシステム全体に渡って沢山の改善をしますた。


  • Concurrent garbage collector — The Dalivik VM introduces a new, concurrent garbage collector that minimizes application pauses, helping to ensure smoother animation and increased responsiveness in games and similar applications.
コンカレントGC----DalvikVMにコンカレントGCが採用されたよ!GCによる停止時間の低減、スムーズなアニメの支援、レスポンスの向上ができてゲームやそれ系アプリはいい感じになります。(mark and sweepから置き換わったんすかね?)

  • Faster event distribution — The plaform now handles touch and keyboard events faster and more efficiently, minimizing CPU utilization during event distribution. The changes improve responsiveness for all applications, but especially benefit games that use touch events in combination with 3D graphics or other CPU-intensive operations.
より早いイベントの通知----プラットフォームはイベント配布時にCPU使用率を最小限に抑え、より速く、より効率的にタッチとキーボードイベントを処理します。この変更は、すべてのアプリケーションの応答性を向上させる、特に3Dグラフィックスやその他のCPU集中型の操作との組み合わせでタッチのイベントを使用するゲームに利益をもたらす。

  • Updated video drivers — The platform uses updated third-party video drivers that improve the efficiency of OpenGL ES operations, for faster overall 3D graphics performance.
ビデオドライバのアップデート---OpenGL ESの3D処理系が早くなりました。サードパーティのいい感じのビデオドライバを使ってます。

Native input and sensor events
Applications that use native code can now receive and process input and sensor events directly in their native code, which dramatically improves efficiency and responsiveness.
Native libraries exposed by the platform let applications handle the same types of input events as those available through the framework. Applications can receive events from all supported sensor types and can enable/disable specific sensors and manage event delivery rate and queueing.
ネイティブコード側で直接入力系のイベントやセンサーイベントを受け取って処理できるようになりました。これで効率やレスポンスが凄く向上できます。システムが提供するネイティブライブラリはフレームワークを通して色んなタイプのイベントを処理できるようにしちゃいます。アプリケーションは全てのセンサーを受け取れます、もちろん特定のセンサーのenable/disableのコントロールもできます。更新頻度の設定とかキューイングとかもできます。
Gyroscope and other new sensors, for improved 3D motion processing(3Dのモーション処理を改善するためのジャイロスコープと新しいセンサー)
Android 2.3 adds API support for several new sensor types, including gyroscope, rotation vector, linear acceleration, gravity, and barometer sensors. Applications can use the new sensors in combination with any other sensors available on the device, to track three-dimensional device motion and orientation change with high precision and accuracy. For example, a game application could use readings from a gyroscope and accelerometer on the device to recognize complex user gestures and motions, such as tilt, spin, thrust, and slice.
Android2.3ではジャイロスコープや回転ベクトル、直線加速度、重力、気圧センサなどの新しいセンサータイプをサポートしたAPIを追加したよ。デバイスで使用できる他のセンサーとあわせて新たなセンサも使えるようになりました。デバイスの3次元の動きや傾きの変化を高い精度でトラッキングできるようになりました。例えば、ゲームアプリケーションでジャイロスコープと加速度線さを使ってユーザの複雑なジェスチャー(傾けたり、まわしたり、突いたり、切ったりとか)や動きを認識できます。
Open API for native audio
The platform provides a software implementation of Khronos OpenSL ES, a standard API that gives applications access to powerful audio controls and effects from native code. Applications can use the API to manage audio devices and control audio input, output, and processing directly from native code
プラットフォームはKhrnos OpenSL ESのソフトウェア実装を提供する!(Khrnos OpenSL ESは組み込み用途を想定したクロスプラットフォーム対応のサウンドAPIだそうです)

Native graphics management
The platform provides an interface to its Khronos EGL library, which lets applications manage graphics contexts and create and manage OpenGL ES textures and surfaces from native code.
プラットフォームはKhronos EGLライブラリのインタフェースを提供するなり!これによってネイティブコード側で画像管理や生成、OpenGL ESのテクスチャやサーフェイスの管理ができるようになりました!

Native access to Activity lifecycle, window management
Native applications can declare a new type of Activity class, NativeActivity whose lifecycle callbacks are implemented directly in native code. The NativeActivity and its underlying native code run in the system just as do other Activities — they run in the application's system process and execute on the application's main UI thread, and they receive the same lifecycle callbacks as do other Activities.
The platform also exposes native APIs for managing windows, including the ability to lock/unlock the pixel buffer to draw directly into it. Through the API, applications can obtain a native window object associated with a framework Surface object and interact with it directly in native code.
ネイティブアプリがNativeActivityという新たに定義されたAcitivtyクラスを使えるようになりました。これによりActivityのライフサイクルで呼ばれるコールバック(onCreate,onPauseとかonDestroyとか)をネイティブ側で処理できるようになりました。NativeActivityやその周辺のネイティブコードは他のActivityと同じくシステムで走りだします!普通のActivityみたくUIスレッドで実行されて、ライフサイクル関係のコールバックも呼ばれてますよ。またウィンドウ管理用のAPIもプラットフォームから提供します。ピクセルバッファのlock/unlockとかができますよ。APIを通してフレームワークのサーフェイスオブジェクトに関連付けられているwindowオブジェクトを取得して、直接操作したりできます。→どういう事だ~
Native access to assets, storage
Applications can now access a native Asset Manager API to retrieve application assets directly from native code without needing to go through JNI. If the assets are compressed, the platform does streaming decompression as the application reads the asset data. There is no longer a limit on the size of compressed .apk assets that can be read.
Additionally, applications can access a native Storage Manager API to work directly with OBB files downloaded and managed by the system. Note that although platform support for OBB is available in Android 2.3, development tools for creating and managing OBB files will not be available until early 2011.

ネイティブ側からAssetManagerAPIにアクセスできるようになって、アプリケーションのassetsのファイルをJNIを介する必要なく取得できるようになりました。もしassetsが圧縮されていたら、アプリが使うときにプラットフォームが勝手に解凍してくれるっぽいよ。apkから読み込めるassets内のファイルサイズの制限が撤廃されました!(ネイティブ以外もかなー!?)さらに、アプリはStorageManagerAPIにアクセスし、システムによってダウンロードされ管理されているOBBファイルを直接動作させることができます?OBBファイルはAndroid2.3でサポートするものの、OBBファイルを作ったり管理したりする開発ツールは2011年初頭まで使えないんでよろ。
(StrageManagerはどうも暗号化したファイルを操作するAPIっぽいです。OBBはOpaque Binary Blobsの略です。新しいフォーマットなのかー?)

Robust native development environment
The Android NDK (r5 or higher) provides a complete set of tools, toolchains, and libraries for developing applications that use the rich native environment offered by the Android 2.3 platform. For more information or to download the NDK, please see the Android NDK page.
AndroidNDK(r5以上)はAndroid2.3によって提供されるリッチなネイティブ環境を使ったアプリケーションを作るための完全なツール、ツールチェイン、ライブラリのセットをどーんと提供します。詳細な情報やらNDKのダウンロードはAndroid NDKへどうぞ。

コミュニケーションの新しい形

Internet telephony(インターネット通話!)
Developers can now add SIP-based internet telephony features to their applications. Android 2.3 includes a full SIP protocol stack and integrated call management services that let applications easily set up outgoing and incoming voice calls, without having to manage sessions, transport-level communication, or audio record or playback directly.
Support for the platform's SIP and internet calling features on specific devices is determined by their manufacturers and associated carriers.

開発者はSIPベースのインターネット通話機能をアプリで使えます。Android2.3はSIPプロトコルのフルスタックを持っており、通話系の管理サービスに統合されているので、アプリケーションは音声通話の発信や着信をSIPのセッション管理とか、トランスポート層の通信制御とか、音声の再生/録音に直接関わる事なく簡単にできるんですよ~。ただ、このSIP系機能の利用可否は端末ベンダーや携帯キャリアに依存すっからそこんとこ重ね重ねよろしく。

Near Field Communications (NFC)
The platform's support for Near Field Communications (NFC) lets developers get started creating a whole new class of applications for Android. Developers can create new applications that offer proximity-based information and services to users, organizations, merchants, and advertisers.
Using the NFC API, applications can respond to NFC tags “discovered” as the user “touches” an NFC-enabled device to elements embedded in stickers, smart posters, and even other devices. When a tag of interest is collected, applications can respond to the tag, read messages from it, and then store the messages, prompting the user as needed.
NFC communication relies on wireless technology in the device hardware, so support for the platform's NFC features on specific devices is determined by their manufacturers.
NFCはもう開発者が全く新しいAndroidアプリを作れるようにしちゃいます。開発者はFelica的なタッチしたりする系の情報やサービスをユーザや組織や商人や広告主に提供するアプリを作れます。NFC APIを使うと、ステッカーやポスターや他の端末にタッチする事で発見した埋め込まれたNFCタグに対して何やかや操作ができます。ユーザにプロンプトを出す必要があるけれども、アプリはタグに対してデータを読んだり、保存させたりできます。ただ、NFCはデバイスの無線技術に依存していますんで、使えるかどうかは端末ベンダーや携帯キャリアに依存すっからそこんとこ重ね重ねよろしく。

リッチなマルチメディア

Mixable audio effects(オーディオエフェクトをミキシング)
A new audio effects API lets developers easily create rich audio environments by adding equalization, bass boost, headphone virtualization (widened soundstage), and reverb to audio tracks and sounds. Developers can mix multiple audio effects in a local track or apply effects globally, across multiple tracks.
新たなオーディオエフェクトAPIは、イコライザ、バスブースト、ヘッドフォンの仮想化?(サウンドステージの拡大?)、リバーブなどができる様になって、簡単におもろい音作れるようになりました。開発者はこれらのエフェクトを複数ミックスしたり、複数のトラックに渡って適応したりできます。
Support for new media formats(新しいメディアフォーマットに対応)
The platform now offers built-in support for the VP8 open video compression format and the WebM open container format. The platform also adds support for AAC encoding and AMR wideband encoding (in software), so that applications can capture higher quality audio than narrowband.
プラットフォームはVP8 open video compression formatとWebM open container formatをサポートしました。その他ACCやAMR wideband(ソフトウェア実装)もサポートしました。これによって回線細くてもいい感じで音鳴らす事ができまっせ。
Access to multiple cameras(複数のカメラにアクセス)
The Camera API now lets developers access any cameras that are available on a device, including a front-facing camera. Applications can query the platform for the number of cameras on the device and their types and characteristics, then open the camera needed. For example, a video chat application might want to access a front-facing camera that offers lower-resolution, while a photo application might prefer a back-facing camera that offers higher-resolution.
Camera APIによってフロントカメラなどなどデバイスで使えるいくつかのカメラにアクセスできるようになります。アプリケーションからデバイスにのっている色々なタイプの複数のカメラについてプラットフォームに問い合わせる事ができます。そんで必要なカメラをオープンしましょう。例えばビデオチャットアプリなら低解像度のフロントカメラにアクセスしたいでしょう、写真アプリなら高解像度の背面カメラをつか

新たなプラットフォームの技術

Media Framework

  • New media framework fully replaces OpenCore, maintaining all previous codec/container support for encoding and decoding.
    OpenCoreを完全に新たなメディアフレームワークに置き換えた。以前のコーデックやコンテナフォーマットはそのまんま維持してます。

  • Integrated support for the VP8 open video compression format and the WebM open container format
    V8のビデオ圧縮形式と、WebMのコンテナフォーマットを総合的にサポートします!

  • Adds AAC encoding and AMR wideband encoding
    対応音声コーデックにACCとAMR widebandが追加されました。

Linux Kernel

  • Upgraded to 2.6.35

Networking

  • SIP stack, configurable by device manufacturer
    SIPスタック載せました。端末メーカがおkにしたら動く。

  • Support for Near Field Communications (NFC), configurable by device manufacturer
     NFC載せました。端末メーカがおkにしたら動く。

  • Updated BlueZ stack
    BlueZをアップデートしたよ。(Linux用のBluetoothスタック)

Dalvik runtime

  • Dalvik VM:
    • Concurrent garbage collector (target sub-3ms pauses)
    • コンカレントGCになりました。
    • Adds further JIT (code-generation) optimizations
    • より最適化されたJIT
    • Improved code verification
    • 改善されたコードの検証をした?
    • StrictMode debugging, for identifying performance and memory issues
              メモリの問題とかパフォーマンスの為のStrictModeのデバッグをした?

  • Core libraries:
    • Expanded I18N support (full worldwide encodings, more locales)
    • 拡張I18Nをサポート(国際化対応)
    • Faster Formatter and number formatting. For example, float formatting is 2.5x faster.
    • フォーマッタが超早くなった。floatをフォーマットすんのが2.5倍早くなった?
    • HTTP responses are gzipped by default. XML and JSON API response sizes may be reduced by 60% or more.
    • HTTPのレスポンンスをデフォルトでgzipでもらうようにして、XMLとかJSONのレスポンスサイズが60%縮んだっぽい。(Accept-Encodingにデフォルトでgzipつけるようにしたって事?)
    • New collections and utilities APIs
    • 新しいCollectionとかUtil系のAPIを追加
    • Improved network APIs
    • ネットワーク系APIを改善
    • Improved file read and write controls
    • ファイルI/O系を改善
    • Updated JDBC
    • JDBCを更新した。(DBに接続するあれ)
  • Updates from upstream projects:
    • OpenSSL 1.0.0a
    • BouncyCastle 1.45
    • ICU 4.4
    • zlib 1.2.5
For more information about the new developer APIs, see the Android 2.3 version notes and the API Differences Report.
開発者向けのAPIについてのより詳細な情報はAndroid 2.3 version notesとかAPI Differences Reportを見てね