山手線に乗っているとAndroidのRAT表示がHSDPA:9とHSPA:11が頻繁に切り替わり、通勤中はUMTS:3、HSDPA:9、LTE:14がよく切り替わる。この3とか9とか11とか14はカテゴリか何かだとは思っていたけど、正確には理解していなかったので、Androidのソースを落としてきて調べてみた。
ソースはgitで落としてくる。ICS/LT18i化したSO-01Cと最近買ったSC-05DのどちらもAndroidバージョンは4.0.4なので、その最新版のframeworkのソースを落としてみる。
> git init > git clone -b android-4.0.4_r2.1 https://android.googlesource.com/platform/frameworks/base/
さっそく読み進める。
モデム周りの制御はここでいじったGsmServiceStateTrackerというのはある程度わかっていたのでまずはここを見る。
base\telephony\java\com\android\internal\telephony\gsm\GsmServiceStateTracker.java
if (DBG) {
log("RAT switched " + ServiceState.radioTechnologyToString(mRadioTechnology) +
" -> " + ServiceState.radioTechnologyToString(mNewRadioTechnology) +
" at cell " + cid);
}
alogcatというアプリで無線のログを眺めていると”RAT switched HSDPA:9 -> LTE:14″という感じのがパラパラ出てくるのでRAT switchedで探したら上のコードを見つけた。ServiceState.radioTechnologyToStringとそれっぽい関数がHSDPA:9とかLTE:14を作っているように見える。
で、次に base\telephony\java\android\telephony\ServiceState.java を見てみて、ずばりのところを見つけた。
/**
* Convert radio technology to String
*
* @param radioTechnology
* @return String representation of the RAT
*
* @hide
*/
public static String radioTechnologyToString(int rt) {
String rtString;
switch(rt) {
case 0:
rtString = "Unknown";
break;
case 1:
rtString = "GPRS";
break;
case 2:
rtString = "EDGE";
break;
case 3:
rtString = "UMTS";
break;
case 4:
rtString = "CDMA-IS95A";
break;
case 5:
rtString = "CDMA-IS95B";
break;
case 6:
rtString = "1xRTT";
break;
case 7:
rtString = "EvDo-rev.0";
break;
case 8:
rtString = "EvDo-rev.A";
break;
case 9:
rtString = "HSDPA";
break;
case 10:
rtString = "HSUPA";
break;
case 11:
rtString = "HSPA";
break;
case 12:
rtString = "EvDo-rev.B";
break;
case 13:
rtString = "eHRPD";
break;
case 14:
rtString = "LTE";
break;
case 15:
rtString = "HSPAP";
break;
default:
rtString = "Unexpected";
Log.w(LOG_TAG, "Unexpected radioTechnology=" + rt);
break;
}
return rtString + ":" + rt;
}
数字はカテゴリでもなんでもなくて、RATに順番に番号を振っただけ。これだけ見るとなんだ、という感じだけどこういう情報がまとまっているのは見たことないので、個人的にはすっきりした。
これを機にAndroidのソースを読み進めようと思ったけど膨大すぎてすでに挫折気味。