顯示具有 emulator 標籤的文章。 顯示所有文章
顯示具有 emulator 標籤的文章。 顯示所有文章

2008年10月20日 星期一

Android 內部的祕密 - 系統目錄

Android Internal - system directories

您應該已經知道,Android 的核心作業系統是 Linux (現在用的版本是 2.6.25)。因此內部的檔案系統,與系統目錄等,也和 Linux 脫不了關係。要如何觀察這些系統目錄,到底藏了什麼秘密呢?

在 Eclipse 環境中,你可以用 DDMS 來觀察。不過這個 DDMS 在我的電腦上的執行速度,實在太慢了。我個人的偏好是,直接用 adb shell 來觀察。啟動 adb shell 的用法如下:

1. 在 Windows 中,開啟一個命令列視窗 (或執行 cmd.exe 這個程式)
2. cd <android-sdk-install_path>/tools
3. adb shell

當你看到這個 # 提示字元時,就表示你已經進入模擬器的系統。接下來,你就可以用 Linux 上的指令來瀏覽這些目錄。像是 cd, ls, pwd, cat, rm 等等。

這裡面,有幾個目錄是和 Android 相關的,我特地將他整理下來,供你參考。

/system/app

預載入應用程式執行檔 (*.apk),都是放在這。像是 Alarm Clock, Browser, Contacts, Maps,... 等等。

用 DDMS 觀察的話,目錄內的內容,就像下面這樣:

/system/framework

這會放 Android 系統的核心程式庫。像是 core.jar, framework-res.apk, com.google.android.gtalkservice.jar,...等等。疑,1.0r1 不是已經將 gtalk 等相關 APIs 移除了嗎?怎麼他的程式庫還在?雖然許多程式庫都是以 jar 結尾的,不過裡面 Java classes 還是以 dex 格式存在著。

/system/media/audio/(notification, alarms, ringtones, ui)

這裡放系統的聲音檔,像是鬧鈴聲,來電鈴聲等等。這些聲音檔,多是 ogg 格式。

/data/anr/traces.txt

當你的應用程式發生 ANR (Application is Not Responding) 錯誤時,Android 會自動將問題點的 code stack list 寫在這個檔案內,你直接用 cat 命令就可以看他的內容。

/data/app

/system/app 放的是系統預載的應用程式執行檔。而這裡放的是使用者自己安裝的應用程式執行檔 (*.apk)。

/data/data/<app-package-name>

當你在程式中用 Context.openFileOutput() 所建立的檔案,都放在這個目錄下的 files 子目錄內。而用 Context.getSharedPreferences() 所建立的 preferences 檔 (*.xml) ,則是放在 shared_pref 這個子目錄中。

/data/location/gps

這裡看起來,應該是給 GPS location provider 用的。其中的 properties 檔案的內容如下:

requiresNetwork false
requiresSatellite false
requiresCell false
hasMonetaryCost false
supportsAltitude true
supportsBearing true
supportsSpeed true
repeat true
accuracy 100
powerRequirement 1

沒猜錯的話,這應該是用來描述 GPS location provider 有那些功能的。

/data/system/location/location.gps

這個檔案也是個一般文字檔。主要是記錄最後的經緯度座標。LocationManager.getLastKnownLocation() 就在來這抓值的。

/data/property/persist.sys.timezone

這個檔案也是個一般文字檔。主要是記錄目前系統所使用的時區。在我的模擬器上,他記錄著 Asia/Taipei 這個字串。

最後,下面這兩個指令,也很好用。他可以幫你將外部檔案,複製到模擬器的系統檔案目錄內,也可以將模擬器內的檔案,複製到外部系統上。

adb push <local> <remote> - copy file/dir to device
adb pull <remote> <local> - copy file/dir from device


繼續閱讀全文...

2008年9月1日 星期一

在 Android 上更改與取得系統時區及時間

How to change and get the system timezone and clock settings on Android?

最近正在寫一個世界時鐘的程式,期間遇到幾個問題,花了好些功夫,還是沒有得到滿意的答案。分享出來,給其他遇到相似問題的網友,也看看有誰知道答案的。

取得系統時間

要得到目前的時間,這個倒是很容易,就是 System.currentTimeMillis()。不過要注意的是,這個函式傳回的是 UTC (GMT) 這個時區的時間,像台灣所在的時區是 UTC+8,你得將這個函式所傳回的值再加 8 個小時,才是你要的答案。實際上,當然不用自己加,你可以借用 Calendar 這個類別來幫你。

更改系統時間

要更改系統的時間,這可就難倒我了。在 m5 SDK 上,用 SystemClock.setCurrentTimeMillis(),雖然會有警告訊息,不過系統時間還是會被更改。到了 v0.9 SDK,這招就沒效了。掃過 Android 的原始程式,他們的確是用這個函式在更改系統時間。可是在我的程式裡,不管我加了那些 permission,都是給我個 Permission denied 錯誤。最好,只好在 這裡 發文問了這個問題,有個應該是 Google 的工程師,給了下面這個答案。

User apps cannot set the time. Only the system processes can. This is for security, but also because it won't have much effect--the time is reset from the radio via network time.

