2009/10/21

在 Freerunner 上開發 Android (cupcake) 應用程式 - 永遠的 Hello World

最近 Android 不知道在紅什麼, 一天到晚都看到新聞. 昨天突然想到自己這台電腦上 (ubuntu 8.04 LTS) 的裝的 Eclipse (3.2) 從來沒用過, 加上也沒用過最近 koolu release 的 Android 0.1.1 for Freerunner. 就想說來測一下, 來 study 一下有哪些變化. 發現目前好像 Android on Freerunner 的說明不是很完整, 就快速補一下.

首先, 參考了以下網站:
* http://developer.android.com/sdk 使用 Android SDK 相關需要的條件 (http://developer.android.com/sdk/1.6_r1/requirements.html ), 安裝 ADT (Android Development Tools) 相關的說明 (http://developer.android.com/sdk/1.6_r1/installing.html ). Download 1.6 的
SDK tar.gz 檔
* http://code.google.com/p/android-on-freerunner/ Download 最近一次的 0.1.1 release tar.gz 檔(or http://www.t0ny.net/openmoko/images/android/) 目前 android on freerunner 是用 weekly build 的方式 release fix.

Step1: 安裝 Eclipse, JDK, JRE

看了 google dev 說明依下, 就發覺一些問題. 因為我的桌機上裝的是 ubuntu 8.04 LTS, 預設 apt-get install 的 Eclipse 是 3.2 版. 完全不在 google 目前支援的範圍內 (3.4 and 3.5 版). 可是不死心, 想說 ADT 給他裝上去會不會動, 結果 install 一直失敗. 最後還是把 Eclipse 3.2 移了, 從http://www.eclipse.org/downloads/ 抓了 3.5.1 classic 版本下來 (不過 google 是建議 java 版 or RCP 版).

抓下來解壓縮放到我的 home 目錄下, 執行 Eclipse 檔, 然後按照 google 的指示 從 Eclipse 3.5 的選單 Help -> Install New Softare. 在 In the Available Software dialog, 按下 Add.... 把 Location 填上去
https://dl-ssl.google.com/android/eclipse.

接著想說按下一步就收工了, 結果一直發生 package 安裝驗證的 Error (connect to key store 或是類似的問題). 我想說我 jdk 都裝了 (雖然幾乎沒用過) 就 google 一下, 發覺是跟 gcj 相容性有關(後來在 google 的 specification 看到上面有寫 =_=?), 然後有善心人士把 command post 出來:

~$sudo apt-get install openjdk-6-jre sun-java6-jdk
~$sudo update-java-alternatives -s java-6-sun

安裝完後, 還有把 SDK 的 path export 到環境變數, 修改 ~/.bashrc 加上一行: export PATH=${PATH}:<sdk_dir>/tools ,修改 preference

Eclipse 部分大概是這樣.

Step 2: 寫一個 hello world...
寫個 helloworld, 以 Android 1.5 當 target 在 Android 模擬器上跑跑看, 編成 .apk 檔. 哈哈, 其實本篇不是教你寫 Hello world :P

Step 3: 請參考前面幾篇文章, 安裝 0.1.1 的 cupcake 到 Freerunner 上安裝完後, 到設定裏面把 screen and display 的 sleep 時間延長, 避免 suspend 時的 USB 斷線. 然後到 Application 設定裏面, 把 USB debugging/Stay awake/Allow mock locations 打勾, 然後把接受未簽名的 Unknown sources 選項打開.

Step 4: 建立 ADB 連線, 將 .apk 檔安裝到 freerunner 中.
tony@tony-945:~$ adb kill-server
tony@tony-945:~$ sudo ifconfig eth3 192.168.0.200 netmask 255.255.255.0
[sudo] password for tony:
tony@tony-945:~$ export ADBHOST=192.168.0.202
tony@tony-945:~$ adb install helloworld.apk
* daemon not running. starting it now *
* daemon started successfully *
112 KB/s (6796 bytes in 0.058s)
pkg: /data/local/tmp/helloworld.apk
Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]

