正文
在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函數來修改系統時間,可惜無論你怎麼調用這個函數都是沒用的,無論模擬器還是真機,在logcat中總會得到"Unable to open alarm driver: Permission denied ".這個函數需要signatureOrSystem等級的permission才能使用。有兩種方法可以處理,來得到系統權限。
第一個方法直接修改編譯,需要在Android系統源碼的環境下用make來編譯:
1. 在應用程序的AndroidManifest.xml中的manifest節點中加入android:sharedUserId="android.uid.system"這個屬性。
2. 修改它的Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行
3. 使用mm命令來編譯,生成的apk就有修改系統時間的權限了。
第二個方法使用系統簽名文件來處理:
1. 同上,和系統相同的uid. Android 的系統用戶id是android.uid.system , 在Manifest裡面添加android:sharedUserId="android.uid.system"。
2. 相同的系統簽名。包簽名需要用到android提供的signapk,但很遺憾,我們的開發包裡面並沒有,需要您手動的從源碼裡面編譯,在2.2的版本中,源碼路徑是:froyo\build\tools\signapk。
然後從源碼路徑froyo\build\target\product\security中取出兩個系統簽名文件platform.pk8 and platform.x509.pem.
就可以對eclipse編譯好的apk簽名了,(注: 編譯好的apk在bin目錄下)。
形式是:
Java –jar signapk.jar platform.x509.pem platform.pk8 input.apk output.apk.
完成這兩部後,在運行之前,您還要從模擬器上卸載掉原來的相同程序,因為簽名改了,不然會報錯不能安裝。
對於在模擬器上進行setCurrentTimeMillis 雖然我們能夠修改模擬器的時間了,這個方法的返回值仍然是false, 可能是不能真正的修改系統的時鐘吧。在Log中的提示是:
08-16 08:29:24.307: WARN/SystemClock(125): Unable to set rtc to 1281918564: Invalid argument.
這個和android模擬器裡面自帶的setting裡面的修改時間Log提示錯誤是一樣的。