Gecko JavaScript 之 “改 code 卻不 build code" 小徑。

Gecko JavaScript 之 “改 code 卻不 build code [1]

問:

常常我們會收到某些 Gecko 的問題,但卻是 log 不足或是可能需要在手機上摹擬某些特殊/額外的資訊才有可能重現問題。而我們又確定這個問題,大概會從 Gecko 的 JavaScript 檔案下手。但是,我又不想抓/編譯程式碼,這個症狀可有解?

答:

有的!!的確是有方法可以透過不抓/編譯程式碼的手續就可以把想做的事情達成的。

(記得拿出一台 firefox OS 的機器邊看邊操作嘿,(啥,沒機器?? 那就去"買"一台啊!!!!))

 

首先,我們先確認一下,你所想看的部份的 log 有沒有打開 [2]。

舉個 RIL (Radio Interface Layer) [3] 的例子來說,

1. ril_consts.js

// Set to true to debug all RIL layers
this.DEBUG_ALL = false;

2. RadioInterfaceLayer.js

// Read debug setting from pref
let debugPref = false;
try {
  debugPref = Services.prefs.getBoolPref("ril.debugging.enabled");
} catch(e) {
  debugPref = false;
}
DEBUG = RIL.DEBUG_RIL || debugPref;

喔喔! ril 相關的 log 沒開!!!!

可是,還好有 preference 可以手動的去打開它。

來吧~我們就來動手把它給打開吧。

1.1 adb pull /system/b2g/defaults/pref/user.js /tmp
1.2 把 ril.debugging.enabled 這個值修改成 true.
      pref("ril.debugging.enabled", true);
1.3 adb remount
1.3 adb push /tmp/user.js /system/b2g/defaults/pref/
1.4 adb reboot

adb logcat 來看一下,是不是可以看到 “RadioInterfaceLayer" 這個關鍵字出現在 log 裏面了呢(如下面的範例)?

I/Gecko   (  107): -*- RadioInterfaceLayer: Registered mobileconnection target: [object ChromeMessageSender]
I/Gecko   (  107): -*- RadioInterfaceLayer: Received 'RIL:RegisterIccMsg' message from content process
I/Gecko   (  107): -*- RadioInterfaceLayer: Registered icc target: [object ChromeMessageSender]
I/Gecko   (  107): -*- RadioInterfaceLayer: Received 'RIL:GetRilContext' message from content process
I/Gecko   (  107): -*- RadioInterface[0]: Received message from worker: {"voice":{"signalStrength":-53,"relSignalStrength":100},"data":{"signalStrength":-53,"relSignalStrength":100},"rilMessageType":"signalstrengthchange"}

 

這時候,你會問說,可是 我需要的資訊不是現有的 log 裏面就包含的。 那我該怎麼辦???

我有沒有辦法不去編譯程式碼,同時變造一些資料好讓我可以做一些測試?

那我們就來看下一個例子囉!!

 

舉個偽IMEI來當作範例。

1. 確認當前 IMEI 為何。

進撥號畫面,輸入*#06# [4],查看一下當下手機告訴你這台機器的 IMEI 是什麼!

Gecko JavaScript 之 “改 code 卻不 build code

2. 從手機中把需要的檔案拉出來:

 2.1 adb pull /system/b2g/omni.ja /tmp
 2.2 cd tmp
 2.3 unzip omni.ja
 2.4 cd omni
 2.5 find -name ril_worker.js

 

3. 修改步驟2.5中所找到的檔案,將 IMEI 偽造成我們想要的資料:

在此,我們將 IMEI 假造成為"123456789012345″。

Gecko JavaScript 之 “改 code 卻不 build code

 

4. 打包/跟新檔案:

4.1 zip -r omni.ja *
4.2 adb remount
4.3 adb push omni.ja /system/b2g
4.3 adb reboot

 

5. 重新查詢 IMEI :
Gecko JavaScript 之 “改 code 卻不 build code

完成了。。。 IMEI 被我們偽造成123456789012345了。

修改 Gecko 裏面的 JavaScript 檔案,卻不重新 build code ,是不是相當的簡單呢?

 

有沒有想試試看的東西了?

還等什麼?快點去試一把吧!!

 

註:

請確定你所使用的機器是開發者的版本,並且取得 root 的權限,上面的步驟才玩的下去喔。

參考資料:
[1] 圖片來源 – http://www.123rf.com/photo_8515474_3d-abstract-digital-code-connection.html
[2] https://wiki.mozilla.org/B2G/QA/Tips_And_Tricks#Changing_preferences
[3] https://wiki.mozilla.org/B2G/RIL
[4] 3GPP TS 22.030 version 11.0.0 Release 11, 6.7 Presentation of IMEI