2011年4月27日 星期三

[Android] Root 原理與手動 Root 詳細過程 @ Nexus One、Android 2.3.3、Ubuntu 10.04

之前幫 SE X8 with Android 2.1 做過一次 root ([Android] Sony Ericsson XPERIA X8 - Root 教學、關閉拍照聲音),使用的是 SuperOneClick,僅需抓一下手機驅動程式、連接好 micro usb 線,執行程式並按下按鈕,整個過程就結束了。隨後我開始研究到底 root 做了啥事,因為我總覺得好像只要把 su 這隻程式擺進 Android 系統中 ( /system/bin 和 /system/xbin ) ,似乎就完成動作了??


幾番研究後,追了一些文章,其中看到這篇寫得滿仔細的:Simple SDK setup and manual root guide (Windows),經測試也算正常 work 啦,不過有一些過程並不一樣,就順手記一下好了。除此之外,經過這幾篇的操作,稍微明瞭也修正一些觀念:


重灌:


[Android] 第一次使用實體手機 + 清乾淨 + 重裝系統 @ Nexus One 中,自以為透過  "重設為原廠設定" 和 "Recovery from update.zip" 可以回到最乾淨的系統狀態,事後我發現當我把手機 root 後並安裝 Superuser 後,經過上述兩者並不會移除 Superuser 程式,也讓我想起來看到 update.zip 裡頭的 script 事情,是的,上述兩者只能說依照 script 去做事,所以 script 上頭沒提到的就不會做。所以真正要清乾淨系統的方式,應該是要透過 flashboot 去重刷整個系統,如 [Android] Building AOSP & Back to Original Shipping Image @ Nexus One 、Ubuntu 10.04 x86 & Mac OSX 10.6.7 這篇中間所提到,完整清除資料並刷回原廠等動作。這樣也就很清楚為啥想要回復到原廠狀態需要 "原廠 ROM" 囉。


Root 原理:


整個流程目的是將修改後的 su 指令擺進 /system/bin 目錄中(有的還會提到 /system/xbin),然而,預設系統是 Read Only 的,所以想辦法取得 root 權限,接著將系統弄成 Writable 後,把修改過的 su 擺好位置,除此之外,則是將 Superuser.apk 擺進 /system/app ,對 /system/app 目錄進行動作,等於安裝一套軟體,同理把程式移出去就代表移除,實際例子可參考 [Android] Sony Ericsson XPERIA X8 - 刪除內建程式。而 Superuser 這是一款可以管理 root 權限的程式,可以在 Android 手機上操作使用,常常被用來判斷你的手機是否 root 過,因為修改過的 su 版本都是搭配此程式使用的,故一般有 root 過的手機應該都會裝 Superuser 囉


總結流程:


設法拿到 root 權限 -> 更改系統為可讀寫狀態 -> 把修改版的 su 放進 /system/bin -> 安裝 Superuser.apk (擺進 /system/app 裡) -> 回復系統狀態 -> 收工


Root 方式:


手動處理


使用 Android SDK 之 adb 程式,透過 adb push 把檔案移到手機內,並透過 adb shell 連進手機,後續動作如 root 原理流程


透過 SuperOneClick.exe 代勞


實例參考:[Android] Sony Ericsson XPERIA X8 - Root 教學、關閉拍照聲音,仔細看程式的輸出的每一步,就是上述 root 原理的流程啦


透過安裝某個程式 (*.apk)


透過他搶到執行權限,接著把程式內偽裝成圖檔的程式執行(副檔名皆為 png 或 jpg 類的),如此一來也能搞定


透過 update.zip 進行系統回復


仔細去看 script 就可以看到 root 原理的流程喔


在此以 Nexus One with Android 2.3.3 為例,在 Ubuntu 10.04 進行手動 root 流程:


以下是以 Nexus One with Android 2.3.3 進行測試的,不確定是否適用於其他手機環境,並且 root 手機存在風險,其自行評估負責,在此僅供個人筆記使用


Step 0:取得 Android SDK (此步驟可以跳過,因為接下來所需的檔案都在 GingerBreak.zip 裡都有)


只需從 Android SDK - http://developer.android.com/sdk/index.html 下載 Android SDK 後,並更新 SDK 即可。(執行 Android SDK 需要 Java 執行環境,別忘了抓一下 Java SDK 啦)


若在 Windows XP 則需要更新 Android SDK 以取得驅動程式,驅動程式擺在 C:\Program Files\android-sdk\extras\google\usb_driver\ 裡,記得 Nexus One 有普通模式(Google, Inc. Nexus One)和 fastboot 模式(htc, Inc. Android 1.0),兩者所使用的驅動程式不同,但資料都在上述的目錄中。


Step 1:使用 GingerBreak.zip 為例,在 Simple SDK setup and manual root guide (Windows) 下載


裡頭有兩個目錄,一個是有 adb 程式,另一個有 Nexus One 之 Windows 上的驅動程式。


Step 2:在 Ubuntu 10.04 上,設定 USB 對應;在 Windows 上,則是安裝驅動程式(當設備接時,透過指定驅動程式的目錄來安裝)


此為 Ubuntu 10.04 的設置,若是 Windows 可跳過


$ sudo vim /etc/udev/rules.d/51-android.rules


# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"


別忘了將 <username> 替換掉。


$ sudo service udev restart


Step 3:正式進入 root 流程,使用 adb 指令與 Nexus One 互動


首先,將 Nexus One 啟動 USB Debug 模式,在 [設定] -> [應用程式] -> [開發] -> [USB 偵錯] 後,並使用 micro usb 與 PC 連接


使用 adb devices 確認是否有連到機器,應該要可以看到 HT##### 的東西:


$ adb devices


使用 adb push 將 GingerBreak.zip 裡的 su 、 Superuser.apk 、GingerBreak 和 busybox 複製到 /data/local/tmp 中:


$ adb /path/GingerBreak/su /data/local/tmp/
$ adb /path/GingerBreak/Superuser.apk /data/local/tmp/
$ adb /path/GingerBreak/GingerBreak /data/local/tmp/
$ adb /path/GingerBreak/busybox /data/local/tmp/ 


關於 busybox 的東西,其實,主因是 Android 手機內的環境沒有 cp 指令,所以上述作者透過 busybox 來做 copy 的動作。


使用 adb shell 連進手機查看:


$ adb shell
$ cd /data/local/tmp
$ ls -l
busybox
Superuser.apk
GingerBreak
su


透過 GingerBreak 取得 root 權限:


$ cd /data/local/tmp
$ chmod 755 GingerBreak
$ ./GingerBreak


[**] Gingerbreak/Honeybomb -- android 2.[2,3], 3.0 softbreak
[**] (C) 2010-2011 The Android Exploid Crew. All rights reserved.
[**] Kudos to jenzi, the #brownpants-party, the Open Source folks,
[**] Zynamics for ARM skills and Onkel Budi

[**] donate to 7-4-3-C@web.de if you like
[**] Exploit may take a while!