原來以為這樣就收工了, 但是不知為什麼, 即使 Unknown sources 選項打開, Android 一直不讓我裝未簽名 (NO_CERTIFICATES) 的 helloworld.apk, 迫不得已, 就順便簽一下了.

Step 5: 建立 keystore 目錄, 為 .apk 簽名. 這邊只提供過程 :)
tony@tony-945:~$ mkdir android_dev_deploy
tony@tony-945:~$ cd android_dev_deploy/
tony@tony-945:~/android_dev_deploy$ mkdir keystore
tony@tony-945:~/android_dev_deploy$ cd keystore/
tony@tony-945:~/android_dev_deploy/keystore$ mkdir keys
tony@tony-945:~/android_dev_deploy/keystore$ cd keys
tony@tony-945:~/android_dev_deploy/keystore/keys$ cd ..
tony@tony-945:~/android_dev_deploy/keystore$ keytool -genkey -alias GreenRoom
-keyalg RSA -validity 20000 -keystore keys/anddev.keystore
Enter keystore password:
Re-enter new password:
What is your first and last name?
[Unknown]: Neng-Yu 'Tony' Tu
What is the name of your organizational unit?
[Unknown]: GreenRoom
What is the name of your organization?
[Unknown]: GreenRoom
What is the name of your City or Locality?
[Unknown]: Taipei
What is the name of your State or Province?
[Unknown]: Taiwan
What is the two-letter country code for this unit?
[Unknown]: TW
Is CN=Neng-Yu 'Tony' Tu, OU=GreenRoom, O=GreenRoom, L=Taipei, ST=Taiwan,
C=TW correct?
[no]: yes

Enter key password for <anddev.keystore>
(RETURN if same as keystore password):
Re-enter new password:
tony@tony-945:~/android_dev_deploy/keystore$ ls
keys
tony@tony-945:~/android_dev_deploy/keystore$ cd keys
tony@tony-945:~/android_dev_deploy/keystore/keys$ ls
anddev.keystore
tony@tony-945:~/android_dev_deploy/keystore/keys$ cp
/home/tony/helloworld.apk /home/tony/android_dev_deploy/keystore/
tony@tony-945:~/android_dev_deploy/keystore/keys$ cd ..
tony@tony-945:~/android_dev_deploy/keystore$ ls
helloworld.apk keys

Step 6: apk 簽名 (Sign apk)

tony@tony-945:~/android_dev_deploy/keystore$ jarsigner -verbose -keystore
keys/anddev.keystore -signedjar helloworld_signed.apk helloworld.apk anddev.
keystore Enter Passphrase for keystore:
adding: META-INF/MANIFEST.MF
adding: META-INF/ANDDEV_K.SF
adding: META-INF/ANDDEV_K.RSA
signing: res/drawable/icon.png
signing: res/layout/main.xml
signing: AndroidManifest.xml
signing: resources.arsc
signing: classes.dex

tony@tony-945:~/android_dev_deploy/keystore$ ls
helloworld.apk helloworld_signed.apk keys

tony@tony-945:~/android_dev_deploy/keystore$ cp helloworld_signed.apk ~/
tony@tony-945:~/android_dev_deploy/keystore$

Step 7: 安裝簽名 apk (signed apk)
tony@tony-945:~$ ls hel*
helloworld.apk helloworld_signed.apk
tony@tony-945:~$ adb install helloworld_signed.apk
127 KB/s (8484 bytes in 0.064s)
pkg: /data/local/tmp/helloworld_signed.apk
Success

終於等到 Success, 然後在 Android 應用程式區上就可以看到 Helloworld
Application 了 :) 目前暫時結論是 unknown sources 選項在 0.1.1 版的 Android on Freerunner 有些問題, 所以 .apk 還是需要 sign 過才能用 adb 裝. Ya....收工.

後來發現 Eclipse 在這一版是可以自動找到 adb server, 直接從 Eclipse 將 code 丟到 0.1.1 版的 Android Freerunner 執行. 這樣直接 debug, 不需要使用 adb install 來做安裝的工作.

