ubuntu 在 R40e 上 還有 Debian 在 Sempron 2600 上

2012年10月31日 星期三

framwork code trace : go to sleep

只有查到 Framework 中,最後被 call 的是 com.android.server.PowerManagerService.gotoSleep(PowerManagerService.java:2449)
但是找不到 call 這個 function 的 java code.

找一下 c code,果然還有一堆,像: ./base/services/jni/com_android_server_PowerManagerService.cpp:40: jmethodID goToSleep; ./base/services/jni/com_android_server_PowerManagerService.cpp:104:void android_server_PowerManagerService_goToSleep(nsecs_t eventTime) { ./base/services/jni/com_android_server_PowerManagerService.cpp:108: env->CallVoidMethod(gPowerManagerServiceObj, gPowerManagerServiceClassInfo.goToSleep, ./base/services/jni/com_android_server_PowerManagerService.cpp:110: checkAndClearExceptionFromCallback(env, "goToSleep"); ./base/services/jni/com_android_server_PowerManagerService.cpp:167: GET_METHOD_ID(gPowerManagerServiceClassInfo.goToSleep, gPowerManagerServiceClassInfo.clazz, ./base/services/jni/com_android_server_PowerManagerService.cpp:168: "goToSleep", "(J)V"); ./base/services/jni/com_android_server_PowerManagerService.h:30:extern void android_server_PowerManagerService_goToSleep(nsecs_t eventTime); ./base/services/jni/com_android_server_InputManager.cpp:899: android_server_PowerManagerService_goToSleep(when);
最後 com_android_server_InputManager.cpp 可能就是處理的地方 (因為 power button 被 implement 成一個 key)

這個 code 是.. void NativeInputManager::interceptKeyBeforeQueueing(nsecs_t when, int32_t deviceId, int32_t action, int32_t &flags, int32_t keyCode, int32_t scanCode, uint32_t& policyFlags) { ... ... if (wmActions & WM_ACTION_GO_TO_SLEEP) { android_server_PowerManagerService_goToSleep(when); } ...

所以找賦予 wmAction WM_ACTION_GO_TO_SLEEP 值的 code..
這個 const WM_ACTION_GO_TO_SLEEP 的定義有點糟,jni 和 java 都要定義一次,而且要確保一樣: ./base/core/java/android/view/WindowManagerPolicy.java:106: public final static int ACTION_GO_TO_SLEEP = 0x00000004; .. ./base/services/jni/com_android_server_InputManager.cpp:873: const int32_t WM_ACTION_GO_TO_SLEEP = 4;

到這邊就有點麻煩..

上面 com_android_server_InputManager.cpp 的 interceptKeyBeforeQueueing( ) 中,先去 call java : JNIEnv* env = jniEnv(); jint wmActions = env->CallIntMethod(mCallbacksObj, gCallbacksClassInfo.interceptKeyBeforeQueueing, when, action, flags, keyCode, scanCode, policyFlags, isScreenOn); 這段code的 interceptKeyBeforeQueueing 是..
FIND_CLASS(gCallbacksClassInfo.clazz, "com/android/server/InputManager$Callbacks"); GET_METHOD_ID(gCallbacksClassInfo.interceptKeyBeforeQueueing, gCallbacksClassInfo.clazz, "interceptKeyBeforeQueueing", "(JIIIIIZ)I");
是 InputManager.java 的 interceptKeyBeforeQueuing

print current stack backtrace -- android

在 trace android framework 時,常常迷失掉。
可以在 framwork source 中,加入 dumpStack( ),這樣就可以找出 caller..

舉例來說,想知道 短按 power button 時,system suspend 的動作是誰 call 的。
只知道最後 作 setScreenState( ) 是實際寫入 kernel interface 的 function。

所以在 PowerManagerService.javasetScreenStateLocked() 加入: import java.lang.Thread; .... Thread.currentThread().dumpStack();
然後suspend 時,logcat 就會有: /System.err( 2417): java.lang.Throwable: stack request_suspend_state: mem (0->3) at 98046449377 (1970-01-02 00:26:25.141454751 UTC) dump W/System.err( 2417): at java.lang.Thread.dumpStack(Thread.java:577) W/System.err( 2417): at com.android.server.PowerManagerService.setScreenStateLocked(PowerManagerService.java:1629) W/System.err( 2417): at com.android.server.PowerManagerService.screenOffFinishedAnimatingLocked(PowerManagerService.java:1817) W/System.err( 2417): at com.android.server.PowerManagerService.access$4300(PowerManagerService.java:82) W/System.err( 2417): at com.android.server.PowerManagerService$BrightnessState.finishAnimationLocked(PowerManagerService.java:2079) W/System.err( 2417): at com.android.server.PowerManagerService$BrightnessState.stepLocked(PowerManagerService.java:2062) W/System.err( 2417): at com.android.server.PowerManagerService$BrightnessState.run(PowerManagerService.java:2088) W/System.err( 2417): at android.os.Handler.handleCallback(Handler.java:587) W/System.err( 2417): at android.os.Handler.dispatchMessage(Handler.java:92) W/System.err( 2417): at android.os.Looper.loop(Looper.java:130) W/System.err( 2417): at android.os.HandlerThread.run(HandlerThread.java:60) I/PowerManagerService( 2417): setScreenStateLocked0
這樣就知道,是



ref : java: printing current backtrace

2012年10月29日 星期一

netlink -- event interface between userland & kernel

這是 imx3 的 source code。
-- 只在 mc13783 這個 driver 有用到,和 battery, power 相關的 code。

為了一些 hardware 的 event 寫了一個 driver (mxc_hw_event),提供一個 netlink 的 interface,讓 kernel event 可以傳送到 user program。

mxc_hw_evnet 只在 /sys/..../ 下開一個 mxc_hw_event 的 netlink nod。

然後 export 一個 hw_event_send 給其他 kernel module 用。

其他 driver 的使用方法是..(以 pmic_battery 來看.):

當偵測到 充電器插入時...
t_sensor_bits sensor; struct mxc_hw_event event = { HWE_BAT_CHARGER_PLUG, 0 }; pr_debug("In callback_chg_detect\n"); /* get sensor values */ pmic_get_sensors(&sensor); pr_debug("Callback, charger detect:%d\n", sensor.sense_chgdets); if (sensor.sense_chgdets) event.args = 1; else event.args = 0; /* send hardware event */ hw_event_send(HWE_DEF_PRIORITY, &event); 經由 mxc_hw_event 這個 netlink node 送出訊息。

這樣 user program 可以monitor mx_hw_event,得到 charger plug event。
不必一直polling,或是像以前一樣,經過 /dev 的 ioctrl 送自己的 pid,作 signal handler。

2012年10月26日 星期五

Dev AVR on Windows -- Atmel Studio & WINAVR

  1. 去 winavr 網站 download winavr. 安裝
  2. 去 atmel 網站 download atmel studio (現在是 6.0)。
  3. 一樣,download service pack, 安裝
打開後,選 File -- import , import studio 4 project (aps)。
選一個 studio 4 的 aps 檔,他會自己 convert 成 6 的 project 檔。

點一下tool bar 的 device - Atxmega128A3。
會開啟 這個 device 的相關 page (datasheet & tool..etc)
可以看到 tool 有兩個可以選:
  1. Native
  2. As4_gcc
Native 那個好像是 Atmel 自己附的,Nsc 那個好像就是 winavr。

可以 follow 這一頁的說明,到 Tool-Option ,.. 去看/更改。
就是:
  • 安裝 winavr,假設是在 C:\Winavr
  • 開啟 avr studio, tools - options - toolchain - flavour configuration
  • Add Flavour
  • Name : winavr
  • Toolchain Path : C:\winavr\bin
  • Make Path : C:\winavr\utils\bin
  • 之後,開啟的 project,按下 toolbar 上 device 那個icon (chip icon ATxmega128A3),就會出現一堆頁面,Advanced -- Toolchain Flavour 選 winavr

接上 JTAG MKII 後,會自己找 driver install,然後在 atmel studio 開啟就找得到了。
-- 現在用的是 PDI 介面。

然後就可以 build project, debug - run 了。

2012年10月25日 星期四

正式服役 raspberry pi, B, 256M

Torrent download server.



我好像花了1800 買的。
賣家好像是自己要用,但是為了分攤運費,所以多買了幾片。

2012年10月24日 星期三

Android : power key to suspend, again..

參考前面兩篇文章: 一堆地方有goToSleep(),最後call 到的是...
./base/services/java/com/android/server/PowerManagerService.java
裡面的
    private void goToSleepLocked(long time, int reason) {
這個 function 最後 call 的是..
            setPowerState(SCREEN_OFF, false, reason);
這個function 剛好 follow ref.1 的內容。

原來的 code 寫法,短按 Power 就是 suspend,
長按則出現 PowerDialog,讓你選擇關機。

短按的動作,會讓 interceptKeyBeforeQueueing 傳回 含有
result = (result & ~ACTION_POKE_USER_ACTIVITY) | ACTION_GO_TO_SLEEP;
的return code。

2012年10月23日 星期二

ra0 occurred replay counter different in Key Handshaking

ra0 Pairwise Key Handshaking timeout

ra0 occurred MIC different in Key Handshaking

2012年10月22日 星期一

Raspberry Pi : Minimal system & preparation

只是要作一個 bt download server.
又因為沒有 dvi/hdmi moditor,所以只能用 ssh.


1. dd minimal system

先到 這裡 download armhf 的 minimal debian distribution. (without X).

dd 完後,開機,果然 sshd 就自動啟動了。
但是這只有 root account,password 是 raspberry
-- 沒有原來的那個 pi 帳號。


2. resize/enlarge the root partition

因為download 的 image 是 2G 系統,所以使用 4G SD 的話,會有 2G 沒用到,

follow 這一篇,resize 的作法就是用 fdisk 把最後一個 partition 砍掉 (p3/swap),然後把 p2(root) 砍掉再重新new 一個包含整個剩下區域的 partition。(root+swap)

-- 很有趣,這樣resize (new) 完後,重新開機 (shutdown -r now)。 再作 resize2fs 就可以了。
-- 東西竟然不會不見。

嗯,沒錯,沒有留 partition。

3. 安裝, config transmission-daemon

就 follow 上一篇就可以囉。

!! 真的動了!!
結果ip 是 20

*接下來就要開啟samba囉...



後來system 有死掉一次,不知道是不是這個 minimum 系統的原因,所以用回標準系統。
標準系統啟動後,會自動 run raspi-config。
讓你從選單作 systemconfig。

  • 先 expand_rootfs, 然後 reboot
  • 再手動叫起 sudo raspi-config
  • change_timezone
  • memory_split (16)
  • ssh (enable)
  • boot_behaviour (boot into console)
然後就可以 run apt-update, apt-upgrade。
之後再 run dpkg-reconfigure locales



這個版本也沒有 enale uart login

要 enable 的話,要改 /etc/inittab , 加上(uncomment 掉):
#Spawn a getty on Raspberry Pi serial line
T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100

2012年10月19日 星期五

Raspberry Pi:Torrent client --- transmission-daemon

當作 torrent client 的話,可以用 transmission-daemon 這個 package。
用 apt-get install 完後,他會自動修改 init.d/ 還有 /etc/group 。
增加啟動的命令和新增一個 user group : transmission-daemon,並且啟動 daemon。

但是要稍微修改一下設定:/etc/transmission-daemon/settings.json:
  • "rpc-authentication-required": false, 這樣web interface 就不會要求密碼
  • "rpc-whitelist-enabled": false, 這樣所有 ip 都可以access web interface

然後就可以重新啟動 transmission-daemon: service transmission-daemon reload
要用 reload, 不可以用 restart,因為 現在 transmission-daemon 還有 bug,在 /etc/transmission-daemon/README.json: Currently transmission overwrites the settings.json configuration file on exit. The daemon can be instructed to reload the config with a SIGHUP, or # invoke-rc.d transmission-daemon reload Otherwise changes made manually to the file while the daemon is running will be silently overwritten on exit.

試試看在 pc 的 browser 開啟 http://raspberry-pi-ip:9091
就會出現 web 介面了。



另外 有說到如果遇到 down load 時當機的情況,就要修改 settings.json,加上:
  • "peer-limit-global": 100,
  • "peer-limit-per-torrent": 30,
限制download 時 track 的數量。

另外,download 的位置也寫在 settings.json 中。

預設是: "download-dir": "/var/lib/transmission-daemon/downloads",
未完成的位置是在: "incomplete-dir": "/root/Downloads",
可以另外安裝 samba server。


ref:

另外,這個 image 比較小,只有500MB,pure command line,沒有 X

USB HUB supplied power

usb 2-1.3: new high speed USB device using fsl-ehci and address 3
usb 2-1.3: New USB device found, idVendor=0403, idProduct=6011
usb 2-1.3: New USB device strings: Mfr=1, Product=2, SerialNumber=0
usb 2-1.3: Product: Quad RS232-HS
usb 2-1.3: Manufacturer: FTDI
usb 2-1.3: rejected 1 configuration due to insufficient available bus power
usb 2-1.3: no configuration chosen from 1 choice

'usb 2-1.3: rejected 1 configuration due to insufficient available bus power'

找到印出這個 message 的 code,在比較式把 value 印出來, 結果是: bMaxPower:250 *2, bus_mA: 100
代表hub report 只有100mA 的輸出能力,但是 device claim 250mA。

查一下 hub 的 datasheet,,知道 hub 有兩種模式:
  • bus_powered: 從 upstream 取得電源,所以downstream 只允許有 100mA,而且所有 down stream 的總和不得超過 500mA
  • self_powered: 自己有電源(adaptor),每個 downstream 都可以有 500mA

所以猜是 hub 的 configuration 錯了。

hub 的 configuration 是由 configureation pin SEL0-2 決定,
剛好有決定是 bus-power 或 self-power mode。

改掉成 self-power mode 後,就 OK 了。

2012年10月17日 星期三

Raspberry: initial config & set proxy for apt-get

接上 monitor, keyboard 開機後。第一次會出現 config 選單。
選了把 root partition 加大。還有開啟 ssh server 後就可以重開。

... 然後開機就會是 expand root partition 的 message。

然後出現 login prompt
username : pi password : raspberry
接上網路線後,ifconfig 就可以看到 ip 了。

然後 follow 這一篇: Connect Raspi to a Proxy

在 /etc/apt/apt.conf.d 下新增一個檔案:02proxy

內容是;
Acquire::http::Proxy "http://yourproxyaddress:proxyport";

如果是 uart 開機,又是 minimum image, 開機就不會自己出現 config,
要手動:raspi-config

2012年10月15日 星期一

Raspberry Pi : enable sshd server & config network for default booting

買了一堆cable 後,最後還是用 hdmi-dvi cable 才成功的看到 boot 畫面。

其實,不一定要用 monitor,可以用網路 ssh server,像 這一篇:

Raspberry Pi quickstart: headless setup (no monitor)

就有說明修改 SD image,開啟 sshd server 的方法,

原來燒入 sd card 的 image 會有兩個 partition,把他門 mount 近來看就可以修改了。


一樣,然後 這一篇 就可以啟動 VNC Server,然後用 VNC client 來控制。


2013.09.24:

光改 static ip 這招好像沒效。
因為一開機就會出現一個 choose combo,要你選,沒選的話,網路部會起來。
所以還是要 monitor + keyboard。

179

因為種種原因...要用 firefox..,所以啟動了 vnc
就 follow 上面的 link,裝了 tightvnc,並且在 系統啟動就 enable。
結果 好像沒啟動,手動啟動後,要我給一個 password,所以就輸入了 跟 login 一樣的。

之後client 端就用 tightvncviewer 成功。

$xtightvncviewer 192.168.1.179:1

再安裝 icesweal
也 OK.



另外。command line 設定 Wifi 的方法: http://www.penguintutor.com/news/raspberrypi/rpi-wireless-cli

get source for building aosp - framework & ..

承上篇,android 不含kernel 的部份。

其實 android 的 framework 已經把 prebuild 的 kernel 包含在 devices/product 下。
所以不修改 kernel 的話,就不用 download kernel source。

取得 source code 的方法就跟網頁說得一樣: Download the source

repo init -u https://android.googlesource.com/platform/manifest -b android-4.1.2_r1
-- 這個 branch (android-4.1.2_r1 有在 kernel source 中).

然後一樣作 sync... (文章 mirror 的作法,我做起來會 fail,好像是因為 dalvik2 這個 folder.)

這個 branch , device 下才有 samsung/crespo 這個 folder,才能 buils Nexus S 的 image。

之後還要拿 close source 的 bin 檔。

大概就是去 aosp download 對應版本的 一堆 tgz 檔,解開後會變成 sh。
到 aosp 的目錄去run 他,他就會顯示license 讓你確認,並且檢查 source code正不正確,然後 create vendor folder,放到裡面。

都做完後,就可以 回去 follow Build 的 step。 run envsetup, lunch 和 make 了。

我lunch 選的是 8 : full_crespo-userdebug

也可以用 full_crespo-eng,這個沒列在選單中,要自己 key,,

get source for building aosp --kernel

kernel: 重要的是 kernel,並不是每一個 build 都有。
所以要去你自己的機器的 device 去看,有那幾個 build。

所有 git project 的列表在: android google source


以 Nexus S 來看,就是 :

device/samsung/crespo Files specific to Samsung crespo hardware, a.k.a. Nexus S.

以現在這個時間,最後release 的版本是 android-4.1.2_r1

所以 整個 repo branch:
repo init -u https://android.googlesource.com/platform/manifest -b android-4.1.2_r1

這樣 device/samsung/ 下就會有 crespo



然後才follow aosp kernel 說明 :
http://source.android.com/source/building-kernels.html

在 device/samsung/crespo 目錄,command : git log kernel:
commit c181cc132d5077ea28ffeb9d0be656665f5319c6 Author: Dmitry Shmidt Date: Mon Sep 10 14:17:56 2012 -0700 crespo: Kernel prebuilt (DO NOT MERGE) 5894150 net: wireless: bcmdhd: Report proper mcs rate mask 5ad899a netfilter: xt_qtaguid: report only uid tags to non-privileged processes 782ca40 netfilter: xt_IDLETIMER: Rename INTERFACE to LABEL in netlink notification b/7103180 Change-Id: If9ac23da68669087761dfd4f80d1c08f2fd99a49 Signed-off-by: Dmitry Shmidt

log 裡有寫對應的 kernel build SHA1 code. -- 5894150

這個 SHA1 code 就是 kernel 的 rev。



接著自己把 samsung 的 kernel clone 下來...
一樣,在 剛剛的頁面,有 samsung 的 kernel git project...
git clone https://android.googlesource.com/kernel/samsung.git
clone 完,到 samsung 目錄下,沒有檔案,是 empty commit ..

所以先看看 server 端的 branch 有哪些: git branch -r origin/HEAD -> origin/master origin/android-samsung-2.6.35-gingerbread origin/android-samsung-3.0-ics-mr1 origin/android-samsung-3.0-jb origin/android-samsung-3.0-jb-mr0 origin/master
然後一一用 git log remote-branch-name 找到剛剛的 SHA1 commit...
-- 找到,是在 origin/android-samsung-2.0-jb-mr0 ..

其實直接 checkout SHA1 number 就可以: git checkout 5894150

* 這就是 aosp 說明頁的那一句: git checkout <commit_from_first_step>


ref:

2012年10月12日 星期五

about mirrorlink or terminal mode

Mirrorlink 就是把手機 panel (和 audio) 的延伸。
目前好像只有在車用系統上有用。

經由 MirrorLink,利用車用影音系統的lcd/touch 來控制手機。

目標是希望降低車用影音系統的成本,刪除掉與手機重複的功能。
同時又保有較大的螢幕和比較方便的操作。

mirrorlink 有一個專門的協會在運作。
規定了使用的 protocol。

但是好像沒有很嚴格,所以各家手機各有自己的 implement。

目前看來,好像是用 vnc。

在手機上 run VNC server。
再經由 usb cdc/ncm profile 傳送。


實際上 mirrorlink 要作到三件事:
  1. lcd screen mirror
  2. phone audion mirror
  3. touch event to phone
前兩項可以用 mdhi。這樣可以減少 phone 的 overhead,還有一些hardware 相容性問題 (hardware codec not always output to framebuffer)

touch event 就比較麻煩,他的需求有:
  1. absoulte pos , 而不是像 mouse 一樣的 move/relative pos
  2. system contol permission
這兩項是 couple 在一起的。

要把touch event 注入系統,通常都需要system permission。
如果使用系統support 的輸入裝置則不需要,像 bt/usb hid device

但是這些系統 support 的輸入裝置都是 relative posistion,沒有 absoult position。




google 一下 vnc server on android,會有一些application。
一樣,這些大多要求 root 權限。

即使不需要 root 權限 (例如:VMLite VNC server),
也需要 user 先將手機連上 pc,利用 pc 來開啟 vnc server。

這個動作應該是利用 adb 啟動 vnc server,因為 adb 有 system 權限。


猜測解決方法:

大概有兩種,
第一種就是把 adb command 內建,當手機連上時,用 adb command 啟動 手機上的 server。
第二種就是利用內建的 hid 裝置,加上一個校正動作,把touch 的 絕對位置 轉為 相對位置,送到手機。


一堆 inject Event 的 api 在後面的 android 版本都被刪除了,所以只剩下對 /dev/input/event 寫入的方法。
adb shell 有 shell 權限,測試 cat , echo pipe command,好像有對 /dev/input/event 讀寫的權限 -- shell ?
Android 4.0 以後 /system/bin 有 adb 命令,所以已經內建 adb client 端。

adb 可以重導到 tcp,所以可以經過 wifi,不必經過 usb..
-- 這個或許不需要,因為 mhl 可以同時使用 mhl , usb 功能。

所以 mirror link 有關 touch 的實做方法大概是:
  • user 開啟 'usb debug 功能', 接上 車機
  • 車機 接通手機的 adb shell,event 一個 c program 對 /dev/input/event 寫入 touch event

Sony 的車用系統有 mirrorlink,下面是手機的support list:
http://www.sony-asia.com/support/compatibility/499547

-- 大概就是 SONY, NOKIA (Symbian), Samsung 三家有 support。而且SONY, Samsung 是只有最新的一款有 support 而已。

XDA 有 release XAV601 的內容,這個 thread 有提到 sony release 的 library: http://forum.xda-developers.com/showthread.php?t=1686535&page=2
sony : http://www.sony.net/Products/Linux/Audio/XAV-701BT.html


PIONEER 用的是另一種方法:Display + app control。
用 HDMI, MHL 把手機螢幕,聲音顯示出來,至於控制的部份,再用 自己的 app 來作,手機上安裝 PIONEER 的 app,讓車用音響控制。
所以 google play 上有一堆 PIONEER 的 app。
https://play.google.com/store/apps/developer?id=PIONEER+CORPORATION

另外,基於 PIONEER 的 appradio ,有人寫出另一個軟體,讓 車用音響直接控制 android phone:(arliberator) https://play.google.com/store/apps/details?id=com.kyle.arliberator&feature=nav_result#?t=W251bGwsMSwyLDNd
-- 但是,這個軟體需要 root。
-- 從 FAQ 可以看到,root 是為了 inject touch event,還有是利用 BT 連接。

結果:最偷懶的作法是 HID,加上龜零。
每次點擊都當作mouse 從(0,0) 移動到點擊處,然後按下button。
這樣就可以避免mouse 只送相對 move 資料的問題。

當然,還要配上設定解析度,HID 裝置要先知道phone 的螢幕解析度。

2012年10月11日 星期四

ADV7180 support for BSP10.4

這是 freescale 官方(?) 的修改。
讓 android 可以 support interlaced input。
但是。還是不support錄影。

Patch to support adv7180 TVin chip for Freescale Android R10.4 BSP on iMX53

2012年10月8日 星期一

找到 android core dump 的 位置

這一篇有說明如何從 core dump 找到當機的 source code:
http://kobablog.wordpress.com/2011/05/14/how-to-read-crash-dump-of-android/

大概就是..從 out/target/product/XXX/ 下的 symbols folder,有 not stripped version 的檔案。

利用 objdump 列出位址與 source code。
配合 core dump 的內容就可以找出來了。



馬上來照著做好了,sample 是會發生 core dump 的XXXX..
內容大概是.. I/DEBUG ( 2333): signal 11 (SIGSEGV), code 1 (SEGV_MAPERR), fault addr 00000000 I/DEBUG ( 2333): r0 bee91054 r1 00000000 r2 bee9105a r3 00000000 I/DEBUG ( 2333): r4 bee91030 r5 bee91054 r6 80204c50 r7 0000abd8 I/DEBUG ( 2333): r8 bee91288 r9 4850cc70 10 0000abd8 fp aca9f368 I/DEBUG ( 2333): ip 80204c7c sp bee91028 lr 80201ec9 pc afd20856 cpsr 60000030 I/DEBUG ( 2333): #00 pc 00020856 /system/lib/libc.so I/DEBUG ( 2333): #01 pc 00001ec4 /data/data/com.Xingtek/lib/libhashkey.so I/DEBUG ( 2333): #02 pc 00011e34 /system/lib/libdvm.so I/DEBUG ( 2333): #03 pc 000436e0 /system/lib/libdvm.so I/DEBUG ( 2333): #04 pc 00048e62 /system/lib/libdvm.so I/DEBUG ( 2333): #05 pc 00017034 /system/lib/libdvm.so I/DEBUG ( 2333): #06 pc 0001c0e4 /system/lib/libdvm.so I/DEBUG ( 2333): #07 pc 0001afdc /system/lib/libdvm.so I/DEBUG ( 2333): #08 pc 00059dde /system/lib/libdvm.so I/DEBUG ( 2333): #09 pc 00061b52 /system/lib/libdvm.so I/DEBUG ( 2333): #10 pc 00017034 /system/lib/libdvm.so I/DEBUG ( 2333): #11 pc 0001c0e4 /system/lib/libdvm.so I/DEBUG ( 2333): #12 pc 0001afdc /system/lib/libdvm.so I/DEBUG ( 2333): #13 pc 00059c40 /system/lib/libdvm.so I/DEBUG ( 2333): #14 pc 00046126 /system/lib/libdvm.so I/DEBUG ( 2333): #15 pc 0003194e /system/lib/libandroid_runtime.so I/DEBUG ( 2333): #16 pc 000327fa /system/lib/libandroid_runtime.so I/DEBUG ( 2333): #17 pc 00008cca /system/bin/app_process I/DEBUG ( 2333): #18 pc 00014b52 /system/lib/libc.so 所以去查一下 libc.so 的 20856 ..
用 arm-eabi-objdump -S libc.so 之後,找 20856:


可以看到是strcat( ) 中的... 20856: 5ccc ldrb r4, [r1, r3]
應該是 r1 是 00000000,也就是 strcat 的 pointer 有一個是 0導致。

去看一下 bionic/libc/string/strcat.c:

char * strcat(char *s, const char *append) { char *save = s; for (; *s; ++s); while ((*s++ = *append++) != '\0'); return(save); } 果然沒有檢查,
所以加上 null pointer 檢查。

奇怪的是,如果直接在 code 用 s, append 檢查,會被 optimize 掉,
所以要另開 function..
int isnotvalid(int a, int b) { if((a==0)||(b==0)) return 1; else return 0; } 然後在 strcat 壹開始用 isnotvalid( ) cheeck s, append 才不會被 optimize 掉,
兒這樣,那個 XingTek 的 apk 也可以執行了 (雖然沒值...)



附帶提一點(或許對其他人來說,已經是 common sense ..)

libc.so 好像是啟動就cache 住,所以用 adb sync 把修改過的 lib.so sync 到 target,再啟動XingTek app
他也不會使用新的 lib.so,

adb sync 玩 libc.so 後,要 system reboot 才行。

山寨機的問題

以我這台經jetrom 加持過的超Low end 7 ips a9 2 core pad  icou7 來說,大概有以下問題
  • 無線超不穩,連一下就斷
  • 電池指示是壞的 ,常常保持100, 然後用一陣子就突然斷電。
  • Touch很頓,和飄,中間和四周差很大,反應很慢。
  • 軟體相容性很差,很多 game 都不能玩。一些 google ap 升級後就 fail..
  • 用不到半年,問題越來越多:
    • 竟然出現不會 suspend/sleep 的奇異現象,按下 power 鍵,螢幕是關了,再按 power 鍵恢復,但是不是所動畫面,後來發現 系統根本沒關,所以電池一下就耗盡了。
    • panel 不定期出現一些白帶
    • download 的東西一多,系統設定好像變得奇怪,猜是 內部 nand/emmc? partition 問題,要 會恢復原廠狀態 (format partition)才會恢復
所以山寨之所以便宜,就是便宜在這,,他的function 都是時好時壞。

2012年10月4日 星期四

2012年10月2日 星期二

init: untracked pid 2981 exited
ping: sendto: Network is unreachable
ADDRCONF(NETDEV_UP): wlan0: link is not ready
# channel hint set to 2437
wmi_control_rx() : Unknown id 0x103b
ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
init: no such service 'iprenew_wlan0:wlan0'
init: untracked pid 3060 exited
ADDRCONF(NETDEV_UP): wlan0: link is not ready
channel hint set to 2437
wmi_control_rx() : Unknown id 0x103b
ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
init: no such service 'iprenew_wlan0:wlan0'
init: untracked pid 3119 exited
ADDRCONF(NETDEV_UP): wlan0: link is not ready
channel hint set to 2437
wmi_control_rx() : Unknown id 0x103b
ADDRCONF(NETDEV_CHANGE): wlan0: link becomes ready
init: no such service 'iprenew_wlan0:wlan0'
init: untracked pid 3179 exited
ADDRCONF(NETDEV_UP): wlan0: link is not ready
...

標籤

網誌存檔