[+] Plain Gingerbread mode!
[+] Found system: 0x######## strcmp: 0x########
[+] Found PT_DYNAMIC of size 232 (29 entries)
[+] Found GOT: 0x########
[+] Using device /devices/platform/goldfish_mmc.0
[*] vold: 0063 GOT start: 0x######## GOT end: 0x########
[*] vold: 0063 idx: -#### fault addr: 0x########
[+] fault address in range (0x########,idx=-####)
[+] Calculated idx: -####
[*] vold: 0635 idx: -000####
[*] vold: 0635 idx: -000####
[*] vold: 0635 idx: -000####
[*] vold: 0635 idx: -000####
[*] vold: 0635 idx: -000####
[*] vold: 0635 idx: -000####
[*] vold: 0635 idx: -000####
[*] vold: 0635 idx: -000####
[*] vold: 0635 idx: -000####
[*] vold: 0635 idx: -000####

[!] dance forever my only one


當看到 "dance forever my only one" 以及提示符號從 "$" 換成 "#" 時,代表取得"暫時性"的 root 權限了。依照 GingerBreak 的執行過程,感覺有點類似透過 Buffer Overflow 去取的 root 權限,但細節不清楚還需研究。


趁著 root 權限時,將系統設定為可讀寫:


# mount
...
/dev/block/mtdblock3 /system yaffs2 ro,relatime 0 0
... 
# mount -oremount,rw /dev/block/mtdblock3 /system
# mount
...
/dev/block/mtdblock3 /system yaffs2 rw,relatime 0 0
... 


將 su 和 Superuser.apk 移到特定位置:


# cd /data/local/tmp
# chmod 755 busybox
# chmod 777 /system/bin /system/app
# ./busybox cp /data/local/tmp/su  /system/bin/
# ./busybox cp /data/local/tmp/busybox  /system/bin/
# ./busybox cp /data/local/tmp/Superuser.apk /system/app
# chown root /system/bin/su /system/bin/busybox
# chmod 4755 /system/bin/su
# chmod 755 /system/bin /system/app


回復系統狀態:


# mount
...
/dev/block/mtdblock3 /system yaffs2 rw,relatime 0 0
... 
mount -oremount,ro /dev/block/mtdblock3 /system
# mount
...
/dev/block/mtdblock3 /system yaffs2 ro,relatime 0 0
...


清除垃圾:


# cd /data/local/tmp
# ls
busybox
sh
boomsh
Superuser.apk
GingerBreak
su
# rm busybox sh boomsh Superuser.apk GingerBreak su
# ls
#


收工!此時可以在手機上看到 Superuser 程式,接著離開 root 環境、adb shell:


# exit
$ exit


 別忘了把手機重開,就完成 root 動作!


 以 adb shell 測試 root:


重開機後,使用 adb shell 與手機連線,並使用 su 指令切換成 root,可以看見手機畫面有訊息:


$ adb shell
$ su


device-adb-shell-su


如果沒有動作,隨著倒數時間一樣會被拒絕,而按下拒絕的結果,那就是熟悉的拒絕句子:


su: permission denied


若按下允許,自然就會從 "$" 換成 "#" 並取得 root 權限。


以 app 測試 root:


從 Android Market 安裝 SSHDroid 這程式,這是 SSH Server ,把他的預設開啟的 port 調到 22 (<1024也可),接著選 Start 後,可以看到詢問頁面:


device-app-su


一樣按下拒絕程式就會顯示相關錯誤訊息,若按下允許,那就會正常執行,並可以看到服務成功綁在 22 port:


device-app-sshdroid


接著可以透過 ssh root@10.0.2.3 的方式登入 Android 手機,此時就是以 root 權限執行任何動作囉!


 




 


最後,來提提上述重要程式的細節,先來說說 GingerBreak 這隻程式,總共才 550 行上下,但使用的系統觀念很多,我也還不太了解,稍微筆記:



  1. 複製一份 /proc/self/exe 和 /system/bin/sh 擺在 /data/local/tmp 中,分別為 boomsh 和 sh

  2. 依照系統編譯的版本,決定等會要使用的策略

  3. 從 /proc/net/netlink 中,取出執行中的 vold 資訊(pid)

  4. 從 /system/libc/libc.so 找尋 system 和 strcmp 相關的特徵

  5. 從 /system/bin/vold 中,找尋相關資訊(還不太懂,晚點再看)

  6. 從 /etc/vold.fstab、/system/etc/vold.fstab 中,找尋一個 dev_mount 裝置,若都找不到改用 /devices/platform/msm_sdcc.2/mmc_host/mmc1 。

  7. 透過 socket 不斷寫資訊給執行中的 vold (在 vold src 中可看到 process_config函數),類似請他掛載裝置。

  8. 一直重複動作 7 直到系統出錯而拿到 root 權限。


關於 GingerBreak 的部分還不太懂,上述極可能有誤,有空再仔細查看。


接著提提 su 的部分,原版 su 部份,在 http://android.git.kernel.org/?p=platform/system/extras.git;a=blob;f=su/su.c 可看到 line 60 的片段:


/* Until we have something better, only root and the shell can use su. */
myuid = getuid();
if (myuid != AID_ROOT && myuid != AID_SHELL) {
    fprintf(stderr,"su: uid %d not allowed to su\n", myuid);
    return 1;
}


可知當執行的 uid 必須是 AID_ROOT 或 AID_SHELL 時,才能取得權限。看看修改後的 su,在 https://github.com/ChainsDD/su-binary 可取得 su.c、su.h 和 activity.cpp 三程式,其中 main 寫在 su.c,稍微研究一下流程:



  1. 取得等待使用 root 權限的程式指令

  2. 如果運行身份是 AID_ROOT 就讓他通過,結束A

  3. 從資料庫的紀錄中,判斷該程式指令是否已經被設定成允許或拒絕,如果資料庫裡有資料,那馬上回應 allow 或 deny,結束B

  4. 如果資料庫中沒資料,接著開啟一個 socket 連線,並且隨後叫起 Superuser 管理介面,詢問使用者是否要允許或拒絕

  5. 從 Superuser 介面得知使用者的回應,透過 sockect 回傳,而 su 將依照結果給予 allow 或 deny,結束C


上述共有 3 種正常的結束方式,不正常的結束就不多提。因此,這個 su 程式,整體上須搭配 Superuser.apk 來使用,依需求叫起 com.noshufou.android.su.REQUEST 或 com.noshufou.android.su.NOTIFICATION 出來,並把使用者決定的結果回傳至 socket 連線。除此之外,若使用者勾選記憶目前的設定,代表以後將默認為允許或拒絕,那 Superuser 介面上還會把允許或拒絕的結果一同紀錄到 databases 中。


那 root 的安全問題?


Q1:惡意程式若直接先改寫資料庫資料,不就可以安然通行?


由 su.h 中得知,資料庫擺在 /data/data/com.noshufou.android.su/databases/permissions.sqlite 位置,該路徑上的存取是需要 root 權限,因為惡意程式還沒取得 root 權限,所以無法變更資料庫內容。但他也還是可以走 GingerBreak 流程,透過漏洞取得 root 權限。


Q2:只要都透過 Superuser 管理,這樣就十分安全嗎?


不。假設有 A, B 兩個程式,其中 A 是介面上看起來超讚超方便的便利程式,但他在使用時需要 root 權限,而使用者也給予並默認後,以後他就用 root 權限一直運行。結果 B 是惡意程式,雖然他無法拿到 root 權限,但 A 可以幫他啊(幫 B 更新資料至資料庫中),所以,一隻惡意程式無法自行運行,但如果有搭配套餐的模式,那麼 B 就有機會取得。整體上這個權限機制並非十分安全,但對一般情況來說,算是夠了。


Q3:如何安全使用?


定期去查看 Superuser 上的紀錄,請盡可能搞懂給予 root 權限的程式到底做了什麼事。隨意下載的程式,沒有使用要記得移除。


結論:


記得去年就看 iOS app 相關文章,隨著 app 的量大,就曾聽到別人提過,以後使用者可能都只使用大廠軟體,就像現實生活中,人會有追求名牌的行為,這個現象將導致名牌廠會越做越好越大,在加上商譽影響,名牌廠就比較不會有惡意程式的行為,雖然仍不可保證就絕對不會有惡意。此外,其他無名程式,依舊存在惡意程式的機會,為了降低風險,資安意識下,就比較會去用 open source 或原廠軟體,以通訊軟體來說,有 MSN、Mail 等類,與帳號、隱私有高度相關性,雖然原廠不見得做的好或方便操作等,但基於資安方面,還是建議安裝原廠程式,不然就是使用有用原廠公開 API 的開發程式。


參考資料:


https://github.com/ChainsDD/su-binary/blob/master/su.h
https://github.com/ChainsDD/su-binary/blob/master/su.c
https://github.com/ChainsDD/su-binary/blob/master/activity.cpp

https://github.com/ChainsDD/Superuser/blob/master/AndroidManifest.xml
https://github.com/ChainsDD/Superuser/blob/master/src/com/noshufou/android/su/SuRequest.java
https://github.com/ChainsDD/Superuser/blob/master/src/com/noshufou/android/su/SuNotificationReceiver.java

http://rootzwiki.com/wiki/index.php/Gingerbreak
http://wikifilez.com/Root%20Files/gbreak/GingerBreak.tgz
http://wikifilez.com/Root%20Files/gbreak/GingerBreak-v1.00.apk
http://wikifilez.com/Root%20Files/gbreak/GingerBreak-v1.10.apk

http://android.git.kernel.org/?p=platform/system/vold.git;a=tree
http://android.git.kernel.org/?p=platform/system/vold.git;a=blob;f=main.cpp


2011年4月24日 星期日

Android 開發教學筆記 - 使用 Android Interface Definition Language (AIDL) 處理 IPC

 


在 Android 開發環境上頭,除了單一程式的運行外,也常常使用 Service 等背景執行方式,等於一個 app 會跑兩隻 process,而兩隻 process 的溝通常用 Inter-Process Communication (IPC) 來稱呼,而 Android 環境上,常見於前景運行的 main 程式與背景執行的 service 溝通,而 Android 上提供 Android Interface Definition Language (AIDL) 的實作方式。

從官方文件可瞧見實作步驟,在此粗略地筆記:



1.建立 .aidl 檔案,如 Java 的 interface 一般,用於描述控制兩 process 間的互動,例如 main 要叫 service 做什麼事等
2.實作 interface 的項目,在此可稱作 controller ,於 main 中建立,以後 main 就透過 controller 請 service 做事


2011年4月23日 星期六

[Android] 常用免費離線軟體

最近對 Android 比較有愛,下班還會抽空研究研究,自從家人有了 Android 手機後,也開始會幫忙裝些有的沒有的。由於一切以經濟、便利為最重要的考量,所以目前不打算花錢買 app 並且避開需要網路的 app 啦(或是只在 wifi 環境下使用)。


記得幾天前也跟同事閒聊,詢問關於智慧手機對他而言的便利性,同事很簡潔地回答,只需 "打電話" 跟 "網路" 就好了 XD 因為有了網路就可以上網查東西啦,倒不是甚麼 killer 級的 app 讓他愛不釋手耶。這些使用習慣剛好跟我相反 XD 大概我太龜毛了,就是喜歡考慮沒網路的環境 Orz 我本身使用智慧型手機也沒在用 3G 網路啦,算起來只有一次去台北出差時,跟同事借過一張吃到飽的 sim 卡罷了,當時的想法是耗電快、網路速度慢 :p 總之,來筆記一下自認為的 killer 級的生活類 app


環境敘述:


一支 Android 2.1 手機,搭配 16GB microSD 卡,現在一張 16 GB 大概不用 800 元。


生活類:



RMaps - 離線地圖


出門在外,如果有張地圖存放在手機內,豈不是很方便嗎?假使手機又有 GPS Reader 的話,又可以幫你定位在地圖上,馬上得知自己的周遭位置,豈不爽乎?哈,這些功能是不需要網路就能達成的,這正是離線地圖。唯一的缺點是使用 GPS 定位也是挺耗電的 XD 請酌量使用。


用法:


在 Android Market 上搜尋 RMaps 就可以找到,安裝完後,點選 [Rmaps] -> [設定] -> [使用者定義地圖] 後,當你用 USB 連結手機時,在手機記憶卡中可以看到 rmaps 目錄,其中有子目錄 maps ,只要將你做好的離線地圖擺在 /sdcard/rmaps/maps 中,接著從 [Rmaps] -> [設定] -> [使用者定義地圖] 裡啟用剛剛放入的離線地圖,接著換到 [Rmaps] -> [地圖] 中,挑選剛剛放入的離線地圖,此時程式需要初始化相關設定,等一會兒後都弄好後,你就擁有離線地圖的功能啦!將會依照你所設定的地圖資料,呈現在手機上喔!


至於製作離線地圖的方式,可以 Google 看看 XD 可以透過 Mobile Atlas Creator 自行製作或許還可以找到別人做好的離線地圖喔,全台範圍的離線地圖且精細度到 0-17 的圖資,大小約 1.8GB。



ColorDict 辭典 - 離線字典


除非是英文超強者,不然生活上很容易就會碰到不懂的單子,這時候就需要字典的幫忙!出門在外,看不懂就虧大啦!


用法:


在 Android Market 上搜尋 ColorDict 安裝後,除了本身程式可以透過[下載詞典資料]自動到 Android Market 下載官網內建的辭典外,還可以使用 StarDict 星際譯王 的辭典檔!雖然 ColorDict 官網的詞典有英中類辭典(English Chinese Dictionary),下載完執行他就會幫你把資料移到手機記憶卡的特定位置 /sdcard/dictdata 中,但是簡體的!如果看的慣就使用,看不慣就可以改去下載 StarDict 星際譯王 的,裡頭有繁體中文,只是,現況竟然找不到下載位置!慶幸的,從 Android @ PTT - [軟體] StarDict 字典檔下載 (for ColorDict...etc) 中,可以得知有善心人性幫忙 mirror 一份啦,所以我就下載三份:


21 世紀英漢漢英雙向詞典,解壓縮約 26.6 MB (stardict-21shijishuangxiangcidian-big5-2.4.2.zip)
21 世紀雙語科技詞典,解壓縮約 40.1 MB (stardict-21shijishuangyukejicidian-big5-2.4.2.zip)
牛津現代英漢雙解辭典,解壓縮約 14.8 MB (stardict-oxford-big5-2.4.2.zip)


將解壓縮的成果 dict_name.dict 、 dict_name.idx 和 dict_name (dict_name只是個例子),皆擺進 /sdcard/dictdata 中即可,如此一來重新開啟 ColorDict 時,程式就會自動幫你建立相關資料,以後就可以從這些詞典,進行查詢啦!就不用再透過網路囉。


除此之外,也可以在 [ColorDict] -> [詞典] 裡,設定查詢結果的優先順序,目前我是把 "21 世紀英漢漢英雙向詞典" 排第一啦,因為他的排版不錯。



Dropbox 網路硬碟服務 - 離線文件


網路硬碟並不陌生,但如果有一套軟體不侷限單檔大小,又支援各類平台 (Windows、Linux、iPhone、Android),豈不方便 :D 這就是 Dropbox 啦!可以註冊免費的會員,享用 2GB 空間,並且透過邀請更多朋友後,可以提升容量到 1x GB 喔。唯一缺點是上傳檔案到 Dropbox 有點慢 :p


用法:


在 Android Market 上搜尋 Dropbox 就可安裝使用,假設你有一些文件存在 Dropbox 空間,那麼在手機端使用只需點選、閱讀後,手機上就留有一份啦,所以沒有網路的狀態也可以使用喔!例如把一些照片、PDF文件等(若手機預設不支援 PDF 的話,可以在 Market 上搜尋 PDF ,安裝 adobe reader 啦),也很方便


然而這並非 Dropbox 的主要服務,其本身原先是用來做各平台同步功能,例如你有 A, B 兩台電腦,裡面裝了 Dropbox 並使用相同帳號,那就可以同步指定的目錄,除了將資料也備份到 Dropbox Server 外,也能確保 A 跟 B 中,指定目錄裡的資料是同步的。當然,也支援多台電腦、裝置,不侷限 2 台喔!



Skype 網路電話


雖然 MSN 比較流行,也支援網路電話的功能,但是,Skype 可以支援多人聊天,無論是語音還是文字甚至傳檔案喔!(Skype語音服務有人數限制),除此之外還有加密功能!但這不是使用他最大主因,真真重要的,如果周遭有免費的無線網路可以使用時,那就可以用 Skype 講網路電話!如果你的裝置有 Webcam 或前置 Camera 的話,網路夠順時,還可以視訊電話呢。除此之外,如果家中有 2 台 PC 、一台可跑 Skype 的智慧手機,三處用同樣帳號持續登入,當有人播打網路電話找你時,三處皆會響,你可以決定使用哪個裝置接電話,豈不是咱門傳統電話,讓多層樓都可以接電話啊 :D 以前曾經想要花大把鈔票買 Skype 電話(僅需無線網路就好,剩下使用就像一般電話),講國際電話超省錢,現在有了智慧型手機就可以安裝 Skype 軟體達到一樣的目的囉!


用法:


除了在 Android Market 上用 skype 關鍵字找到安裝外,那還需要一組帳號,可以輕鬆註冊免費申請喔,其他的就跟在 PC 端使用上沒啥差別。



bbs reader


PTT 上頭有豐富的台灣類資料,所以,有時在 wifi 環境下,透過手機能夠查詢到也是很不錯的!這時就可以使用 bbs reader 啦!


用法:


在 Android Market 上使用 bbs reader 下載並安裝,剩下來就是挑選 ptt 還 ptt2 就可以使用了!如果對 PTT 常用的,應該動作都很直覺啦。最重要的是連線部分採用 SSH 加密連線唷!超讚的啦


其他類:



注音倉頡輸入法


大部分台灣買的手機,該名牌廠預設都已經有好用的中文輸入法,但使用 Nexus One/S 系列的手機,預設可能會沒有中文輸入法,這時候就需要找一套中文輸入法啦。然而,一套輸入法是有許多資安問題的!常玩線上遊戲的,對於鍵盤側錄應該不陌生,一不小心就因為電腦中了木馬,鍵盤上打出的任何一字都被記錄下來,進而被盜帳號。因此,在 Android 這個開放空間上,輸入法的安裝也是很危險的(例如常用服務的帳密、信用卡卡號等),所以,在此挑選 Open Source 的軟體 android-traditional-chinese-ime(該軟體留言有說是台灣 Google 作的,細節我不清楚,但可以看到開發者的 Email 是 android-tc-ime@gmail.com)


用法:


在 Android Market 上搜尋 chinese input (一開始不能打中文),如此一來就能安裝啦,之後再到 [設定]-> [語言與鍵盤] 中啟用輸入法。更多圖示資訊可以到 android-traditional-chinese-ime 觀看,有豐富的使用教學



Adobe® Reader®


有些名牌廠的手機預設就可以看 PDF 文件,如果不行的話,就安裝一下 Adobe Reader 吧!


用法:


在 Android Market 上搜尋 pdf 就可以看到並安裝,以後從瀏覽器、 Dropbox 或其他軟體上點選 pdf 文件就可以觀看了



Flash Player 10.2


如果你的手機夠新(Android 2.2以上),硬體夠好的話,想要瀏覽 Flash 網頁,那就安裝 Flash Player 吧!目前看留言有許多抱怨文 XD 我猜大概是支援還不完全,以及跑 Flash 真的很耗資源,硬體不夠好時,使用體驗應該會滿糟的,最差的情況還會影響其他軟體的使用,希望未來能夠越來越好。(很多人安裝大概是想玩 Facebook 遊戲吧?!)


用法:


在 Android Market 上搜尋 flash 就可以看到並安裝,以後從瀏覽器或其他軟體上就可以觀看 Flash 內容


遊戲類:


大部分的遊戲,要嘛付費要嘛廣告,所以,面對廣告的部分,就把無線網路關掉就沒差啦 XD 完全符合家人的使用!唯一要留意的是手機硬體規格是否可以跑的動 :p 目前我覺得 Angry Birds 需求還 ok 囉



Angry Birds



Angry Birds Seasons



Angry Birds Rio



Baseball Superstars® Free


黑手類:



SSHDroid


這是黑手常需要用的工具 XD 可以用 SSH 登入到自己的手機,查看或惡搞東西專用。



Superuser


很神秘的軟體


最後,還滿常聽到別人抱怨智慧型手機耗電快,主因大概是使用無線網路或是打太多遊戲吧 cc 把手機無線網路、藍芽、定位等相關東西關掉後,其實還滿省電的,再加上智慧手機的電池量也都不低,所以不用耗電相關的程式,也可以 1~2 天才充電。


2011年4月19日 星期二

Android 開發教學筆記 - 開發上碰到的 bug 筆記

今天同事跑來問我一些問題,我看到他的 code 馬上就猜出問題在哪 XD 明明同樣的 code 在其他範例可以跑,但此刻就是跑起來會看到 exception,是誰都會很火大吧 XD


解決方式?其實沒有正解 XD


狀況一:


現象:


public void onCreate(Bundle savedInstanceState) {
    ...
    Button testBtn = (Button) findViewById( R.id.testBtn );
    testBtn.setOnClickListener(this);

    ...
}


並且 layout/main.xml 中已經補好 Button 並且 id 為 testBtn 了,但很奇怪的跑上述程式會當掉,直到把 testBtn.setOnClickListener(this); 移除才 ok


解法:


去變動一下 layout ,例如在加個 textview 後再存檔,或許可以解決 XD


我之前為了這種問題,程式碼都改寫成:


    Button testBtn = (Button) findViewById( R.id.testBtn );
    if( testBtn )
        testBtn.setOnClickListener(this);


但這只是避免 exception 罷了 :P 目前正解還不清處,或許真的只要重開 Eclipse 就能解決吧


狀況二:


現象:


使用 Worker thread 去做運算,並且完工後去更新 UI 部分,結果就是不正常,(有時)無法更新 UI


解法:


上過課後,我才明瞭這個問題!因為 Android UI is not thread-safe ,所以更新 UI 請統一交給 main thread 處理。這也是我在 Android 開發教學筆記 - 使用 Regular Expression、Network Connection 和 Thread 中曾碰到的問題,那時也只是誤打誤撞把更新 UI 的動作交還給 Handler 來解決。


嗯,目前太少開發,筆記僅有上述兩點 Orz


經過這次聽別人的上課,我覺得收穫還不少,雖然自己去找資料可以完成一些功能面的工作,但系統底層還是要多多了解,這通常會受限於時間關係而無法進行,這時候聽別人上課可以有所吸收啊。


Android 開發教學筆記 - 使用 DDMS 和 traceview 筆記

DDMS 是 Android 開發中一個極為重要的 debug 工具,可以拿來查看模擬器上頭運行的 process、file system (sdcard) 等,不過我都沒在用 :P 每次開發碰到問題時,就想辦法透過 logcat 印出來看罷了,又再一次不善加利用環境。


這次上了課,了解了 DDMS 的強大,透過 android.os.Debug 可以查看某個 function 的運行時間,搭配 traceview 可以有圖形化介面觀看,除此之外還可以查看記憶體使用量等,十分方便。


建立一個 Project 後,除了模擬器要加 SDCard 空間外,別忘了記得打開 projects 寫入 SDCard 的權限,因為產生的報表會儲存在 SDCard:


<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"></uses-permission>


接著對想要監控的函數使用 Debug.startMethodTracing( "report" ) 和 Debug.stopMethodTracing() 夾擊起來,此例以 setContentView(R.layout.main); 為例:



package com.test;

import android.app.Activity;
import android.os.Bundle;
import android.os.Debug;

public class TEST extends Activity {
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Debug.startMethodTracing("report");
        setContentView(R.layout.main);
        Debug.stopMethodTracing();
    }
}