2009/10/29 update:

0.1.1 版的 Accelerometer 似乎有問題, 無法正確取得 accelerometer 的值, google groups/code track 也有提到. 不過 GPS/Wi-Fi/Audio/Vibrator 是可用的. SDK 的 samples 內附的 API demo 有很多範例除了看 code 怎麼寫. 還可順便測試硬體. 如果裝了 Eclispe, 可以編 API demo 試試看. GPS sample 我放了一個簡單的在 http://t0ny.net/openmoko/samples/android/gps/ , 需要注意的地方只有 AndroidManifest 要把加設 user right 有 Access fine location, 不然編完無錯誤但無法執行. google code 上有許多 android 相關的 project, 例如 http://code.google.com/p/bearing/ 也是一個 GPS data 的 viewer, 可以在 FR 上執行.

21 則留言:

喬偉 提到...

你好,我有在你的網誌上看到關於Freerunner 所提供的A-GPS的功能,你有提"使用 A-GPS 功能可以加快定位的速度, 但是無 A-GPS 輔助, FreeRunner 還是擁有 GPS 的功能."我想請問你,freerunner的官方網站哪裡有提供這樣的訊息呢?
抱歉,我不是不相信你,只是因為要做報告,所以需要一些比較官方的資料,謝謝。

NengYu 提到...

你好, 當初英文官網的硬體資料包含 GPS 主要也是我寫的 :) 關於 Freerunner GPS 硬體的 spec 可以參考 u-blox 4 的技術資料. 你可能需要了解什麼是 GPS, 什麼是 A-GPS, A-GPS 種類有哪些. wiki 資料應該蠻多的.

喬偉 提到...

謝謝,你的回覆。

喬偉 提到...

你好,請問我的freerunner為何無法抓到GPS訊號呢?我有按照你的http://tony-tu.blogspot.com/2008/12/neo-freerunner-7-gps-gps.html
這一篇,使用但是我cat /dev/ttySCA1就是沒有抓到半顆衛星,可否交我一下呢?還有請問一下,你有推荐的kernel和rootfs的版本嗎?謝謝

NengYu 提到...

如果你用 android 的版本應該是沒辦法用 cat 的. 一般版本的話 (OM2008.X/FSO/SHR)應該是要在設定中, 開啟 GPS 電源.

版本的選擇跟你的需要有關, 如果是一般的 GTK/E11, 目前可能 SHR 是最好的選擇. 如果你只要能確定 full 硬體 driver function 可以用 2008.9/11 FDOM 應該足夠. Android 我沒試很多, 我只能確定 0.1.1 wi-fi 跟 audio 跟 openGL ES sample 會動 (SDK/samples). 我目前不是 openmoko 員工, so, 有一些 release 狀況並不是非常清楚 :)

NengYu 提到...

and, 我建議你加入 community list 討論你的問題. either 是 google groups 或是 openmoko 的 mailing list (目前依天還有 20-40 封 mail 討論). 也許剛開使會不習慣, 但是這是進步最快的方式.

光輝之翼 提到...

你好,我按照你的方法依序做下來
Freerunner仍無法與電腦進行連線
lsusb有顯示Freerunner裝置
ADBHOST=192.168.0.202也設定好
ping也有收到
可是執行ADB devices卻沒有顯示
Freerunner裝置,是沒有成功建立連線?
還是有步驟我有做錯?
請大大指點迷津,謝謝

NengYu 提到...

1. ping 的到 192.168.0.202 網路應該是 ok

2. 你可以打 dmesg 看是不是有 register cdc_ether, rename network interface eth1 to eth3 , eth3 become ready

3. 看是不是有重複的 adb server, 先 adb kill-server , ps -ax 檢查再試試看, 如果還不行, 我只能建議重開機依次

4. 如果你 linux 放在 VM 上, 請記得插 usb 時視窗的焦點要在 VM 上. lsusb 應該看到是 1457:5122

