10 月 072010
 

原文: 在Android模擬器上安裝和卸載APK包 - xusaomaiss - JavaEye技術網站

玩過了一天Android模擬器,也寫了幾個小測試程序。突然有個問題出現,如果脫離Eclipse開發環境,如何能將APK包部署給模擬器呢?

研究了一下模擬器的內存文件系統,似乎沒什麼發現,是一個Linux內核。

於是到google問問老外們,終於知道了,吼吼。

【安裝APK】
安裝APK當然首先是要有模擬器,和要安裝的APK包,這個不多廢話了。直接切入正題,在模擬器安裝APK。
首先,將模擬器執行起來,直到正式進入系統。
接下來,打開一個cmd窗口,路徑切換到模擬器目錄下的tools目錄。
輸入:adb install 你要安裝的apk文件的路徑。
如果看到一行類顯示傳輸速度的文字,那說明安裝成功了。
C:\Documents and Settings\Administrator>cd D:\andriod\tools

C:\Documents and Settings\Administrator>d:

D:\android\tools>adb install c:\NetScramble_1.1.apk
100 KB/s (0 bytes in 164464.001s)

回到Android模擬器的界面,我本來以為可以看到剛剛安裝的APK程序圖標,結果,卻根本沒有...後來研究了一下,發現這根APK包自身有關。使用 自己編寫的HelloAndroid安裝,圖標就可以顯示在桌面上,而NetScramble_1.1.apk安裝後卻顯示不出來。具體原因是來自於AndroidManifest.xml文件的內容。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.xiashou.android">
<application android:icon="@drawable/icon">
<activity android:name=".HelloAndroid" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

xml文件中,紅色一行是表示這個apk屬於哪個歸類裡,如果不正確的填寫這個信息,Launcher將不會將其顯示在桌面上,因為它會認為這個應用部署 以自己的歸類。

那麼,是不是我們就無法執行缺失了category的apk了呢?

後來,在一個老外的blog上,查到了方法:在shell內使用am來加載android應用

usage: am [start|instrument]
am start [-a <ACTION>] [-d <DATA_URI>] [-t <MIME_TYPE>]
[-c <CATEGORY> [-c <CATEGORY>] ...]
[-e <EXTRA_KEY> <EXTRA_VALUE> [-e <EXTRA_KEY> <EXTRA_VALUE> ...]
[-n <COMPONENT>] [-D] [<URI>]
am instrument [-e <ARG_NAME> <ARG_VALUE>] [-p <PROF_FILE>]
[-w] <COMPONENT>

比如啟動一個manifest為如下內容的apk

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="net.xiashou.android">
<application android:icon="@drawable/icon">
<activity android:name=".HelloAndroid" android:label="@string/app_name">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>

使用的指令為:

am start -n net.xiashou.android/net.xiashou.android.HelloAndroid

還有一些很有用處的用法

直接啟動瀏覽器打開一個網址
# am start -a android .intent.action.VIEW -d http://www.xiashou.net

撥打電話
# am start -a android .intent.action.CALL -d tel:10086

啟動google map直接定位在天津
# am start -a android .intent.action.VIEW geo:0,0?q=tianjin

am很可能將來成為第三方lancher的基礎。

【卸裝APK】

與安裝類似的,卸妝是利用adb執行一個卸妝指令:

D:\android\tools>adb shell rm data/app/NetScramble_1.1.apk

這裡,也可以看出,Android系統是將第三方應用放在data/app目錄內的。

【一些思考】

因為模擬器內運行的是一個內存文件系統,也就是說,你安裝的apk文件,在模擬器被關閉後,也就不再存在了(它實際上是被安裝到內存裡)。所以,下次啟動 模擬器,依然需要再次安裝APK。然後,實際測試結果並非如此...於是打開AndroidSDK目錄發現,tools\lib\images的文件都被 更新了。原來Android模擬器是將他的內存系統實時dump到img中保存下來的。

還有一個特別有意義的發現,是從adb shell rm而來的思考。rm本身是linux的一個文件刪除指令,加上前面的shell關鍵字,會不會adb shell直接就能打開一個linux終端呢?實測結果果然如此!不過,Android的linux shell顯然做了很多精簡,大量的linux常用指令都不支持。

更多關於adb詳細的使用,可以使用adb help指令來查看。

轉自:http://blog.sina.com.cn/s/blog_4b07398d010095px.html

在這裡小問一下,我想把android SDK包中自帶的sample代碼加到eclipse有沒有什麼好辦法,我使用eclipse的import好像不行,如何有誰會的請留言。本人打算看 snake遊戲的代碼。

把android SDK包中自帶的sample代碼加到eclipse的方法可以用:

New Project -> 在"New Android Project"界面選擇:Create Project from existing source, 然後Location那地方選擇sample的項目文件夾,就可以導入了。

  One Response to “在 Android 模擬器上安裝和卸載 APK 包”

  1. adb install的时候device not found怎么办啊,请教

 Leave a Reply

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

(required)

(required)

CAPTCHA Image
Play CAPTCHA Audio
Reload Image