當程式跑起來後,可以用 Eclipse 切換到 DDMS ,先在左上角 device 視窗挑選 process (此例 package 為 com.test),查看 File Explorer 的部份,應該在 sdcard 區會找到 report 字樣的文件檔,此時可以透過 adb 把它取出來,或是透過 DDMS 右上角匯出(pull a file from the device):


$ /path/android-sdk/platform-tools/adb pull /sdcard/report.trace /tmp


ddms


接著用 traceview 查看:


$ path/android-sdk/tools/traceview /tmp/report.trace


traceview


如此就可以查看指定函數所耗費的時間,並且可以使用滑鼠去圈選上方顏色部分,可以拉大圈選範圍以方便觀看喔。


最後補充一點,此處使用的 Debug.startMethodTracing( "report" ) 和 Debug.stopMethodTracing() 僅適用於純 Java 這層的部份,例如有些是 call native c 的部份,則不適用,因此監控花費時間的部份,使用上需留意。另外,查看記憶體使用量是用 Debug.startAllocCounting() 和 Debug.stopAllocCounting() ,或是直接用 DDMS 的 Allocation Tracker 來使用囉。


2011年4月18日 星期一

Android 2.3 Compatibility Definition Document

之前選修了一門 Android 課程,講師在課堂上談論到關於取得 Android Source Code 的事,分享了這個東西:Android 2.3 Compatibility Definition - http://source.android.com/compatibility/2.3/android-2.3.3-cdd.pdf


