2011年12月29日 星期四

如何編譯Android Ice Cream Sandwich

此篇文章主要記錄在Macbook Pro(mbp), OSX Lion上編譯ICS的Android source code的步驟, 不過應該Linux系統上也相同, 而且簡單許多, OSX上需要多做一些修改.

基本步驟
  1. 按照官網下載source code並設定環境
  2. 設定ccache, 原因是能夠加速c/c++的compiler速度(官網)
    $ export USE_CCACHE=1
    $ export CCACHE_DIR=/<path_of_your_choice>/.ccache
    $ prebuilt/linux-x86/ccache/ccache -M 20G
  3. 下載廠商提供的binary檔案, 我的手機是Nexus S, 所以Google提供
  4. 準備編譯
    1. 先將環境清乾淨
      make clobber
      
    2. 設定環境變數
      source build/envsetup.sh
    3. 設定編譯選項
      lunch
  5. 編譯
    make -j 4
    

2011年11月2日 星期三

2011年10月28日 星期五

Change KKBOX download path in OSX

自從我把電腦的硬碟換成SSD後, 就很在意APP資料的儲存位置, 分享一下如何把KKBOX的下載位置換到其他地方.

cd ~/Library/Application Support/KKBOX/
mv Downloaded\ Music /Volumes/Data/music/kkbox/Downloaded\ Music
ln -s /Volumes/Data/music/kkbox/Downloaded\ Music .

就大功告成啦, 其實只要知道下載的位子在那邊就好辦了
ps:/Volumes/Data/music/kkbox/Downloaded\ Music 是我的hdd位子, 有參考的朋友們自行換成想要放的位子喔

2011年8月2日 星期二

Android dpi / px / dp / 研究

最近工作上剛好遇到Android dpi 相關的問題, 紀錄一下研究筆記.
  • 基本觀念:
    • Resolution(px): 就是我們熟知的解析度, 如1024x600.
    • Size(dp/dip): 在Android上實際看到的大小, 若定義100dp, 實際在各種尺寸, dpi定義正確的裝置上, 看起來的實際大小應該要差不多.
    • Density(dpi): Dot Per Inch, 每一英寸有幾個點.
    • px = dp * (dpi / 160) Android官方公式
  • 問題: DPI設定錯誤會發生什麼事情
    • 在開發Android Platform時必須要決定dpi的數值, 錯誤的dpi會讓程式UI比例呈現異常, 如Galaxy Tab 7". (該device設定dpi為240, 表示螢幕每一英寸應該要能夠顯示240個點, 但根據DPI Calculator, 7" 1024x600每一英寸只能顯示169個點, 所以當ui resource是用dp定義width/ length的話, 經過公式換算後, 實際看到都會被放大約1.5倍)
  • 研究 : 今天如果我們有個裝置是7" 1280x800解析度, 那我們的dpi到底該定義多少?
    • 若根據DPI Calculator, 該裝置每一英寸能看到215個點, 反推螢幕上能顯示的大小
      • 寬1280 = dp * (215/160), dp約為 952dp
      • 高  800 = dp * (215/160), dp約為 595dp
    • Android Developer - Configuration Example, 直接定義了各尺寸螢幕該容納的dp大小
      • 320dp: a typical phone screen (240x320 ldpi, 320x480 mdpi, 480x800 hdpi, etc).
      • 480dp: a tweener tablet like the Streak (480x800 mdpi).
      • 600dp: a 7” tablet (600x1024 mdpi).
      • 720dp: a 10” tablet (720x1280 mdpi, 800x1280 mdpi, etc).
    • 若為7"裝置, 所以就用600 dp來反推dpi
      • 高 800 = 600 * (dpi/160), dpi約為 213dp
    • 之所以是用寬度width反推, 而不是高度height反推是因為, 在操作畫面的時候, 垂直空間不足時, 上下滑動是很直覺的操作, 但左右移動卻比較罕見, 寬度width定義大小必須要比較注意.
      • 所以Android Developer新增了Declaring Tablet Layouts for Android 3.2, 優先考慮smallest width dp(layout-swXXXdp)
    • 因此得知7" 1280x800的顯示空間為961dp * 600dp, 須設定為213dpi
  • 個人結論
    • UI到底要用怎麼設計? 
      • 目標裝置解析度是1280x800就畫1280x800 px的圖. 
      • 在定義layout resource時, 要用dip/dp指定長寬, 而非px. (利用px = dp * (213/160)可推出dp)
      • 使用Relative Layout, 而非Absolute Layout
    • 想要支援dp較小的裝置要怎麼辦?
      • 定義不同的layout吧, 如layout-normal.
Ref:
1. http://developer.android.com/guide/practices/screens_support.html
2. http://developer.android.com/guide/topics/resources/providing-resources.html
3. http://android-developers.blogspot.com/2011/07/new-tools-for-managing-screen-sizes.html
4. DPI Caclulator

Synergy 多電腦分享輸入裝置好工具

Synergy讓你能夠用延伸桌面的方式來操作兩台不同的電腦
當有兩台螢幕分別接到不同電腦時, 你的滑鼠可以自由來去之間爽度是非常高的!!(不過當然要在同一區域網路XD)

