2011年1月27日木曜日

AndroidのUDPソケットのソースを読んでみた


ラジコンのカメラ映像を受信する箇所がなぜか1.6までの端末だとうまく動かない問題がありました。
ちょっと実装に問題が見当たらなかったので、Androidのソースを読んでみました。

詳しくはつづきから



ソースの場所
dalvikvm/libcore/luni/src/main/java/java/net/DatagramSocket.java


1.5(capcake) -> 1.6(donut)
・DatagramSocket
同じファイルだった


1.6(donut) -> 2.0/2.1(eclair) 一番注目するべき変更があるはず
とりあえずメソッドのjavadocコメントから@since Android 1.0が消えた

・DatagramPacket
受信バッファ用のサイズ格納変数capacityができた
ただ、ソースを読む限りlengthと同じ値を代入/参照するような。。。

・DatagramSocketImple
コメント以外の変更は無し

・DatagramSocket
内部でアドレスの扱いがInetAddressからInet4Addressへ変わった
なんかcreateSocketも変わった
一番注目は
public synchronized void receive(DatagramPacket pack) throws IOException

受信ループの抜け方がかわった
書く人が変わったからかな?
1.6
→while()の引数で判定
2.0/2.1
→breakで抜ける

データ受信についてはDatagramSocketImpl#reciev()を使ってたんだけど、実装箇所がどこか分からなかった
NDK?
→NDKではなさそう。それらしいソースが無かった
→DatagramSocketImplのオブジェクト生成時にDatagramSocketImplFactoryが使用されていて、
よくわからん書き方でSocketImplProvider.getDatagramSocketImpl()が関わっている

→SocketImplProviderはapacheのパッケージにソースがある
→SocketImplProvider.getDatagramSocketImpl()ではDatagramSocketImplをnewで生成して戻してきている
PlainDatagramSocketImpl()でファイルディスクリプタを作ってる!ここでNDKとつながるのかな?


2.0/2.1(eclair) -> 2.2(froyo)

・DatagramSocket
DatagramPacketのメンバ変数へのアクセス方法が変わった
→publicな変数を参照するやり方からgetterを使用するやり方に変わった
初期化のメソッド?がコメントアウトされた
static {
         Platform.getNetworkSystem().oneTimeInitialization(true);
   }


2.2(froyo) -> 2.3(gingerbread)
ディレクトリが変更された!
/libcore/luni/src/main/java/java/net/DatagramSocket.java

2.2ではコメントアウトだった初期化のメソッド?が削除された
メソッドのコメントとexceptionの中身が変わった
→logcatとかで吐くメッセージが変更されている


メモ
Factoryってなに?
→オブジェクトを生成する専門家
オブジェクトを生成するのと、利用するのを分離することで再利用性を高めるらしい

○○Implについて
→インターフェイスとかで使われる命名規則らしい



結果
結構ソケット関係のソースが多いためまだ結論にまで至っていない


0 件のコメント:

コメントを投稿