看到 Android 2.3.3 規範硬體規格,才驚覺之前看到一些開發文章有在抱怨,這類的抱怨應該是硬體商吧?因為製作出來的產品要對外宣稱搭配 "Android x.x" 系統時,必須得到 Google 的認可,不然可會收到律師寄來的信啊!而 CDD 文件就是一個規範條文。接著聽到講師偷酸了一下拿 Android 2.3 來做電視等東西,因為 Android 2.3 有規範硬體需要前後鏡頭,看 CDD 可知,其中後鏡頭是必須的(TV要後鏡頭幹嘛?),不然拿出去賣的產品是無法認證成功的,接著下又提到 Android 2.3 系統本來就規範給 mobile phone 用的,那坊間的七~九吋平板電腦呢?那些是使用 Big Phone 去認證的 XD 聽起來也令人笑一下。


關於取得 Android Open Source 部分,共分成 3 個順位,第一個順位必須是大廠、名牌廠,第二順位是系統廠,第三順位才是 AOSP。主要由第一順位申請拿 source code ,並且有發表產品後,第二順位才開始,例如看見大廠 Android 3.0 的產品已經開始在賣,這時候才輪到第二順位提出申請。然而申請也不是隨便申請就能通過,還必須要有前一版的實機產品,例如想要拿到 Android 3.1 source code ,那還得有先有 Android 3.0 的產品等。


總之,稍微筆記一下,如果想要把 Android 套用在一些產品時,這份文件沒有讀百次也該看個數十次吧!等搞懂規定後再來規劃產品的定位吧。


2011年4月15日 星期五

Android 開發教學筆記 - 使用 Eclipse 小技巧 - 自動補齊延伸功用 & 查詢原始碼(Android Class 的實作)

Eclipse 是一套很強大的 Open Source 編輯器,但我太習慣純文字編輯器,如 vim 系列,導致一直冷落它,甚至只把他當做肥滋茲的 vim 來用。


今天上一門課時,看到講師很俐落地使用 Eclipse ,讓我決定筆記一下,以免自己都忘光。


[自動補齊]:撰寫程式碼,請從底部往上寫(先寫呼叫,再透過 Eclipse 自動補好宣告)


以前寫 C 語言時,總是先宣告變數,接著才開始寫如何使用變數,現在則要反過來用,例如目標:


import android.media.MediaPlayer;

class MyMediaPlayer
{
    public mMediaPlayer;
    private test()
    {
        mMediaPlayer = MediaPlayer.create( this  , R.raw.test.mp3 );
    }
}


上述並非正確可編譯的程式,在此只看著色處。此程式碼代表想要使用 MediaPlayer 這個 class,傳統的實作就是從上面先 import 完,接著宣告,再來使用,但如果是使用 Eclipse 編輯器的話,請倒過來寫,先寫:


MediaPlayer.create( this  , R.raw.test.mp3 );


寫完後若上頭沒 import 的話,一定會出現警告的紅波浪底線,這時候先按快速鍵進行存檔,緊接著用滑鼠去點選剛剛那 line 最左邊的錯誤符號,此時 Eclipse 會告知你可以做什麼修補動作,這時候就可以直接點選 import android.media.MediaPlayer; 啦!就完成 import 部分,並且再存檔後,再多打 "mMediaPlayer =":


mMediaPlayer = MediaPlayer.create( this  , R.raw.test.mp3 );


並且再存檔後,按左邊的錯誤訊息,這時又會推薦你要做什麼事,此時就可以選擇想要的項目,此例該選 Create field ... 那項。


01


如此一來,上頭就自動加上 private mMediaPlayer 宣告部份了!但這一切有什麼好處?除了少打字外就沒了嗎?不,還存在一個隱性好處,那就用 mMediaPlayer 的變數已經被系統記住相對位置了,所以可以在任何一處重新命名,此命名動作將會統一全部更換,而不需要一處處地去更改,這就是方便 Refractory 啦!這才是最重要的地方。


02


除此之外,透過 Eclipse 自動補齊方式,也可以避免打錯字囉。


[查詢原始碼]:按著 CMD 再點選已知的 Class (這是 Mac OSX 指令,在 Windows 上可能是按著 Ctrl 或 Alt)


我記得同事有跟我說過,但因為我沒再用,久就忘了。這次是在 Android 開發環境上,可以先將內建的 packages 擺放在下載的 SDK 相關目錄中:


/path/android-sdk/platforms/android-#/sources/packages


其中 android-# 代表使用的 API 版本,例如 Android 2.1 就是 android-7。接續的 sources 則必須自行建立,預設是不存在的,而 packages 代表的是使用的函式庫,如 MediaPlayer 的話:


/path/android-sdk/platforms/android-#/sources/android/media/MediaPlayer.java


至於程式碼到底該去哪下載?官方介紹 AOSP - Downloading the Source Tree ,透遇上面的介紹,至少會下載 5.5GB 以上的資料回來,並且擺在WORKING_DIRECTORY/framework/base 裡頭,以及分散在各類 packages 裡頭:


Media 類:WORKING_DIRECTORY/framework/base/media/java 裡


Core 類:WORKING_DIRECTORY/framework/base/core/java 裡


如果只要下載這邊的程式碼,可以改挑 git://android.git.kernel.org/platform/frameworks/base.git 這邊,而下載回來的東西,就需要再整理一下 Orz 例如把需要的 code 都集中起來:


$ cd WORKING_DIRECTORY/framework/base
$ find . -regex './[^/]+/java'
./telephony/java
./keystore/java
./wifi/java
./media/java
./opengl/java
./drm/java
./vpn/java
./core/java
./voip/java
./service/java
./graphics/java
./sax/java
$ find . -regex './[^/]+/java' -exec cp -r {} /tmp \;


如此一來,在 /tmp/java/ 裡面就是相關的 sources code 啦,僅須把 android、com 和 javax 三個目錄複製到 /path/android-sdk/platforms/android-#/sources/ 裡就行了。於 2011/04/15 下載,壓縮起來約 5~6 MB 而已,懶得弄可以下載:sources.20110415-2125.zip


2011年4月14日 星期四

[Android] Building AOSP & Back to Original Shipping Image @ Nexus One 、Ubuntu 10.04 x86 & Mac OSX 10.6.7

device01 device02


AOSP 全名是 Android Open Source Project,既然有 Open Source 那就要編一下啊~不過,這真的是條不歸路 XD 在此就紀錄一下編出 AOSP 跟還原到原廠設置的流程,其中後者過程算是不滿意但還可以接受狀態,因為我沒找到官方公佈的 image 檔,而是從 xda-developers (md5sum: bef86698cafc88ca03fff5758571d9d6) 那邊下載到的,若有人知道官方處,麻煩留言一下下啊,感謝!


