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 上執行.

2009/10/12

意料內的意外 = or != 行銷

電視上新聞 "一直" 看到 Michael Jackson 的新單曲在正式 release 前, 很巧的 TMZ 又在網站上搶先 post 了 47 秒的 MV. 這類搶鮮試聽, 或是滿足人偷窺慾望的 release 方式, 實在覺得是很老的梗了, 不過我想應該還是很有效吧 :) 這類真真假假的娛樂新聞, 本來就很容易引起一般人的注意. 不過, 我是很佩服美國娛樂產業可以這麼快的用 "電影" 的方式, 來 release 最後未完成的 "演唱會". 除了行銷的 idea 外, 當初這些在排練 take 的畫面, 以及相關的合約 arrange, 若沒有充足的經驗, 是很難在短時間內組織出相關產品的.

很多 geek :P 可能會覺得這類娛樂新聞很無聊, 可是如果換一個方式呈現, 可能感覺就不一樣, 例如: 某個水果 3C 產品 release 一周被 hack 了, 或是某 online store 下載的軟體用很笨的 folder 方式保護. 到底是 user 破解了保護, 還是 marketing people 破解了 user 的心防.

世界真是有趣阿 :)

2009/10/8

雲端的迷思

這一陣子兩個颱風來, 大家為著氣象局的預報準不準在電視上鬧的沸沸揚揚. 媒體也乾脆把來自各國的預報路線用不同顏色疊在一起. 各電視台面對著向炸彈開花似的預報路線圖, 開始一種路線, 各自表述起來. 觀眾透過最簡單的 client 端: 電視, 收看著來自各個來自 "不同國家" 用 "不同演算法" 在所謂 "超級" 電腦中運算出來的結果. 突然覺得有點好笑, 想一想, 這也是種雲端運算吧, 只不過天邊不是只有一朵雲而已.
 
Creative Commons License
著作 係採用創用 CC 姓名標示-非商業性-相同方式分享 3.0 台灣 授權條款授權.