看了,要在 application 這一層更改系統時間,應該是沒解了。如果有人知道其他答案的,幫忙解答一下。

取得與更改系統時區

用 TimeZone.getDefault() 就可以取得當前的時區,如果你沒有特別設定的話,那你取到的,都是 GMT 這個時區。看起來,至少在 Windows 平台上, Android Emulator 還是不會正確決定當前的時區。目前我知道的唯一方法就是,在啟動 Emulator 的參數上,加上 -timezone "Asia/Taipei"。透過啟動 Emulator 的參數可以更改時區,那可以透過 API 來更改系統時區嗎?我試過 TimeZone.setDefault(TimeZone.getTimeZone("Asia/Taipei")),也用過 System.setProperty("user.timezone", "Asia/Taipei"),沒一個有效。所以看起來,也暫時無解。有誰知道如何透過 API 更改系統時區?


繼續閱讀全文...

2008年7月11日 星期五

我的 Android 模擬器,也有支援 VGA 螢幕

How to enable Emulator to support VGA (480x640) screen?

Google 釋放的 m5-rc15 SDK 中的模擬器,預設只支援下面四種大小的螢幕。

  • QVGA-L - 320x240
  • QVGA-P - 240x320
  • HVGA-L - 480x320
  • HVGA-P - 320x480

最近在 Google I/O 研討會上,有幾隻影片都有 Android 手機的實機展示。從影片中看起來,這螢幕的解析度應該是 HVGA 的。不過,留心 Android 發展的你,應該知道,這第一隻 Android 手機,應該是會由 HTC (宏達電) 所製造的。你也知道,HTC 的最新機器 HTC Diamond,螢幕解析度已經達到 VGA 的水準。這具有 VGA 螢幕的 Android 手機,也有可能很快地被推出。如果你正在寫 Android 程式的話,可別忘了要在有 VGA 解析度的模擬器上,試跑看看,是否 layout 有跑掉。

可是,要如何讓模擬器可以支援 VGA 螢幕解析度呢?

這解法很簡單。

  1. 首先切到 Android 的安裝目錄,並找到其下的 tools\lib\images\skins 子目錄。在這裡,你應該會看到 QVGA-L, QVGA-P, HVGA-L, HVGA-P 這幾個子目錄。
  2. 在這個子目錄下,再新建一個 VGA-P 子目錄。並在 VGA-P 子目錄裡面,加上 background.png 和 layout 這兩個檔案。
  3. 其中的 background.png 圖檔,你就利用小畫家或其他圖形編輯器,產生個寬 480,高 640 大小的 PNG 檔。圖裡面要畫什麼,隨便你發揮。
  4. 另外一個 layout 檔案,其內容如下。
  5. 當下次啟動 Eclipse 時,在 Target 設定畫面中的 Screen Size,你就會看到剛新增的 VGA-P 。

如果你要讓你的模擬器也支援 VGA-L, 640x680 螢幕大小,你可以仿造上述作法,自己新增個 VGA-L 目錄。不過,不用這麼麻煩啦!看一下我之前寫的 這篇。我建議你,自己寫個旋轉螢幕的小程式,只要一執行他,就可將你的螢幕轉成寬螢幕的大小。


繼續閱讀全文...

2008年7月3日 星期四

Android Emulator 功能鍵

Android emulator function keys list

列出 Android Emulator 的功能鍵。

底下是 v0.9 beta 及之後的。

HomeHOME
Menu (left softkey)F2 or Page-up button
Star (right softkey)Shift-F2 or Page Down
BackESC
Call/dial buttonF3
Hangup/end call buttonF4
SearchF5
Power buttonF7
Audio volume up buttonKEYPAD_PLUS, Ctrl-5
Audio volume down buttonKEYPAD_MINUS, Ctrl-F6
Camera buttonCtrl-KEYPAD_5, Ctrl-F3
Switch to previous layout orientation (for example, portrait, landscape)KEYPAD_7, F11
Switch to next layout orientation (for example, portrait, landscape)KEYPAD_9, F12
Toggle cell networking on/offF8
Toggle code profilingF9 (only with -trace startup option)
Toggle fullscreen modeAlt-Enter
Toggle trackball modeCtrl-T
DPad left/up/right/downKEYPAD_4/8/6/2
DPad center clickEYPAD_5
Onion alpha increase/decreaseKEYPAD_MULTIPLY(*) / KEYPAD_DIVIDE(/)

底下是 m5-rc15 之前的。

Home Home key
ESC Back Key
F1/PgUp Menu key
F2/PgDown Star key
F3 Call key
F4 End Call key
F7 Power button
F8 Disable/Enable all networking
F9     Start tracing (only with -trace)
F10 Stop tracing (only with -trace)
Keypad 2468 Dpad arrows
Keypad 5 Dpad center
Keypad 79 Rotate device skin
Keypad + Volume Up key
Keypad - Volume Down key
Keypad / Decrease onion alpha
Keypad * Increase onion alpha
Ctrl-K Switch between 'unicode' and 'raw' keyboard modes

繼續閱讀全文...