官網: http://synergy-foss.org/
支援很多平台, 我是使用Ubuntu + OSX

Ubuntu 可以用 aptitude 安裝
sudo aptitude install synergy
OSX可以用 brew
brew install synergy
裝好之後在鍵盤滑鼠所接到的那台電腦上(簡稱控制端)還需要加入config檔案, 看官網好像很複雜, 其實沒有要設定什麼特殊功能的話, 只要指定好hostname跟相對方位而已
附上我的設定檔跟簡單說明
section: screens
    #指定你的電腦名稱
    jason-mbp.local:   #這台是我的mac
    jason-pc:               #Ubuntu
end 
section: links
    #指定你的螢幕相對位置, 我的ubuntu在左邊, mac在右邊
    jason-mbp.local:
        left = jason-pc
    jason-pc:
        right = jason-mbp.local
end

電腦名稱在OSX/Ubuntu的 ternimal下輸入hostname就可以知道, windows好像就是系統名稱
設定檔弄好之後在控制端電腦輸入
synergys -c /usr/local/Cellar/synergy/1.3.6/bin/synergy.conf -a 192.168.1.122
設定檔位置跟本機ip記得換成自己的

遙控端輸入
synergyc 192.168.1.122
就可以享受偽雙螢幕啦lol

Special Thanks: Yuren ju
我本來用很蠢的遠端桌面超痛苦, 這樣好用多了

2011年7月29日 星期五

Ubuntu Music Process

最近在嘗試Google提供的雲端Music服務, 順便整理手邊的音樂
這邊紀錄的都是在Ubuntu環境下的操作

1. 首先會遇到的問題是ID3 TAG亂碼
EasyTag解決
2. 我手邊的音樂有很多格式都是ape, 不在google music支援的列表內.
    我是打算都先轉成flac, 不過OSX好像不支援, 之後再想辦法吧, 先看看雲端的品質!
解決步驟
1. 先用SoundConvert將ape轉成flac
2. 我的ape都是搭配cue, 所以需要再利用 
sudo apt-get install cuetools shntoolsudo apt-get install flac wavpackcuebreakpoints sample.cue | shnsplit -o flac sample.flaccuetag sample.cue split-track*.flac 
就可以根據cue資訊將歌曲分開
3. ID3 TAG除了亂碼問題, 還有一些資訊之前偷懶沒整理的, 也都可以用Easy TAG解決, 很強大的軟體, 網路上很多資料, 值得注意的一點是, 我一開始找不到套用到所有已選取歌曲, 原來是在欄位的右邊有個圈圈可以點, 找好久XD


心得:
1. 還不太成熟, 上傳的音樂, 看起來不能直接從電腦Download回來, 要透過手機才可以
2. 沒有sync功能, 上傳過後修改ID3 TAG, 再按下upload並不會更新, 看起來只會檢查檔案是否已上傳.
3. 軟體不太穩定, 有時候會處於無法上傳的情形, 失敗原因也很讓人摸不著頭緒


Ref
1. http://antbsd.twbbs.org/~ant/wordpress/?p=3537
2. http://aidanjm.wordpress.com/2007/02/15/split-lossless-audio-ape-flac-wv-wav-by-cue-file/

2011年7月21日 星期四

在Lion下開啟Trim

看了網路幾篇文章, 原本在snow leopard常用的trim enabler會置換掉kernel extension的檔案
而且是相依性很高的, 換成舊版extension
雖然可以成功, 但是會有海灘球出現,
感覺超可怕的XD 應該是不能沿用了


digitaldj提供了一個比較簡單的手動patch方式
http://digitaldj.net/2011/07/21/trim-enabler-for-lion/

1. 備份要patch的檔案
cp /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage.origin
2. patch 開啟Trim
sudo perl -pi -e 's|(\x52\x6F\x74\x61\x74\x69\x6F\x6E\x61\x6C\x00).{9}(\x00\x51)|$1\x00\x00\x00\x00\x00\x00\x00\x00\x00$2|sg' /System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext/Contents/MacOS/IOAHCIBlockStorage
3. 清除kernel的extension cache
sudo kextcache -system-prelinked-kernel
sudo kextcache -system-caches
4. 重開機, 完成

簡單吧, 該網站還有還原方式, 先試用看看, 有問題再來研究

2011年7月12日 星期二

Install BCompare in Ubuntu 10.10 64bit

