ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2013年1月31日 星期四

build CM

這一篇 Build from hero 官方的 CM build instrunction (好像是自動產生的)。


repo sync 完成後,要設定 product 相關的設定。
rom-manager 好像是內鍵的,所以要先download apk.. vendor/cyanogen/get-rommanager.sh
然後一樣: . build/envsetup.sh lunch cm_hero-userdebug 這樣, script 會去 cyanogen 的 github download 該 target product 需要的 device/vendor/ 下的檔案。
完成 lunch 的動作。

接下來作 lunch 時,發生錯誤。
ref: http://csidiropoulos.wordpress.com/2012/11/06/devicehtcaceace-mk-does-not-exist-stop-cyanogenmod/
修改 vendor/cyanogen/products/AndroidProducts.mk
只留下 hero 這個 mk 就可以。
其他行都刪掉。

-- 還有,是 lunch full_hero-userdebug
奇怪,要是用 lunch cyanogen_hero-userdebug 的話,就沒有 error 了呀。也不用改 AndroidProducts.mk


最後的 make hero 也不行,沒有 hero 這個 target。
要用 make otapackage
.. 當然,還是 fail...


改 checkout release version - gb-release-7.2

到 .repo/manifest 下,用 git diff origin/gb-release-7.2 看一下。
果然, 一堆 devices/htc/ 下的裝置目錄,在 gb-release-7.2 都有被加入。
所以 作 lunch 時,不會有 htc_ace.mk 找不到的問題。

看了一下 manifest 的 git log ,發現這個:
commit d33c1afc194cfc402f4e5edc37dbef1bafea35df
Author: Ricardo Cerqueira 
Date:   Sat Oct 6 04:01:53 2012 +0100

    manifest: Remove repositories serviceable by roomservice
    
    Let's be nice to github (and avoid getting locked out again).
    CM7 has supported roomservice for months, there's no reason for its
    configuration to be different from CM9 and above.
    There's no need to pull these 88 repositories when bootstrapping
    CM7. It's over 6GB worth of data that's useless when you want to
    build a single device.
    
    Change-Id: I75cad7a78d41c2abe8db6f3443fa0efae8a50b32


應該就是這個,2012, 10 月,開始加入 roomservice,所以不必把所有的 device configuration file 都拉下來。
而且順便知道,CM9 沒有這個問題 -- 因為 CM9 早就 support roomservice

所以直接 init -b gb-release-7.2 ,然後 . build/envsetup 之後,lunch 就會出現一堆product可以選