警告,私自更動手機狀態,將可能喪失保固,請自行評估與負責,此篇僅為個人筆記


另外一提,手上這隻 Nexus One 其 bootloader 早已解鎖(unlock)過了,在此就不多談 unlock 的過程。關於編譯環境是 Ubuntu 10.04 x86 的作業系統,並更新至最新狀態,但一切都是在 VirtualBox 4.0.4 r70112 上運行,巧的是 Host 也是 Ubuntu 10.04 Desktop x84,以下操作皆為 Guest OS 上頭,於 Host 機器上僅需手動調整 VirtualBox ,讓手機 USB 掛載上去。


Guest OS Ubuntu 10.04 x86 額外安裝便利的操作環境:


sudo apt-get install openssh-server vim 


如果 add-apt-repository not found 那就多安裝一下 python-software-properties。


編譯自己的 AOSP:


主要流程:http://source.android.com/source/ ,強烈建議先看過 Initializing the Build Environment、Downloading the Source 和 Building and Running 章節。


Step 1:安裝 Java SDK


$ sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
$ sudo add-apt-repository "deb-src http://archive.canonical.com/ubuntu lucid partner"
$ sudo apt-get update
$ sudo apt-get install sun-java6-jdk


Step 2:安裝編譯環境


$ sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev mesa-common-dev


Updated @ 2011/05/09:


mesa-common-dev 並非官方文件上有提到的,但在編譯時會碰到以下問題


host C++: libEGL_translator <= development/tools/emulator/opengl/host/libs/Translator/EGL/EglX11Api.cpp
In file included from development/tools/emulator/opengl/host/libs/Translator/EGL/../include/EGL/egl.h:36,
                 from development/tools/emulator/opengl/host/libs/Translator/EGL/EglOsApi.h:19,
                 from development/tools/emulator/opengl/host/libs/Translator/EGL/EglX11Api.cpp:16:
development/tools/emulator/opengl/host/libs/Translator/EGL/../include/EGL/eglplatform.h:89:20: error: GL/glx.h: No such file or directory
In file included from development/tools/emulator/opengl/host/libs/Translator/EGL/EglX11Api.cpp:16:
development/tools/emulator/opengl/host/libs/Translator/EGL/EglOsApi.h:23:19: error: GL/gl.h: No such file or directory
...
make: *** [out/host/linux-x86/obj/SHARED_LIBRARIES/libEGL_translator_intermediates/EglX11Api.o] Error 1


這是 make libEGL_translator 時所碰到的,解法就是安裝 mesa-common-dev 就可以搞定啦。也能先用相關指令確認系統是否已經有相關函式庫:


$ dpkg -l | grep mesa-common
ii  mesa-common-dev                      7.7.1-1ubuntu3                                  Developer documentation for Mesa


因為我是 x64 環境,所以額外再安裝相關的 32bit 函式庫:


$ sudo apt-get install gcc-multilib g++-multilib libc6-i386 libc6-dev-i386


Step 3:設定系統 USB 裝置事項


$ sudo vim /etc/udev/rules.d/51-android.rules


# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>”


記得要把 <username> 更新為使用的帳號名稱


Step 4:下載 Android 程式碼


$ mkdir ~/bin
$ PATH=~/bin:$PATH
$ curl http://android.git.kernel.org/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ mkdir yydroid
$ cd yydroid
$ repo init -u git://android.git.kernel.org/platform/manifest.git
$ repo sync


其中 yydroid 是要擺放 source 的目錄,可以自行修改名稱。而下載程式碼的部份,在 2011/04/12 所抓到的是 5.5 GB 大小,使用 500~2000 KB/s 的速度,大概花費 45 分鐘,以下是用 time 測得:


real 41m13.241s
user 4m46.860s
sys 1m20.600s


Updated @ 2011/04/13:


在另一台 Host 是 AMD X4 945 + 8GB RAM 其 OS 是 Win 7 x64,配給編譯的 Guest OS 是 2GB RAM + CPU x2 ,其網路確定最高速是 5Mb/s 對稱網路,全速抓最高也才 500~600 KB/s,用 time 測試結果:


real 209m24.113s
user 2m45.690s
sys 2m15.280s


可以參考網路速度。


Step 5:編譯原始碼


初始化環境


$ cd yydroid
$ source build/envsetup.sh


在編譯過程前,必須先取得 Nexus One 相關 binary 資料(此過程不確定是不是抓 Drivers ,有興趣可以去查看 extract-files.sh),而抓取資料需使用 adb 指令,如果沒有安裝過 android sdk,那就先編譯 adk 出來


$ make adb
$ PATH=~/yydroid/out/host/{host-type}/bin/:$PATH
$ adb root


抓取 Nexus One 資料


別忘了把手機設定為開發模式


[設定]->[應用程式]->[開發]->[USB偵錯]


確認有連到手機


$ adb devices
HT#########    device


開始抓資料


$ cd ~/yydroid/device/htc/passion
$ ./extract-files.sh


190 KB/s (26116 bytes in 0.133s)
415 KB/s (80036 bytes in 0.188s)
203 KB/s (18516 bytes in 0.088s)
117 KB/s (11542 bytes in 0.096s)
6 KB/s (587 bytes in 0.092s)
185 KB/s (17684 bytes in 0.093s)
450 KB/s (122442 bytes in 0.265s)
496 KB/s (122442 bytes in 0.240s)
474 KB/s (122442 bytes in 0.252s)
11 KB/s (1156 bytes in 0.102s)
99 KB/s (9220 bytes in 0.090s)
208 KB/s (27612 bytes in 0.129s)
407 KB/s (79936 bytes in 0.191s)
478 KB/s (163008 bytes in 0.332s)
581 KB/s (1746672 bytes in 2.931s)
503 KB/s (206768 bytes in 0.401s)
371 KB/s (60440 bytes in 0.159s)
280 KB/s (34548 bytes in 0.120s)
104 KB/s (9320 bytes in 0.087s)
539 KB/s (449992 bytes in 0.815s)
142 KB/s (14240 bytes in 0.097s)
514 KB/s (357740 bytes in 0.679s)
152 KB/s (13984 bytes in 0.089s)
380 KB/s (86344 bytes in 0.221s)
329 KB/s (54872 bytes in 0.162s)


開始編譯


$ cd ~/yydroid
$ lunch full_passion-userdebug
$ make -j 4


使用的 Host 機器是 AMD X4 955 + 4GB RAM ,配給編譯的 Guest OS 是  1.5GB RAM + CPU x1,用 time 測試結果:


real 101m48.827s
user 104m18.890s
sys 8m21.430s


Updated @ 2011/04/13:


在另一台 Host 是 AMD X4 945 + 8GB RAM 其 OS 是 Win 7 x64,配給編譯的 Guest OS 是 2GB RAM + CPU x2,採用 lunch full-eng 後,用 time 測試結果:


real 60m4.647s
user 112m57.410s
sys 10m51.210s


在 Mac mini OSX 10.6.7,2GB RAM,CPU 是 2GHz Intel Core2 Duo,僅使用 SSH 登入後執行相關動作,採用 lunch full-eng 後,用 time 測試結果:


real    89m54.709s
user   139m58.045s
sys     15m54.753s


在 AMD X4 955 + 4GB RAM 中,採用 lunch full-eng 後,用 time 測試結果:


real    25m22.341s
user   98m34.990s
sys     6m16.400s


Step 6:刷機啦!


看一堆文章都用刷機字眼,我記得以前修課時都是用燒這個字眼 XD 反正入境隨俗,給他刷下去吧!在刷機之前,必須將 Nexus One 狀態切換至 fastboot mode,此時才能進行刷:


a. 把手機關機
b. 按住 "軌跡球" + "Power 鍵" 開機,即可進入神秘的模式
c. 使用 "音量鍵+/-" 來移動選擇項目,請選擇 Fastboot 並用 "Power 鍵" 選定,進入後可以看到 Fastboot 字樣,其背景顏色是紅色的


接著切換到 Ubuntu 操作,如果跟我一樣用 VirtualBox 的話,請先手動掛載 USB 裝置並挑選 htc 字樣,接著切換到 Gest OS 上,也就是剛剛編譯環境:


$ cd ~/yydroid/
$ fastboot devices (可以查看有沒連線的手機) 
$ fastboot -w flashall (正式刷機) 


--------------------------------------------
Bootloader Version...: 0.35.0017
Baseband Version.....: 5.08.00.04
Serial Number........: HT##########
--------------------------------------------
checking mid...
OKAY [  0.007s]
checking product...
OKAY [  0.005s]
checking version-bootloader...
OKAY [  0.006s]
checking version-microp...
OKAY [  0.006s]
checking version-baseband...
OKAY [  0.007s]
sending 'boot' (2320 KB)...
OKAY [  1.758s]
writing 'boot'...
OKAY [  0.922s]
sending 'recovery' (2558 KB)...
OKAY [  1.965s]
writing 'recovery'...
OKAY [  1.002s]
sending 'system' (92329 KB)...
OKAY [ 69.955s]
writing 'system'...
OKAY [ 30.144s]
erasing 'userdata'...
OKAY [  4.402s]
erasing 'cache'...
OKAY [  2.300s]
rebooting...

finished. total time: 112.537s


接著就會看到手機重開了,其畫面就是文章上頭的照片,很精簡的介面,沒有其他客製化的 app ,附帶一提,也沒有 Android Market 喔。往後安裝程式可以透過 adb install your_app.apk 的方式。過陣子在抽空去了解 Market 的事宜,網路上的文章只提了一下下(Android Market and AOSP)。


還原到原廠系統:


