2011年5月1日 星期日

大陸劇 胡雪巖

49


同事常跟我提起,他覺得能夠和伴侶逛逛賣場,是件很幸福的事,我也這麼覺得,每次到台北閒逛時,也會到賣場走走,總是會留念一下那便宜的影劇區。記得年初到訪時,還瞧見三姑六婆在那邊分享著,瞧著陌生的彼此用戲劇拉近距離,也怪好玩的。


胡雪巖


上一次我也差點敗了個三國演義呢,只不過這次瞧見 49 元一齣戲,一個便當錢就買了一部,哈。買了胡雪巖,剛剛用 Google 查了一下,某線上購物可要價個 99 呢。有時是種緣分,一回我在老鄉的流行唱片店也曾瞧見 199 的戲,一次買兩片可還能折個價呢!只是隨著年紀啊,花錢不是甚麼問題,倒是看戲的時間拿不出個丁點啊。


說說這齣戲,第一次看在碩班,有一位同學很愛從商之道,一開始還常約我去他家看影集,其中有一次就是這齣戲,可惜的我只瞧了一集,隨著當年的熱血 coding ,就不曾再看了。這次一連看了七集,發現感觸又不一樣了,還順手找了一下 wiki 呢,若還想看戲的就別看 wiki 吧 XD 因為我看了 wiki 就大概知道個劇情發展呢。


只是瞧著這古裝戲,總讓我想起古人的風華,好似妻妾成群抑或自如於商戰場等,總要找點事來磨揮磨揮,這可跟當今潮流,小三劇情,可有天差地別的走向 :P


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


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