ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2013年2月25日 星期一

delay suspend...wakelock

從這個 link : http://www.vogella.com/blog/2011/02/07/android-wakelock/

在 WakeLock.acquire( ) 時,可以傳入參數,告知 N ms 後自動 release。

利用這個,應該可以作到類似 A acquire, B release 的動作:
  • A acquire(5000) -- 5sec 自動 release
  • B 被 launch, acquire() -- 因為一定會在 5sec 內被 launch 起來,所以一定可以 acqure( )
  • B 做完所有動作:turn OFF a.b.c... release()
  • 以上動作在 5sec 以內:5sec 後 A 自動 release,關機
  • 以上動作在 5sec 以後,A 早已經 release,所以關機



code: framework/base/core/java/android/os/PowerManager.java: public void acquire() { synchronized (mToken) { if (!mRefCounted || mCount++ == 0) { try { mService.acquireWakeLock(mFlags, mToken, mTag, mWorkSource); } catch (RemoteException e) { } mHeld = true; } } } public void acquire(long timeout) { acquire(); mHandler.postDelayed(mReleaser, timeout); }

實際測試發現,這樣的作法,即使在 wakelock release 之前 startactivity ,好像也沒辦法確認 activity 會在 sleep 之前 開啟。

2013年2月23日 星期六

AsyncTask -- progressbar..

為了 progress bard 特別設計的 : AysncTask:
http://developer.android.com/reference/android/os/AsyncTask.html

progress bard 程式大概就是:
有一件事要再在背景持續的作,並且定時的 UI update 信息。
例如:download, 資料處理.. etc

需要持續動作的事一定不能在 UI thread 作,這樣會造成 ANR。
所以要獨立開一個 Thread 來作,
但是這個 Thread 又要 update UI,
而 none UI thread 是不能直接update UI object。

所以這個架構變得很複雜, 繼承後,要 implement 有一堆:
background job, 和對應 background 開始,結束 的 function。
還有 update UI 的 function。

然後規定了 background thread 通知 update ui function 的 function call,
background thread 要 call 這個 function ,通知 UI update function 來 update,
不可以直接 update。

2013年2月18日 星期一

libfuse on android

Android 上 用 Fuse 的幾個 project:
第一點有說明 libfuse 難 port 的原因,因為 bionic 的關係。

1的現成的,舊的 : http://code.google.com/p/fuse-android/downloads/detail?name=fuse-2.8.5-android.tar&can=2&q=

要重新 build kernel,enable FUSE support

xda 上有另一個 port,包含 exfat, prebuild: http://forum.xda-developers.com/showthread.php?t=1371621&page=3

前幾篇有說 build 的方法:http://forum.xda-developers.com/showthread.php?t=1371621
這是用 static link,所以完全不管 bionic,也不用 so.



實際使用就是把 prebuild. static link 的檔案 download 回來,解開,push 到 /system/bin 下。

PC 的 XP 要安裝 MS 的 KB955704 號更新
然後格式化就會出現 exfat 的選項。

要注意,因為 android 的 vold 在偵測 device mount 後,會用 fsck fix 一些error 標投。
所以直接插入 exfat 格式的 sdcard,標投會被改掉,這樣 mount.exfat-fuse 就不認識這個 partition,
mount 時會出現 "Find no exfat system info" 的msg。
所以要記得把 vold.fstab 的相關行 comment 掉。

插入由 PC 作exfat 格式化的 sdcard。
#mkdir /data/exfat #mount.exfat-fuse /dev/block/mmcblk1p1 /data/exfat 這樣就 mount 成功了。



vold 問題,找到 CM 的 vold 有 support fat/ext/ntfs ,只是將 fat/ext 寫一起,然後,else 就是 ntfs。

-- 找不到真正 mount 的 function, 都說是 extern ...

這一篇古老的google group 討論有一些方法。
大概就是把 mount 改成執行外部 mount 命令。


由logcat 來看,破壞 partition info 的地方: I//system/bin/fsck_msdos( 2360): Invalid signature in fsinfo block I//system/bin/fsck_msdos( 2360): FIXED I//system/bin/fsck_msdos( 2360): Invalid cluster size: 0 I/logwrapper( 2360): /system/bin/fsck_msdos terminated by exit(8) I/PackageManager( 2431): Updating external media status from unmounted to unmounted E/Vold ( 2360): Filesystem check failed (unknown exit code 8) 大概是 fsck_msdos 作的..

比較插入 ext4 的 sd: /Vold ( 2360): /dev/block/vold/179:9 is checking for volume extsd D/Vold ( 2360): Volume extsd state changing 1 (Idle-Unmounted) -> 3 (Checking) I/StorageNotification( 2529): Media {/mnt/sdcard/extsd} state changed from {bad_removal} -> {checking} I//system/bin/fsck_msdos( 2360): ** /dev/block/vold/179:9 I//system/bin/fsck_msdos( 2360): Invalid signature in boot block: 0000 I/logwrapper( 2360): /system/bin/fsck_msdos terminated by exit(2) I/PackageManager( 2431): Updating external media status from unmounted to unmounted E/Vold ( 2360): Filesystem check failed (not a FAT filesystem) W/Vold ( 2360): /dev/block/vold/179:9 does not contain a FAT filesystem E/Vold ( 2360): Volume extsd found no suitable devices for mounting :( ext4 的 sd 插入後,不會被破壞 (拿回 pc 還可以正確 mount)。
所以猜測應該是 exfat 有跟 fat 類似的 partition id info,導致 msdos_fsck 誤判。

-- 所以作法應該是先用 exfat mount fail 再用 fat mount ?
實際使用 Cyanogen 7 的 Fat.cpp/h
ext2 formatted SD, 插入後,e2fsck 說有 error,要手動run 一次 e2fsck。
所以照作,在系統上手動 #e2fsck /dev/block/mmcbpk1p1 果然有寫 error fixed。
再插入後,就 自動 mount OK 了。

另外,用 XP format 成 exfat 的 SD,在系統上用 exfatfsck 檢查,是 OK 的。
所以應該可以用。
--- 是否要看 FAT/FAT32 用 exfatfsck 會不會也 OK ?


結果 OK。
修改 Fat.cpp , Fat.h
在 ::check 和 ::doMount 加入 filesystem 的 id 。
還要注意,FAT 的 fsck 會修改 exfat 的 partition head,所以要放在最後。
這樣,就可以 support ext4, exfat, fat 三種 filesystem 了..




ntfs 的話,一樣,在 xda 的神人 作了 static link ntfs-3g fuse 的 prebuild binary
只要依樣話葫蘆就可以。

但是 ntfs 沒有 fsck,所以只好寫成這樣:
check 時,所有的 filesystem 都是 mismatch 時,assume ntfs。
然後一樣在 domount 用 logwrap( ) 來執行 ntfs-3g 作 mount。

標籤

網誌存檔