在網路上打滾一會兒,因為不曉得該怎樣下關鍵字,最後幸運找到囉!關鍵字就是 OEM、Original Shipping Image 等。另外,我也查到 Nexus One 因為 bootloader unlocking 後,似乎就沒保固了?因為 unlock 是不可逆的動作,盡管還是可以把作業系統恢復到原廠啦。


恢復到原廠系統,需要找到原廠 image 檔案,我找了一陣子,終於在 http://forum.xda-developers.com/showthread.php?t=614057 找到囉!但還不夠完美,理論上應該找到官方才對,而不是找到其他人釋出的版本,且 Android 很 Open ,所以系統被別人塞了甚麼東西,也是存在許多資安問題的,總之,目前我只找到此解 Orz 下載檔案,可以用 md5sum 確認一下,應該是 bef86698cafc88ca03fff5758571d9d6 才對。


把該檔案解壓出來,僅需要 boot.img 、 system.img 和 recovery.img 即可,接著剛上面 Step 6 狀態一樣,把 Nexus One 切換到 Fastboot mode ,並且在 Ubuntu 上透過 fastboot devices 查看是否有連街到,有連到就行啦,以下是連續動作:


changyy@Lab:~/yydroid$ fastboot devices
HT########## fastboot
changyy@Lab:~/yydroid$ fastboot erase userdata
erasing 'userdata'...
OKAY [  4.521s]
finished. total time: 4.521s
changyy@Lab:~/yydroid$ fastboot erase cache
erasing 'cache'...
OKAY [  2.461s]
finished. total time: 2.462s
changyy@Lab:~/yydroid$ fastboot flash boot  /path/boot.img 
sending 'boot' (2044 KB)...
OKAY [  1.585s]
writing 'boot'...
OKAY [  0.880s]
finished. total time: 2.465s
changyy@Lab:~/yydroid$ fastboot flash system  /path/system.img 
sending 'system' (116663 KB)...
OKAY [ 88.869s]
writing 'system'...
OKAY [ 40.625s]
finished. total time: 129.494s
changyy@Lab:~/yydroid$ fastboot flash recovery /path/recovery.img
sending 'recovery' (2294 KB)...
OKAY [  1.761s]
writing 'recovery'...
OKAY [  0.981s]
finished. total time: 2.742s
changyy@Lab:~/yydroid$ fastboot reboot
rebooting...

finished. total time: 0.040s


依序動作清除資料(erase userdata, erase cache)、刷 boot、system 和 recovery 部分,最後是讓 Nexus One 重開機啦!


device03 device04


可以看到版本是 ERD79 且為 2.1 版,接著更新一下,就可以更新到 GRI40 和 2.3.3 囉


device05 device07


收工!有空要來研究一下 root 的部分,暫時已知會動到 /system/xbin/su 和 /system/bin/su 的部分,但採用的是修改過的 su 原始碼,相關資料:


ChainsDD (Adam Shanks) - https://github.com/ChainsDD


https://github.com/CyanogenMod/android_system_extras/tree/gingerbread/su


http://android.git.kernel.org/?p=platform/system/extras.git;a=blob;f=su/su.c#l62


呼,其實這樣搞一遍也滿好玩的 XD 但找資料跟編譯很花時間啊啊啊。


@ 2011/04/14 Building AOSP on Mac OSX 10.6.7


整體流程:



  1. 建立區分大小寫的硬碟空間

  2. 安裝 Xcode 和 MacPorts

  3. 透過 MacPorts 安裝相關環境

  4. 剩下流程如同 Ubuntu 環境

    • 下載 AOSP 程式碼

    • 取得 Nexus One 相關資料 & 編譯




如果要在 Mac OSX 編譯 AOSP ,首先要處理 case sensitive 的問題,因為 Mac OSX 預設跟 Windows 一樣檔名不分大小寫。測試 case sensitive 的方式:


$ touch /tmp/test && ls -la /tmp/TEST


若找的到那就是不分大小寫


所以,就需要建立一個可以區分大小寫的空間,這時候可以不必重新切硬碟,而可採取建立一個映像檔的方式,用掛載映像檔的方式來使用空間。建立映像檔可透過 [應用程式]-> [工具程式] ->[磁碟工具程式] -> [新增映像檔]


01


接下來的新增映像檔畫面,如果沒有像下圖很多選項可以選,僅有指定位置等一兩種選項,那請去 [家目錄]->[資源庫]->[Preferences] 將 com.apple.DiskUtility.plist 先移到桌面,在重新啟動 磁碟工具程式 應該就可以解決。在這邊大小採用官網介紹的 12 GB ,最重要的是格式要挑區分大小寫的,如此一來應該就沒啥問題囉


02


建立好的樣貌如下圖,左邊就可以看到建立好的 android.dmg ,以及預設幫你先啟動了,但由於顯示為"磁碟映像檔",可能在後續動作有點需要打中文,此時可以透過點選桌面上的 [磁碟映像檔] -> [簡介] -> [名稱與副檔名] 更改成純英文數字的,如 Android 等,此時該空間的路徑是在 /Volumes/Android ,也可以透過 df -h 指令查看,若預設沒更改名稱則是在 /Volumes/磁碟映像檔 。


03


接著要安裝 Xcode 和 MacPorts。前者可以在 http://developer.apple.com/ 網站上下載,可註冊免費的 AppleID 並下載 Xcode 回來,請下載 Xcode 3 系列,如 xcode_3.2.6_and_ios_sdk_4.3.dmg 等,因為現況 Xcode 4 僅包含 MacOSX10.6.sdk,如果使用 Xcode 4 時,編譯過程會說找不到 MacOSX10.5.sdk。使用 Xcode 3 安裝時,請記得勾選 Mac OSX SDK 4。如果不幸先安裝了 Xcode 4 的話,要嘛上網查如何安裝 Mac OSX SDK 4,不然就是把 Xcode 4 移除 (sudo /Developer/Library/uninstall-devtools --mode=all) 並重開機後,再安裝 Xcode 3 囉,至於 Xcode 檔案大小約 4.5 GB,下載會需要一陣子。


接著是安裝 MacPorts 的部份,可參考 [Mac] 安裝 MacPorts & 解決防火牆問題 @ Mac OSX 10.6.7,安裝完 MacPorts 後,則依據 AOPS 官網簡介,安裝下列東西


$ POSIXLY_CORRECT=1 sudo port install gmake libsdl git-core gnupg


若是 Mac OSX 10.4 則需在安裝 bison


$ POSIXLY_CORRECT=1 sudo port install bison


然而 AOSP 又提到 gmake 3.8.2 有問題,需手動安裝 gmake 3.8.1


$ sudo mkdir -p /opt/local/var/macports/sources/asop/dports && cd /opt/local/var/macports/sources/asop/dports
$ sudo svn co --revision 50980 http://svn.macports.org/repository/macports/trunk/dports/devel/gmake/ devel/gmake/
$ sudo vim /opt/local/etc/macports/sources.conf
file:///opt/local/var/macports/sources/asop/dports
$ sudo portindex /opt/local/var/macports/sources/asop/dports
$ sudo port install gmake @3.81


最後,可以去下載 AOSP 程式碼,並進行編譯囉,後續流程跟 Ubuntu 環境一樣。


2011年4月13日 星期三

[OSX] 安裝 MacPorts & 解決防火牆問題 @ Mac OSX 10.6.7

很早就知道 Mac 是 BSD 體系來的,有個東西叫 MacPorts,但遲遲一直忘了安裝。直到想要在 Mac 上編譯 AOSP 時,才發現官方介紹過程中有使用到 MacPorts,於是開始使用 MacPorts 啦。使用 MacPorts 必須先到 http://www.macports.org/ 下載,在此使用 MacPorts-1.9.2-10.6-SnowLeopard.dmg,請依機器狀況選擇。

這是一套 ports 的管理,有用過 FreeBSD 應該就不陌生了,簡單的來說就像 linux 的 apt 或 yum 套件管理工具,透過他可以幫你安裝程式。沒想到我現在才開始用,在這之前都一直使用 tarball 安裝法,好像有點蠢 XD

安裝完 MacPorts 後,使用前需要更新一下 ports tree (類似軟體清單):

$ sudo port -v selfupdate

如果很順利,大概會有類似的訊息:

--->  Updating the ports tree
Synchronizing local ports tree from rsync://rsync.macports.org/release/ports/
receiving file list ... done
./

sent 59 bytes  received 515550 bytes  114579.78 bytes/sec
total size is 28438585  speedup is 55.16
Creating port index in /opt/local/var/macports/sources/rsync.macports.org/release/ports

Total number of ports parsed: 0
Ports successfully parsed: 0
Ports failed: 0
Up-to-date ports skipped: 7918

--->  Updating MacPorts base sources using rsync
receiving file list ... done

sent 36 bytes  received 6858 bytes  2757.60 bytes/sec
total size is 2889184  speedup is 419.09
MacPorts base version 1.9.2 installed,
MacPorts base version 1.9.2 downloaded.

接下來要安裝軟體,就是需要用 sudo port install app ,如安裝 wget:

$ sudo port install wget

接著就會很自動地幫你安裝相依性環境、取得 wget 原始碼、編譯及安裝,就可以用 wget 指令囉。

關於 port 的使用,請 man port 來查看,常用的指令:

$ port installed (查看已安裝項目)
$ port search vim (尋找 vim 工具)
$ sudo port install app (安裝 app)
$ sudo port uninstall app (移除 app)

然而 MacPorts 預設採用 rsync 去取得 ports tree ,如果很不幸的使用環境是在防火牆後面,將導致 rsync 失敗,只好改用第二種方案,過程分為兩步驟:


  1. 使用 svn 取得 ports tree

  2. 使用 portindex 更新 ports tree

作法:

$ sudo mkdir -p /opt/local/var/macports/sources/svn.macports.org/trunk/dports
$ cd /opt/local/var/macports/sources/svn.macports.org/trunk/dports
$ sudo svn co http://svn.macports.org/repository/macports/trunk/dports/ .