.. 結果,使用 branch gb-release-7.2 也一樣,lunch full_hero-userdebug 有 error: build/core/product_config.mk:196: *** _nic.PRODUCTS.[[vendor/cyanogen/products/cyanogen_mecha.mk]]: "device/htc/mecha/device_mecha.mk" does not exist. Stop. Device hero not found. Attempting to retrieve device repository from CyanogenMod Github (http://github.com/CyanogenMod). Found repository: android_device_htc_hero Syncing repository to retrieve project. Traceback (most recent call last): File "/home/charles-chang/gb-release-7.2/.repo/repo/main.py", line 408, in _Main(sys.argv[1:]) File "/home/charles-chang/gb-release-7.2/.repo/repo/main.py", line 388, in _Main result = repo._Run(argv) or 0 File "/home/charles-chang/gb-release-7.2/.repo/repo/main.py", line 122, in _Run copts, cargs = cmd.OptionParser.parse_args(argv) File "/home/charles-chang/gb-release-7.2/.repo/repo/command.py", line 45, in OptionParser self._Options(self._optparse) File "/home/charles-chang/gb-release-7.2/.repo/repo/subcmds/sync.py", line 147, in _Options self.jobs = self.manifest.default.sync_j File "/home/charles-chang/gb-release-7.2/.repo/repo/manifest_xml.py", line 256, in default self._Load() File "/home/charles-chang/gb-release-7.2/.repo/repo/manifest_xml.py", line 304, in _Load self._ParseManifest(nodes) File "/home/charles-chang/gb-release-7.2/.repo/repo/manifest_xml.py", line 389, in _ParseManifest (project.name, self.manifestFile)) error.ManifestParseError: duplicate project CyanogenMod/android_device_htc_hero in /home/charles-chang/gb-release-7.2/.repo/manifest.xml Done! build/core/product_config.mk:196: *** _nic.PRODUCTS.[[vendor/cyanogen/products/cyanogen_mecha.mk]]: "device/htc/mecha/device_mecha.mk" does not exist. Stop. 缺 cyanogen_mecha.mk,只好去把她從 AndroidProduct.mk 刪掉..

..結果還是有一堆: diff --git a/products/AndroidProducts.mk b/products/AndroidProducts.mk index 106dcbc..5425161 100644 --- a/products/AndroidProducts.mk +++ b/products/AndroidProducts.mk @@ -36,7 +36,6 @@ PRODUCT_MAKEFILES := \ $(LOCAL_DIR)/cyanogen_leo.mk \ $(LOCAL_DIR)/cyanogen_liberty.mk \ $(LOCAL_DIR)/cyanogen_mango.mk \ - $(LOCAL_DIR)/cyanogen_mecha.mk \ $(LOCAL_DIR)/cyanogen_mesmerizemtd.mk \ $(LOCAL_DIR)/cyanogen_mimmi.mk \ $(LOCAL_DIR)/cyanogen_morrison.mk \ @@ -55,9 +54,6 @@ PRODUCT_MAKEFILES := \ $(LOCAL_DIR)/cyanogen_sholes.mk \ $(LOCAL_DIR)/cyanogen_showcasemtd.mk \ $(LOCAL_DIR)/cyanogen_smb_a1002.mk \ - $(LOCAL_DIR)/cyanogen_smb_a1004.mk \ - $(LOCAL_DIR)/cyanogen_smb_a1011.mk \ - $(LOCAL_DIR)/cyanogen_smb_b9701.mk \ $(LOCAL_DIR)/cyanogen_smultron.mk \ $(LOCAL_DIR)/cyanogen_speedy.mk \ $(LOCAL_DIR)/cyanogen_supersonic.mk \

這樣改以後,lunch 選完就不會有 error 了。

2013年1月29日 星期二

bootloader , recovery images and ROM

很神奇的是 bootloader 竟然可以決定 nand /eMMC 各 partition 的 access 權限。
所以才會又 S-ON/S-OFF 的選項。

S-ON/S-OFF 的功能好像只有official 的image 在參考,
recovery image 並沒有用到,
還有,燒了非官方的 image,也不會依照 S-ON/S-OFF 的內容。
---- 作辛酸的?


至於系統的燒錄/更新,都是靠 recovery image 來作的。
這原來是用來更新/恢復 系統的工具。

原廠的 recovery 工具功能太簡單,有些還有作image 簽章 檢查。
所以 燒rom 的 hacker,就自己做了 功能強大的 recovery image。

recovey image 的開發和 OS 的開發好像是分開的人/組織。
當然也有 OS 開發 team 同時也提供 recovery image 的。

  • CMw -- 這個好像蠻popular 的,有 apk : ROM Manager 配合。
  • RA-Recovery -- 這個野蠻多人用,好像開發得比較早。
  • CM -- 就是有名的 CyanogenMode ,support 的 device 沒那麼多。 有 source
  • TWRP -- TeamWin,基於 aosp 的 OS 和 recovery,device support 也沒那麼多,有 source


Custom Recovery Image 的安裝,就是把 image file copy 到 recovery partition。
所以要有對 flash/nand/emmc partition read write 的權限。

所以有不同作法:
  • root 後,安裝 terminal progam,放入 flash_image 這個 tool,用 flash_image 把 image 寫到 recovery partition
  • 利用 bootloader 或是原廠 recovery image 的 fastboot cmd,把 image 寫入 recovery partition


果然,S-ON 的情況下,fastboot 不允許 run external boot image
否則就每次用 boot command run recovery image 就好,連 recovery partition 都不用燒了。

所以 只好 用 root 後,從 termianl 執行 flash_image,把 recovery 燒到 partition。


把 RA recovery image 燒到 flash 中的步驟:

用 UniversalRoot 取得 root
就"設法"裝這個 apk 就是 ...
remounte /sytem 為 rw #mount -o remount,rw -t yaffs2 /dev/block/mtdblock3 /system
把 flash_image copy 到 /system/bin 中
#dd if=/sdcard/flash_image of=/system/bin/flash_image
可以執行 flash_image 把 RA-Recovery 燒到 recovery partition 了 #flash_image recovery /sdcard/recovery.img
完成!

關機,按 HOME + Power 重新開機,就會進入 RA-Recovery
  • 網路上另一種方法是用 flashrec.apk ,這program 的 source code 在 google code 中,可以看到,也是用 flash_image 來作,所以對新版 ROM 無效。

.. 應該要加上 flash_image not found 和 remote not allowed 這兩個關鍵字..

OK., 接著可以 build CM7 了..


backup & restore

之後每次開機按 HOME+Power 就可以開進 recovery image。
裡面有 backup/restore 選項。

其中有兩項有點混淆:
  • nand
  • bart

nand 跟 bart 的差別在 bart 把 ext partition 也一起被份了,
ext partition 好像是用 app2SD 時,而外開的一個 partition。
所以沒用的人不需要用 bart

ref: http://guide.hiapk.com/news/10162012/021642164.shtml

2013年1月28日 星期一

ndk install and use -- in linux

在 linux 上 裝 NDK 比較容易。
follow : Android NDK

就untar ndk 後,就算裝完了。

因為 jni 要手動 build:
  • cd 到 jni 所屬 project 的 root
  • 給定 full-path, 執行 ndk-build
就會 build 出 so.

so 要自己 push ?

2013年1月21日 星期一

android powerkey -- from kernel to app

kernel/driver/input/keyboard 有一個特別為 gpio 寫的 power key driver: mxc_pwrkey.c
從 probe (), register 的 input value 只有: input->name = "mxc_power_key"; input->lphys = "mxcpwrkey/input0"; input->id.bustype = BUS_HOST; input->evbit[0] = BIT_MASK(EV_KEY); mxc_pwrkey->value = pdata->key_value; mxc_pwrkey->get_status = pdata->get_key_status; mxc_pwrkey->input = input; pdata->register_pwrkey(pwrkey_event_handler);
platform driver name: static struct platform_driver mxcpwrkey_driver = { .driver = { .name = "mxcpwrkey", }, .probe = mxcpwrkey_probe, .remove = mxcpwrkey_remove, };
找一下 mxcpwrkey 對應的 platform device (data): arch/arm/mach-mx5/devices.c: struct platform_device mxc_powerkey_device = { .name = "mxcpwrkey", .id = 0, };
所以要找一下 register mxc_powerkey_device 時的 data: arch/arm/mach-mx5/mx51_babbage.c mxc_register_device(&mxc_powerkey_device, &pwrkey_data);
也就是 . pwrkey_data: static struct power_key_platform_data pwrkey_data = { .key_value = KEY_F4, .register_pwrkey = mxc_register_powerkey, .get_key_status = mxc_pwrkey_getstatus, };
找到!
PowerKey 送的是 KEY_F4

這個 constant 宣告在 include/linux/input.h #define KEY_F4 62
也就是說,當 power button 被按下, input event 讀到的會是 62

Android InputReader 讀到後,會先依照 device/fsl/imx51_bbg/mxckpd.kl : key 62 ENDCALL WAKE key 4 POWER WAKE
會轉成 ENDCALL

再依照這個字串table base/include/ui/KeycodeLabel.h 轉成 數值: { "ENDCALL", 6 }, { "POWER", 26 },

所以在 app 的 onKeyDown( ) 收到的會是 "6"

2013年1月17日 星期四

PowerOff -- PowerManager.goToSleep( )

要寫一個 進入 sleep 的 apk,這功能就像是 power key 一樣。
查到,是用 PowerManager 的 goToSleep( )

就是在 OnClick(): (PowerManager) (getSystemService(Context.POWER_SERVICE)).goToSleep(SystemClock.uptimeMillis());
另外,因為 SystemClock.uptimeMillis(),所以要: import android.os.SystemClock;
當然,也要 .. import android.os.PowerManager;
最後,這個function 需要 DEVICE_POWER 的 permission,和 system 的 uid。
所以 AndroidManifest.xml 要有: <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.my.poweroff" android:sharedUserId="android.uid.system" android:versionCode="1" android:versionName="1.0" > <uses-permission android:name="android.permission.DEVICE_POWER" />
Build 完後,還要簽章,follow ref 的方法,在 eclipse 裡,project 按右鍵。
Android tool -- export unsigned package

然後用 signapk.jar 作簽章: $java -jar signapk.jar platform.x509.pem platform.pk8 poweroff.apk out.apk
  • signapk.jar 在 out/host/linx-x86/....
  • platform.* 在 build/target/product/security/,,,,
要注意signapk 最後一個 out.apk 是 sign 後的 apk name,如果跟 input apk name 一樣,
會 fail...
signapk 好像沒 cache, buffer in, out



ref:

2013年1月14日 星期一

Wifi dongle with android sdk - RTL8192c

http://code.google.com/p/rtl8192cu/source/browse/

有提供 debian, android, android ics 的 sdk, porting guide。

suspend 動作交給 ap 作的..

suspend 時,叫起 特定程式,再由程式決定suspend 時間:
  • 直接在 framework 中送 intent,叫起/通知 app
  • 該程式 lock waklock,收 SCREEN_OFF message,處理完後再 release wakelock

第二種比較接近 android 的設計,這樣..該程式要實做一個 service,
由 service lock/release walkelock, handle SCREEN_OFF, ON ACTION。

但是要考慮 啟動 的方法

第一種就要 考慮叫起 app 的方法,還有 app 作 suspend command 的權限。

或許有的第三種,混合:
framework lock wakelock,然後叫起 app,由 app release walelock
-- kernel 有沒有檢查 lock/release wakelock 的 process id 必須要一致?

raspberry 沒有 console 這一點挺麻煩的。

查,那個 usb device 頭,只有供電 pin,D+/- 是空接,所以不可能當作 usb device。
gpio 的 uart tx/rx 是從 cpu 直接拉出來,所以是 TTL level,要接到標準的 RS232 cable,還要作 level shift ic

另外,就只能用 bluetooth 作 spp 連接了。這個沒試過。

挺複雜的:http://gregrob.ca/blog/2012/07/pi-geek/
看來拆一個 usb-serial cable 可能是最簡單的方法..

2013年1月8日 星期二

android sdk bundle for windows/Linux

從 android developement tool 2.1 開始, android sdk 提供 bundle 安裝。
裡面包含 eclipse, sdk 。

download 後,解開,裡面就有 eclipse,並且已經把 android sdk, sdk manager 等都設好了。
所以不用像以前一樣,裝 eclipse,download sdk,再到 eclipse 加 source site, update....

整個安裝動作就是:download, unzip, run 。



但是要注意的是,如果以前裝過 sdk,開啟 新的 eclipse 後, preference 中 android sdk 的 path 還是指向 舊的 path。
要把他改到新的位置 (unzip path/sdk),才會launch 新的 sdk manger,和使用新的 sdk。


第二個問題是 import 功能好像有 bug,會用錯 project name。

所以要 先自己 create 一個正確名稱的 project,然後 在其他地方 clone 好,把 .git copy 過去。

還有:
.gitignore 要加入 /gen



adt 21.0.1 的 bug 實在太多了,除了上面的 import project 錯誤。
後來又發現,svn co 的 project build 會出現
Errors occurred during the build.
Errors running builder 'Android Pre Compiler' on project 'MyProject'.
java.lang.NullPointerException

google 一下,竟然說是 .svn 這個 folder 的問題!!!
把所有 .svn folder 刪掉,clean project, 關掉 eclipse,再開啟 eclipse。 ref: http://stackoverflow.com/questions/14188650/android-pre-compiler-error-on-21-0-1-android-sdk

沒辦法,還是用21.1吧,這在 preview channel。
follow : http://tools.android.com/preview-channel

打開 preview channel 選項,並且把 update site 加入 之後。
安裝一次,更新一次,以上那兩個 bug 就沒了。

github - Windows helper

github 為 windows 的 user 寫了 git tool 環境。
只要裝 "Github for Windows",

就會裝好 git, bash 還有一個 for github repo 的管理介面(圖形的)。

經過那個圖形的 github repo 管理介面,可以處理 ssh public key gen & mantain 的動作。
但是限制所有 repo 都要用 https 存取。

然後提供的一個 "Git Shell",開啟 console,讓你下 git command。


使用起來很方便,安裝也比以前裝 git tool, ssh client, generate ssh key, ssh .. 等,方便多了。



使用在 https_proxy 後的網路:

沒辦法用 github gui 介面作 clone,push 等操作,但是 create repo 的動作可以作。

所以 push, clone 等動作,要用 git shell 。
git shell 要選 "git bash" (可以在 github gui 的 option 裡面設定)。

這樣才可以在 git shell 下 export https=XXXX 的 command。

2013年1月3日 星期四

Time, UTC, GMT, epoc , 1970 & 1900

UTC 就是 格林威治時間,是時區的一種。

跟 1900, 1970 的沒有關係。

1970 是因為 unix 系統內部用一個 variable - 秒數 代表時間。
而不是用 日期,

為了有效利用,把那個 variable 的 0 定義成 1970, 1,1,0:00:00

所以在轉換 unix system 內部的 time variable (系統秒數) 時,才要把 utc - 1970 。



但是很有趣(?) 的是,libc 中,用來表示日期時間的 structure tm,
其中的 "tm_year",代表的是 從 1900 開始計算的年。
其中的 "tm_mon",是 0-11,不是 1-12。

所以在拿到 utc 時間,填入 struct tm 時,要修正一下 tm_year, tm_mon: tt.tm_year -= 1900; tt.tm_non -= 1;

然後丟進 mktime(struct tm*)
-- 會 return 從 1970/1/1:00:00:00 到該日期的秒數。

2013年1月2日 星期三

Activity, Service 的 Context 物件,好像是用來存取系統的 Global 物件。
Context 是一個 abstract class,實際 implement 的是 ContextImpl,

所以,看 ContextImpl.java,可以知道 Activity/Service 可以從 Context 取得哪些系統服務。

IWifiManager.aidl , WifiService & WifiManager

把 IWifiManager.aidl 產生的 IWifiManager.java 重新 indent 打開來看。
再配合 .aidl 的 server , client class

aidl 的 java source 內含兩個 class 和一個 interface:
  • class : Stub
  • class : Proxy
  • interface : IWifiManager


就是 .. 一個 interface,兩個 class 各自解讀..

Stub 是給提供 Service 的 class 用的,繼承這個。然後實做 interface 介面

Proxy 是給 Client 的 class 用的,設法取得這個class,然後就可以 call interface 介面的function




Service 的 class 比較容易懂,就直接繼承 IWifiManager.Stub 就可以。
然後實做出每一個 interface 的 function。

Client 比較麻煩..因為 Proxy 是 Stub 的 private class,所以要用類似 factory patten 的方式,用
 IWifiManager.stub.asInterface( ) 

拿到 Proxy class (然後 cast 成 Interface 物件)




Proxy 是 Stub 的 inner class,因為這樣他才可以存取 Stub 的 private 變數 "DESCRIPTOR"
-- 至於 Binder Transation 用的 string constant TRANSATION_xxx 都不是 private..

Proxy 是 static class,這樣使用者 (client) 就不用一定要生成 Stub 物件 才能取得 Proxy 。

android 好像實做一個 singleton 在 Stub. asIterface( ) (類似 getProxy()),然後把 Proxy 設為 private class。




Stub, Proxy class 的 code 完全由 aidl compiler 產生,因為這是固定的行為:
Proxy function:
  • 包裝 argument
  • tranact
  • read exception , reply


Stub 的 code, interface 部份維持 abstract,讓 Server inplement。
code gen 只寫出 Binder 需要的部份.. onTranact( )
onTranact( ) 就是依照 參數決定 call 哪一個 interface function,並且 return result。




Design Patters 有 Proxy 這一項,其中的範例大多....
沒有 Android 這個範例來得好,

Proxy 建立 Server 的分身,把動作改為 packet,經過包裝後送給 真正執行的 實體 (Server)。
這樣比較有...非用 Proxy 這個 pattern 不可.. 的感覺。

標籤

網誌存檔