光輝之翼 提到...

把Freerunner USB連接到我的電腦,
發現多了一個ethernet device,叫做eth1,
1.使用ifconfig eth1 192.168.0.200 netmask 255.255.255.0

2.設定完後,再ADBHOST=192.168.0.202

3.使用dmesg 出現
eth1:register 'cdc_ether' at usb-0000:00:ld.0-1,CDC Ethernet Device,
00:1f:11:01:8b:b2

沒有出現大大所說的"rename network interface eth1 to eth3 , eth3 become ready"這串文字訊息

感謝大大回覆,謝謝

NengYu 提到...

1. 請問依下你 freerunner 用的 android 版本是哪個版本?
2. 你區域網路是 192.168.0.xx 嗎?

光輝之翼 提到...

1.原廠所附的光碟片將Android kernel解壓縮後放到MicroSD上,再裝入FreeRunner
有可能是1.0或是1.5,這部分我不清楚

2.不是,我的電腦有一張網卡 eth0,給定一個
實體IP用來上網用,需要換成192.168.0.xx 嗎?

NengYu 提到...

1. 我不知道光碟裡面的是哪一個版本, 建議你下載後更新到 0.1.1 或更新的版本. 本機版本應該可以從設定裡的系統資訊看到.

2. 如果你的區網是 192.168.0.xx, ip routing 會跟預設的 usb eth ip 的衝到. 建議 192.168.yy.xx, yy !=0

Hua 提到...

請問一下, 目前我已經將android安裝到fr了, 要如何讓fr透過usb連接到網際網路呢?

NengYu 提到...

FR android usb networking:
PC side:

iptables -A POSTROUTING -t nat -j MASQUERADE -s 192.168.0.0/24

sysctl -w net.ipv4.ip_forward=1


FR side:
route add default gw 192.168.0.200 dev usb0

setprop net.dns1 168.95.1.1

Hua 提到...

Thx, 原來是連進FR下指令= =", 現在才想通...之前一直卡在setprop這個指令...

光輝之翼 提到...
作者已經移除這則留言。
光輝之翼 提到...

感謝大大的幫忙,之前無法建立連線是出在
沒有將Android SDK加到環境變數中
才會找不到Device

建立連線後,發現無法將程式下載到Freerunner,後來更新Freerunner的
Android OS kernel後,問題就解決了

非常謝謝大大的幫忙,謝謝你

光輝之翼 提到...

你好
我現在Ubuntu 9.10環境
下載AndroiSDK 2.0後解壓縮
設定完環境變數後,在安裝eclipse和ADT
依照說明檔執行android SDK/tools底下
android update sdk依序安裝各個platform,也建立好AVD,在執行eclipse
建立Android新專案時,Build Target那個欄位卻沒有任何選項可以選擇,
所以想請教大大該如何解決,謝謝你

NengYu 提到...

我還沒 upgrade ubuntu 到 9.x 跟 anfdroid 2.0, 不過 http://groups.google.com/group/android-beginners/browse_thread/thread/998ba7bf7b23df94 似乎是討論你的問題. 裏面的 ogi user 發現 target item 在, 只是看不到. 選 application name 後按 shift +tab 就可以看到. 不過我沒試過, 只能給你參考.

喬偉 提到...

你好,我使用的freerunner這一之手機,我使用的版本是om2008.12,我現在遇到一個問題,我想編譯kernel,但是這一個版本的kernel是2.6.24,可是我找不到這一個版本的kernel source讓我可以做make menuconfig可以請問,你會用嘛?
我有找到這兩個東西,但是我還是不懂怎們用,可以幫我一起看看嘛?謝啦
http://wiki.openmoko.org/wiki/Qemu

http://svn.openmoko.org/branches/src/target/kernel/2.6.24.x/

Unknown 提到...

請問一下, Allow mock locations這個欄位到底真正的用途是?可以請教一下嗎,謝謝

 
Creative Commons License
著作 係採用創用 CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款授權.