Android Debug 時追蹤 SDK Source Code

不管是除錯還是學習,能夠看到完整的原始碼總是比較方便。Android 本身是開放原始碼,所以可以自行下載後再 attach source code。
自 4.0 以後,Android SDK Manager 也提供了 Sources for Android SDK 的選項,可以直接勾選安裝。

ADT 安裝好後,如果你嘗試追蹤一個 Android Framework 的類別,會看到類似如下的畫面:
source not found

這時,先確認有安裝 SDK 原始碼:
install Sources for Android SDK

然後,到專案裡面的 Android SDK 按右鍵,選擇 Properties:
android sdk properties

在 External location 選擇 SDK 路徑底下的 sources/android-[你要的版本]
set sdk source folder

這時隨便挑一個類別,按右鍵選擇 Open Declaration
Open Declaration

接著應該就會顯示出這個類別的原始碼了:
display the source code

在 Debug 時,若是 Trace 進入了 SDK 原始碼,卻發生了跑錯行號的現象,那麼有兩點需要確認:

  1. 你選擇的原始碼版本有對應到目前 Debug 執行的 Android 版本,例如 Debug 的環境是 Android 4.3.1,那就要使用 android-18 的原始碼。
  2. 用來 Debug 的機器最好是官方提供的模擬器,若在實體裝置上執行,那裝置上安裝的版本不一定是官方版本。我自己在 Nexus 7 上面測試倒是都能對的上就是了…

Android Studio 越來越接近正式發行,這個時候寫 ADT 的筆記好像沒什麼價值了 (?

Eclipse 當掉後沒有畫面

今天 Eclipse 無預警的當掉了,然後再打開,選完 workspace 後就只有一片空白的畫面,連選單都沒出現。

網路上有找到解決方法,紀錄一下:
到 workspace 底下,刪除檔案
.metadata/.plugins/org.eclipse.core.resources/.projects//.markers.snap
或是
.metadata/.plugins/org.eclipse.core.resources/.snap

其實也不一定要刪除,我把檔名改掉後先成功開啟一次,再關閉 Eclipse,將 .snap 改回來,之後就都正常了。

參考:
http://stackoverflow.com/questions/207843/how-do-i-prevent-eclipse-from-hanging-on-startup

Android ToyVpn by native code

今兒個練習使用 Android 的 VpnService,為了能使用手邊現有的 C++ 程式碼,需要使用 NDK 來寫原生程式。弄一弄覺得在 Java 與 C 之間切換實在有夠麻煩,索性把 Android SDK 裡面附的 ToyVpn 改用 C 語言重寫一次。Java 部份就只負責 UI 的互動,與一些初始化的動作而已,其餘的部份都交給 C 去執行,應該效能也會更好(吧?)。

大致上運作方式都沒有變,傳輸也依然沒有加密,使用者密碼也還是寫死狀態。
只加上了一個 Keep Alive 的功能,讓它閒置一段時間也不會斷線。

完整的程式碼在 GitHub:
https://github.com/weichenlin/NativeToyVpn

2013/12/20 更新:
增加了一個支援多 client 的 server
主要差異在於需要給每個 client 不同的 ip 做區別
另外還需要稍微分析一下封包的位址才能分辨到底是要給誰的
程式碼一樣放在 GitHub

[參考資料]
一篇很好的 tun/tap 入門教學:http://backreference.org/2010/03/26/tuntap-interface-tutorial/
比較詳細的運作原理:http://www.ibm.com/developerworks/cn/linux/l-tuntap/index.html
tcp/ip stack:https://github.com/saminiir/level-ip