2010年8月3日 星期二

如何將寫好的Android應用程式放到機器上執行

Android的應用程式皆以JAVA撰寫,可使用Eclipse去實作,並用AVD (Android Virtual Device)去測試程式,但若要在實機執行呢?
要執行的話,一定要安裝程式的apk檔,大概整理出三種方式:

1. 發布到Android Market,用手機上的Market程式下載

2. 用usb連接電腦,把apk放到SD卡。或者用網路線,使用ftp, tftp或scp把apk放入。

再來去 設定 -> 應用程式 -> 未知的來源  將之打勾
接著使用第三方應用程式,例如apkInstaller或ASTRO file manager,尋找apk檔的位置,再install即可

若要解除安裝,去 設定 -> 應用程式 -> 管理應用程式 選擇要移除的程式 即可!


3. 使用Android SDK tools中附的adb (android debug bridge) 在console下控制


若有usb,連線後,可下 adb devices看是否有連線到

若無,則連網路線,下adb connect ip:port與機器的adbd連線 但要先準備:

1. 主機和機器之間是區域網路 (至少自己在測的時候 用內網可成功 至於外網自己測時是失敗的 改天要再確認),而且互相ping的到

2. 確認機器上的adbd已經啟動,預設是會監聽port 5037 (有些可直接用5555 不必再設置) 但如果要用TCP/IP連線,必須下

stop adbd

setprop service.adb.tcp.port 5555

start adbd

把監聽port改成 5555    (以上也可寫在init.rc中,讓他開機就會有這個屬性)

在原始碼 (system/core/adb/adb.c    line 921) 中 adbd會去看這個property有沒有設置 若有,就用TCP模式去連接機器。若沒有 而且dev/android_adb有USB 就是USB模式 沒有的話就依然使用TCP模式

在機器上可用netstat -a 去看網路裝置的使用情形以及監聽的port為何


最後在主機上 下 adb connect ip:port   (例如 192.168.2.100:5000) 就連接成功了 (若有問題可以用adb kill-server把他關掉 在重新做一次)

之後就可以用 adb shell (進入機器的shell) ....等指令   再主機端做控制了


最後就是安裝,同樣利用adb

下adb install xxx.apk 即可  (前提是apk檔要在SDK/tools中)

但此次實作時卻在機器上出現pm找不到的問題 

pm是一個script 在原始碼的framwork/base/cmds/pm裡面,從內部可知,他會嘗試解開檔案系統內的pm.jar檔,用Android的exec指令 將程式生成 再下install xx.apk 就會安裝了

但不知是否因為shell被改成busybox的shell的關係,pm放到機器上不能跑,自己寫腳本也不行

因此只好把腳本內的指令直接打在shell上 如此一來便安裝成功

所以,adb install xxx.apk的替代方案是:

主機端:
adb push xx.apk /temp/location/xx.apk         
//把apk放入機器


機器端:
base=/system

export CLASSPATH=$base/framework/pm.jar

exec app_process $base/bin com.android.commands.pm.Pm install xx.apk
  //程式會被裝到/data/app裡 (apk檔的權限要設定為可執行)


rm xx.apk





Reference

沒有留言:

張貼留言