$ sudo vim opt/local/etc/macports/sources.conf

#rsync://rsync.macports.org/release/ports/ [default]
file:///opt/local/var/macports/sources/svn.macports.org/trunk/dports [default]

$ cd /opt/local/var/macports/sources/svn.macports.org/trunk/dports
$ sudo portindex

如此一來就可以正常使用 MacPorts 安裝軟體。參考資料:http://guide.macports.org/#installing.macports.subversion 和 Using MacPorts behind a firewall

如果哪天突然想移除 MacPorts 的話,可以透過以下指令移除透過 MacPorts 安裝的所有套件:

$ sudo port -f uninstall installed

接著再用 port installed 查看就沒東西囉

2011年4月9日 星期六

閒得發呆

Ocean Dunes Golf Club


昨晚無意間得知一場活動,今天中午跟著大家吃吃喝喝,下午看著藍天躺在宿舍床上,細想每一場盛會結束後,心中總會有一股莫名的空虛?好像是想要從那場聚會取得到什麼,事實上什麼也得不到。其實,人生就像桌台遊戲,每個人的資源都是有限的,並且身處何處皆有其意義,想一想就不會空虛了。最近覺得,並不是所有光鮮亮麗得活動都該去參加一遍,反而要找到合適的進入點才是。像是營隊小義工,付出己力貢獻社會,這也是另一種意義,覺得只有透過與人互動,才能得到一種實在的存在感。



聽著廣播,無意間聽到這首歌 - 香格里拉


作曲:黃玠
填詞:黃玠
編曲:黃玠.黃小楨
監製:黃小楨

我以為認真去做 就能實現我的夢
以為寫首好歌 走路就能抬起頭
以為騎摩托車旅行就能變英雄
現在的我 失去了衝動

有才華的人唾棄金光閃閃的獎座
親愛的 Cobain 是否也曾愛慕虛榮
多希望有人衝破疑惑帶我向前走
現在的我 變得好懦弱

雨會下雨會停 這是不變的道理
夜空中北極星 迷路的人不恐懼
我唱歌你在聽 一切風平又浪靜
G和絃的根音 撫平脆弱的心靈

我只想牽著你 走到很遠的夢裡
小木屋紅屋頂 地址是一個祕密
你抱著小貓咪 藍眼睛不再憂鬱
香格里拉在那裡 讓我們去找尋


內嵌的 YouTuBe 剛好是我以前常聽的廣播人娃娃唱的,印象中應該是周一至周五 22 或 23 點以後的中廣音樂網吧,偶爾來那麼一點無理的 input 也挺讚的。這首歌恰好在此刻給我一種很貼切的心聲,雨會下雨會停...


看到結婚的,走著婚後的生活、有小孩的走著有小孩的世界、單身的,騎著單車帶單眼,體會著絢麗的外貌背後所付出的點滴、到小公司上班有著大起大落或平淡一生的準備、到大公司上班有著文化負擔,沒有什麼事絕對的對或錯,還需多了解自己真正要的是什麼。


閒得發呆,優閒的周末。


2011年4月8日 星期五

[OSX] 重灌 Mac mini & 免費軟體偏好設定 @ Mac OSX 10.6.7

changyy's mac mini

這大概是第五或六次重灌 Mac mini 吧,手邊剛好有兩台機器啦,但上次新購了一台 22" LCD  以及幫某台增加記憶體後,使用率就突然變少許多,這次就從重灌振奮一下吧!跟 mac 還真的不熟,裝軟體有的還是自己下載 tarball 來安裝,趁這次就把流程記一下,順便筆記常用的軟體吧。

重灌流程:


  1. 擺光碟點選重灌後就會重新啟動電腦

  2. 先選擇硬碟工具,裡頭有格式化的功能,把硬碟清一下,目前我是把 320GB 規劃成 60 GB 系統碟,其他資料碟,每次只需清 60GB 系統碟就好

  3. 接著才是返回到安裝 Mac OS X 的步驟,就擺著給他跑 30 分鐘以上

  4. 安裝完就重開機,接著設定一些環境步驟,如網路連線等,其中會問 Apple ID ,照樣略過就好,直到最後的系統帳號才輸入自己想要的帳密資訊

  5. 設定完網路就可以更新系統,剛剛看竟然要 1.17 GB,還真不小,宿舍網路(5Mb/s)花了 40 分鐘以上

    • 我是使用一台 Win 7 多加一張網卡 + 跳線,提供 DHCP 服務給 Mac mini 上網用的,別忘了可以多加 DNS 168.95.1.1

個人設定


  1. 找一張有精神的照片當作桌布

  2. 開始把 Dock 上頭用不到的程式給他 "從 Dock 中移除",並把 Dock 移到右邊且稍微縮小圖示

  3. 將 "終端機" 、 "文字編輯"  擺上 Dock 位置

    • 文字編輯,[偏好設定] 改成純文字並更改字型大小為 14

    • 終端機,[偏好設定] 更改字型 14且版面改成黑色系列

  4. 設定開機登入需密碼

    • 系統偏好設定

      • 帳號->登入選項->關閉自動登入

      • 安全性->勾選進入睡眠或開啟螢幕保護程式後

    • 鑰匙圈存取

      • 偏好設定->在選單列中顯示狀態

  5. 連接 Win 7 網路硬碟

    • Finder->前往->連接伺服器,輸入 smb://win_7_ip