如果什麼都不管直接安裝後, 執行時會產生Missing Share Library的訊息
linux-gate.so.1 => (0xf76f0000)libz.so.1 => /usr/lib32/libz.so.1 (0xf76bd000)libqtc.so.1 => /usr/local/lib/beyondcompare/libqtc.so.1 (0xf71b9000)libX11.so.6 => /usr/lib32/libX11.so.6 (0xf7089000)librt.so.1 => /lib32/librt.so.1 (0xf7080000)libpthread.so.0 => /lib32/libpthread.so.0 (0xf7067000)libdl.so.2 => /lib32/libdl.so.2 (0xf7063000)libc.so.6 => /lib32/libc.so.6 (0xf6f1e000)libqt-mt.so.3 => not foundlibXext.so.6 => /usr/lib32/libXext.so.6 (0xf6f0d000)libstdc++.so.6 => /usr/lib32/libstdc++.so.6 (0xf6e1b000)libm.so.6 => /lib32/libm.so.6 (0xf6df5000)libgcc_s.so.1 => /usr/lib32/libgcc_s.so.1 (0xf6dd7000)libxcb.so.1 => /usr/lib32/libxcb.so.1 (0xf6db8000)/lib/ld-linux.so.2 (0xf76f1000)libXau.so.6 => /usr/lib32/libXau.so.6 (0xf6db4000)libXdmcp.so.6 => /usr/lib32/libXdmcp.so.6 (0xf6daf000)
稍微找了一下資料後發現, 其實是缺少了32bit版的qt3 library
lib32qt3-mt
抓下來安裝就可以了, 不過官方的repository沒有提供, 備份在網路上找到的安裝步驟及載點

# Install BC3 from tar archive.
<blah blah blah>
# Download i3886 package of libqt3-mt and extract
sudo wget http://de.archive.ubuntu.com/ubuntu/pool/main/q/qt-x11-free/libqt3-mt_3.3.8-b-5ubuntu3_i386.deb
dpkg -x libqt3-mt_3.3.8-b-5ubuntu3_i386.deb libqt
# Copy configuration
sudo cp -a libqt/etc/qt3 /etc/ # This may trash your qt3 config if already there
# Install to /usr/lib32
sudo cp -a -t /usr/lib32 libqt/usr/lib/*

關鍵檔案備份:
http://dl.dropbox.com/u/16093811/software/bcompare/libqt3-mt_3.3.8-b-5ubuntu3_i386.deb


Reference:
http://www.scootersoftware.com/vbulletin/showthread.php?t=153&page=3

2011年7月8日 星期五

Android Media Player Error

Android mediaplayer發生錯誤時會顯示

E/MediaPlayer( 1598): error (1, -19)
E/MediaPlayer( 1598): Error (1,-19)

並呼叫
onErrorListener.onError(MediaPlayer mp, int what, int extra)
就是對應 what = 1, extra = 19

what的定義可以在下面位置找到
frameworks/base/include/media/mediaplayer.h
要注意的一點是, Android從2.x開始已把Media Framework從Opencore換成StageFright, Error Code不是參考OpenCore的, 應該要參考標準的errno.h, 所以這邊發生的是

#define ENODEV      19  /* No such device */

ErrorCode參照
what:

enum media_player_states {
    MEDIA_PLAYER_STATE_ERROR        = 0,
    MEDIA_PLAYER_IDLE                           = 1 << 0,     // 1
    MEDIA_PLAYER_INITIALIZED             = 1 << 1,    // 2
    MEDIA_PLAYER_PREPARING              = 1 << 2,    // 4
    MEDIA_PLAYER_PREPARED                = 1 << 3,    // 8
    MEDIA_PLAYER_STARTED                   = 1 << 4,   // 16
    MEDIA_PLAYER_PAUSED                     = 1 << 5,   // 32
    MEDIA_PLAYER_STOPPED                    = 1 << 6,  // 64
    MEDIA_PLAYER_PLAYBACK_COMPLETE  = 1 << 7
};



extra: (ref: kernel/include/asm-generic/errno-base.h)


#define EPERM        1  /* Operation not permitted */
#define ENOENT       2  /* No such file or directory */
#define ESRCH        3  /* No such process */
#define EINTR        4  /* Interrupted system call */
#define EIO      5  /* I/O error */
#define ENXIO        6  /* No such device or address */
#define E2BIG        7  /* Argument list too long */
#define ENOEXEC      8  /* Exec format error */
#define EBADF        9  /* Bad file number */
#define ECHILD      10  /* No child processes */
#define EAGAIN      11  /* Try again */
#define ENOMEM      12  /* Out of memory */
#define EACCES      13  /* Permission denied */
#define EFAULT      14  /* Bad address */
#define ENOTBLK     15  /* Block device required */
#define EBUSY       16  /* Device or resource busy */
#define EEXIST      17  /* File exists */
#define EXDEV       18  /* Cross-device link */
#define ENODEV      19  /* No such device */
#define ENOTDIR     20  /* Not a directory */
#define EISDIR      21  /* Is a directory */
#define EINVAL      22  /* Invalid argument */
#define ENFILE      23  /* File table overflow */
#define EMFILE      24  /* Too many open files */
#define ENOTTY      25  /* Not a typewriter */
#define ETXTBSY     26  /* Text file busy */
#define EFBIG       27  /* File too large */
#define ENOSPC      28  /* No space left on device */
#define ESPIPE      29  /* Illegal seek */
#define EROFS       30  /* Read-only file system */
#define EMLINK      31  /* Too many links */
#define EPIPE       32  /* Broken pipe */
#define EDOM        33  /* Math argument out of domain of func */
#define ERANGE      34  /* Math result not representable */



參考連結
  1. http://stackoverflow.com/questions/3857578/android-mediaplayer-error-codes
  2. http://univasity.iteye.com/blog/898613