軟體清單&偏好設定:


  • Yahoo! 奇摩輸入法


  • Firefox

  • Google Chrome

    • http://www.google.com/chrome

    • [偏好設定]

      • [進階設定]->關掉翻譯、勾選每次下載詢問

      • [個人化設定]->永不儲存密碼

      • [基本設定]->顯示首頁按鈕、首頁定在 Yahoo!

    • [工具]->永遠顯示書籤列

  • FileZilla

  • Skype

    • http://skype.pchome.com.tw/download.html

    • 加密型通訊軟體,又可打網路電話,好用!幾乎跨平台了,iOS、Android、Linux、Windows 和 Mac OSX

    • [偏好]->[警示]-> 將"聯絡人狀態轉為可接聽",調成"不播放音效"和"不顯示內建訊息","聯絡人狀態轉為無法接通",把訊息框關掉

  • Adium

    • http://adium.im/

    • 原先想裝 Pidgin (http://www.pidgin.im/)的,但還必須自行編譯,有點麻煩,就改裝這套。這套支援 MSN、GTalk 等,算是不錯的 IM 囉,但我比較在意的是 GTalk 是否提供加密傳訊

    • [偏好]->[事件]->把聯絡人登入、登出事件移除,這樣就不會有登入、登出的聲效跟彈跳視窗,接著把 "背景聊天訊息" 和 "已接收訊息" 加上音效功能,隨便選一個吧。

    • [偏好]->[訊息]->把字型調大一點,如 14

其餘軟體:


其餘(如快速鍵):


  • 切換輸入法

    • 視窗鍵(CMD) + Space

  • 快速尋找

    • Ctrl + Space

  • 開啟分頁

    • 視窗鍵(CMD) + t

  • 複製、貼上

    • 視窗鍵(CMD) + c 、視窗鍵(CMD) + v

  • 得知作業系統版本

    • 左上角 mac logo 點進去,裡頭有"關於這台 Mac",不用再傻傻用 uname -a 啦

  • 開啟檔案管理

    • 視窗鍵(CMD) + n ,需在 Finder 環境下,如點選桌面一下再執行

  • 切換工作視窗

    • 視窗鍵(CMD) + tab 或是 Ctrl + F4,如果是同工作視窗的子視窗,可以按 視窗鍵(CMD) + ~ 進行切換

  • 編輯文書

    • 想要移到剛列前或尾

      • 視窗鍵(CMD) + 方向鍵左或右

    • 複製該列

      • shift + 視窗鍵(CMD) + 方向鍵左或右

    • 翻頁

      • shift + PageUp 或 PageDown

剩下的有空再補 XDDD

2011年4月4日 星期一

[Android] Sony Ericsson XPERIA X8 - 刪除內建程式

既然已經 Root 完此手機了,接著當然要移除一堆有的沒有的內建程式啦 :D 此篇比較適合對 Unix 系統指令熟的人。


手機環境:


模組號碼:
E15i 


韌體版本:
2.1-update1 


核心版本:
2.6.29
SEMUser@SEMCHost #1


版本號碼:
2.0.1.A.0.47 


操作方式:



  • 使用 PC 透過 WIFI 和 PuTTY 、 FileZilla 與手機連線,其中 PC 和手機是透過同一台 AP 上網的。

  • 在手機上安裝 SSHDroid 程式,開啟 SSH Server 功能。

  • 使用 PuTTY 連線進入手機系統,更改檔案系統為可讀寫狀態

  • 使用 FileZilla 連線進入手機系統,備份以及移除不需要的內建程式


分解動作:


動作一:取得 Root 權限(可參考 [Android] Sony Ericsson XPERIA X8 - Root 教學、關閉拍照聲音 部分流程)


動作二:安裝 SSHDroid (從 Market 下載),並啟動 SSH Server


動作三:從 PC 透過 PuTTY 連線進入手機,帳號 root 密碼預設為 admin,更改檔案系統為可讀寫狀態


mount -oremount,rw /dev/block/mtdblock0 /system


動作四:從 PC 使用 FileZilla 連線進入手機,並切換位置至 /system/ 以及把 app 目錄下載回 PC 備份(可以再丟到 Dropbox 等免費空間儲存)


動作五:使用 FileZilla 連線進入手機,切換至 /system/app 開始刪除不必要的檔案,點選以下程式並按 del 刪除


__.apk (電影,兩個底線)
___.apk  (手機網,三個底線)
____.apk (部落城市,四個底線)
crazypenguin.apk (Crazy Penguin 遊戲)
ezPeer+.apk (ezPeer+ 或 ezPeer,若顯示 ezPeer 必須先去刪除 ezPeer 再刪 ezPeer+ )
match__.apk (match音樂)
match____.apk (match軟體總管)
match_fortune.apk (match我的運勢)
match_Market.apk (match Market)
match_news.apk (match 新聞)
match_stocks.apk (match股市)
MY__.apk (My專區)
POI_searching.apk (在地快搜)
Slimquote.apk (股市達人)
towerbloxx.apk (Tower Bloxx 遊戲)
TV___.apk (TV 隨身看) 


若刪掉 12 個內建程式時,則省了一頁空間。其他還有 Plurk.apk 等程式,若是不用的話也是可以刪除。另外,刪除 ezPeer+.apk 後,程式還是在上頭,那是因為已經更新成 ezPeer 的關係,先到 [設定]->[應用程式]->[管理應用程式] 裡,把 ezPeer 刪除後,再從 /system/app 刪掉 ezPeer+.apk ,如此一來即可清乾淨,若不小心先刪了 ezPeer+ 但 ezPeer 還沒刪,那只好先把剛剛備份的 ezPeer+.apk 擺回來,再重新順一次即可。最後,以系統穩地為考量,不刪除過多東西。


動作六:雖然在動作五的時候,邊刪 *.apk 時可以看到程式一個個地不見,但最後來個重新開機還是不錯的選擇,包括會將動作三恢復,讓系統變成僅讀取狀態。動作六就只是把手機重開機啦。


如此一來,手機就省了一頁的空間,雖然只有一頁 XD 此處刪除的程式大多限用於台灣大哥大的用戶,所以用不到就把他刪掉吧。


Cheer up!

紀念品


碳酸飲料,有種奇妙的口感,喝下的那一瞬間,彷彿被打氣了一下,心情也輕鬆許多。


接連發生不少事,例如日本地震等等,心情總會低沉,但看著寒假出遊的南方照片,心中就不會那麼沉悶,只是不曉得何時會麻痺呢?看著學弟、同學、朋友,衝刺著自己的生活,那種感覺是多麼美好的啊,最近總有一股被捆綁手腳的感觸,想伸手卻抓不到任何東西,唯一慶幸的是還有家人的相伴。


這只是心境上的瓶頸,工作或其他的倒都還很順心啦,希望能更快走出現在的情境。另外,真的要專心把一件件事依序做好,不然過於貪心的結果就是一事無成。


2011年4月3日 星期日

[Android] Sony Ericsson XPERIA X8 - Root 教學、關閉拍照聲音

沒想到周遭又有一位使用 Android 手機啦,這次是 Sony Ericsson XPERIA X8 手機(手機王資訊),這款是 2010 年十月份出的,預設是 Android 1.6 系統,接著去年底官方提供 Android 2.1 的系統更新,因此,這台手機買來時已經是 2.1 系統了,我不確定是不是賣手機的人有幫忙更新,總之目前手機狀態:


模組號碼:
E15i 


韌體版本:
2.1-update1 


核心版本:
2.6.29
SEMUser@SEMCHost #1


版本號碼:
2.0.1.A.0.47 


接下來說說要搞定的事:



  • 關掉拍照時響亮的"咖擦聲響"

    • 拍照聲音檔擺在 /system/media/audio/ui/camera_click.ogg ,解法就是把他移除或更名,如 camera_click.ogg.bak ,如此一來拍照時,程式無法取得聲音檔來播放。




使用 PC 環境:


Windows 7 32-bit 環境


C:\Windows\Microsoft.NET\Framework 裡有 v2.0.50727 目錄 (之後的活動需要 .NET Framework 2.0 環境)


有 WIFI 環境


例如此台 PC 的 IP 是 192.168.100.1 而手機的 IP 是 192.168.100.2 ,因此有機會可以從 PC 連線到 手機喔。


PuTTY 軟體


等會 PC 將透過 putty.exe 這個軟體跟手機連線


警告,在此不承擔任何風險責任,使用前請自行評估


為了達成上述兩件事,第一件事便是 root 親愛的 Android 手機,所謂的 root 代表取得此手機作業系統裡最高的權限,原先系統可能基於安全性、商業性等因素,故預設不開放使用者使用最高權限。然而,整個系統預設是 read-only 的,必須使用最高權限改成可讀寫的,如此一來才能移除內建程式和處理拍照聲響。


接下來則是分解動作:


動作一:將手機 root 啦


xdadevelopers > Sony Ericsson XPERIA X8XPERIA X8 > Android Development > [TUTORIAL] Rooting 2.1 Directly 得知 root 的方式:


Step 1:下載該網頁所提供的 SuperOneClick.zip ,只是需要註冊成為會員,免費的,就去申請一下吧。


Step 2:下載與安裝 Sony Ericsson PC Companion 2.0 軟體,此軟體將在你的電腦安裝手機 USB 相關的驅動程式。


Step 3:設定手機,開啟開發 USB 偵錯功能


[設定] ->[應用程式] -> [開發] -> [USB偵錯]


Step 4:使用 mirco usb 連接手機與 PC,並且選擇 "為手機充電" 模式


Step 5:將下載好 SuperOneClick 解壓縮,並執行 SuperOneClick.exe 檔案


這是點選 SuperOneClick.exe 程式跑起來的畫面,接著按下 Root 進行


01


跑到最後會詢問你是否要 test 了,當然是選 YES 啦


02


之後完成則顯示此訊息


04


之後順便會問你要不要贊助程式開發者,嗯,口袋不夠大,我選了否 XD


05


Step 6:查看手機畫面


在最後一頁可以看到 "授權程式" 的程式


root1


點入 "授權程式" 後,在 "設定" 裡頭最底下可以看到 Superuser 2.3.6.1 和 su 2.3.1-ef 資訊


root2


動作二:進入 Android 系統環境,採用 SSH 進入方式


在網路上看到很多人使用 Root Explorer 來瀏覽系統資料或做相關動作,但在 Android Market 上看到這款要錢耶,雖然網路上很多盜版資訊,但我 root 的目的不是使用盜版,為了尊重且支持這些 Mobile 開發者,我採用了第二條路,剛好也是我本身比較熟悉的,使用 SSH 登入方式 XD


只是 Android 環境上我不太懂該怎樣啟動 SSH 服務,隨意在 Market 上就找到 SSHDroid 程式,該程式就是 SSH Server 啦,結果上網查一下原來這也是 xdsdeveloper 裡的會員開發的:xdadevelopers > Android Development and Hacking > Android Apps and Games > [APP] SSHDroid。讓我稍稍微安心(Android太Open會有太多安全性問題)


從 Market 安裝完,開啟此軟體就會設定好 SSH Server 並且告訴你連到手機的方式


root3


切回 PC 端,使用 putty.exe 打上 192.168.2.102 (根據上圖顯示的位置) 並且輸入 root 並使用預設密碼 admin 登入


root4


如此一來算是正式進入此手機系統囉!


動作三:更改 /system 的狀態,從 Read-Only 改成 Read-Write Mode


登入系統後,緊接著想要把拍照聲音移掉,預計透過下述指令:


mv /system/media/audio/ui/camera_click.ogg /system/media/audio/ui/camera_click.ogg.bak


隨即運行完會看到失敗訊息:


# mv /system/media/audio/ui/camera_click.ogg /system/media/audio/ui/camera_click.ogg.bak
failed on '/system/media/audio/ui/camera_click.ogg' - Read-only file system


使用 mount 查看:


# mount
...
/dev/block/mtdblock0 /system yaffs2 ro 0 0
...


其中上述的 "ro" 就是代表 Read-only 的檔案系統


既然都有最高使用者權限了,當然可以調教一下,使用 mount 把它改成 Read-Write Mode:


mount -oremount,rw /dev/block/mtdblock0 /system


結果:


# mount -oremount,rw /dev/block/mtdblock0 /system
# mount
...
/dev/block/mtdblock0 /system yaffs2 rw 0 0
... 


不錯喔,變成 "rw" 了,代表可以接述作其他邪惡的動作了


動作四:關閉拍照聲音,移掉拍照時,預設所播放聲音檔


由於動作三已接將檔案系統狀態調成可以更動的狀態,接下來只要下一個指令就搞定了


mv /system/media/audio/ui/camera_click.ogg /system/media/audio/ui/camera_click.ogg.bak


接著就用手機拍照看看吧,聽不到聲音了吧!在此只能祈禱拍照程式寫得很完善,例如程式撰寫者有用 try & catch 來處理播放聲音,以至於其他動作不會出錯 :p 目前測試下是可以正常拍下照片,有空再來查看例如 GPS 做標記錄等功能,若都沒啥問題應該就搞定了吧!若真的會出現問題,那就再想辦法擺一個音樂檔給他播放 cc 例如沒聲音的聲音檔 XD 如此一來,拍照流程可以順利進行


@ 2011/04/05:如果要製作沒聲音的音效檔,在 Windows 作業系統上可以使用 [附屬應用程式] -> [錄音機] ,按一下錄音馬上再按一下關掉,如此一來會產生一個 WMA 檔案,接著再透過其他軟體將從 wma 轉成 ogg,就把它擺到 /system/media/audio/ui/camera_click.ogg 即可。


總結一下,透過上述流程及完成 root 和關閉拍照聲音。之後可以再來看看怎樣移除內建軟體 XD 目前使用 Sony Ericsson X8 的心得嘛,這台還滿小台的,約 10cm x 5cm x 1.5 cm (厚度),我還滿喜歡這樣的體積,雖然螢幕不大,但攜帶方便,並且還是 480 x 320 的解析度喔。唯一的缺點大概是不支援 multi-touch 啦,不知道是硬體問題還是軟體沒支援,但整體上應該不會影響太多。