我在修改制作Rom的時(shí)候,改的最多的無非就是以下幾項(xiàng):
- 修復(fù)EPST使##778#可用
- 修復(fù)*#*#4636#*#*
- 修改Google Services Framework確保國(guó)內(nèi)MEID清零的用戶能夠正常綁定Google賬號(hào)
- 去除撥號(hào)震動(dòng)
- 修復(fù)撥號(hào)號(hào)碼自動(dòng)添加橫線
由于最近有不少朋友問怎么修改EPST之類的問題,決定把以上這些問題的修改方法公開,方便大家自己使用自己喜歡的ROM。
注: 本修改方法絕對(duì)原創(chuàng), 轉(zhuǎn)載請(qǐng)注明出處, 謝謝!
第一部分: 準(zhǔn)備工作
相關(guān)工具:
baksmali-1.2.4.jar(反編譯工具)
下載地址: http://smali.googlecode.com/files/baksmali-1.2.4.jar
smali-1.2.4.jar(編譯工具)
下載地址: http://smali.googlecode.com/files/smali-1.2.4.jar
JAVA環(huán)境
訪問 http://www.java.com/getjava/ 安裝JAVA環(huán)境
相關(guān)知識(shí):
Android中的軟件是以apk文件的方式存在的,apk文件格式其實(shí)就是zip,我們可以用winrar打開apk文件,就會(huì)發(fā)現(xiàn)一般的apk目錄如下圖所示:
其中classes.dex就是我們需要修改的程序文件,dex是Dalvik VM executes的縮寫。
一般情況下apk中都會(huì)存在classes.dex的。還有另外一種情況,某些ROM中apk中是沒有dex的,而是在apk所在的目錄下存在同名的odex文件,這是一種優(yōu)化的dex文件,以便在運(yùn)行的時(shí)候能夠獲得更好的性能。
我們這里只討論編譯和反編譯dex文件, odex的編譯和反編譯請(qǐng)大家自己google一下相關(guān)教程。
dex的反編譯與編譯: 使用baksmali反編譯后的文件為smali格式,與java代碼還是有一定區(qū)別的,可讀性較差,但是這個(gè)并不妨礙我們修改程序。程序修改后使用smali重新編譯,即可得到修改后的dex文件。
APK反編譯/編譯步驟
- 建立工作目錄,例如D:\ApkWork\
- 將下載的smali-1.2.4.jar, baksmali-1.2.4.jar存放到工作目錄中
- 將需要修改的apk也存放到工作目錄中
- 打開命令提示符(開始->運(yùn)行->輸入cmd然后回車)
- 切換當(dāng)前目錄為D:\ApkWork
- 輸入java -jar baksmali-1.2.4.jar EPST.apk -b -o EPST 然后回車,這條命令就是反編譯EPST.apk的代碼,并保存到EPST目錄下。
參數(shù)說明:
EPST.apk 需要反編譯的apk文件.
-b smali文件中不生成.line的信息(不指定-b參數(shù)的話,smali文件中會(huì)包含大量的.line代碼)
-o EPST 表示生成的smali文件保存到EPST目錄下(不指定-o 參數(shù)的話,smali文件默認(rèn)會(huì)保存到out目錄下)。 - 修改EPST目錄下的smali代碼
- 輸入java -jar smali-1.2.4.jar EPST -o classes.dex 然后回車,這條命令就是編譯EPST下的代碼然后保存為classes.dex。
參數(shù)說明:
EPST 需要編譯的smali目錄
-o classes.dex 編譯后的dex保存為classes.dex,不指定 -o 參數(shù)的話,默認(rèn)保存為out.dex - 把生成的classes.dex替換到epst.apk中,這樣我們的epst.apk就完成了反編譯/修改/編譯的全部步驟,然后我們就可以把epst.apk替換到rom中,然后重新簽名rom即可。
仔細(xì)閱讀上面的準(zhǔn)備工作,了解了如何反編譯和編譯apk后,我們就可以進(jìn)行下面的修改。
第一部分: 具體修改
修復(fù)EPST使##778#可用
修改文件: EPST.apk
修改原理: EPST讀取系統(tǒng)的ro.build.type變量,如果該變量的值為user,就限制使用##778#。由于大部分ROM的ro.build.type為user,所以這些ROM的用戶均不能使用##778#。我們通過修改EPST.apk,讓其本來判斷ro.build.type是否是user改為判斷ro.build.type是否是nouser(這里這個(gè)nouser大家隨便寫),這樣就可以讓大家都能使用##778#了。
修改過程:
在反編譯后的目錄下查找包含"user"的內(nèi)容,把所有"user" 均改為"nouser"。
在早期rom的epst中,只能找到一個(gè)地方,最近的2.2的evo rom中,可以找到3個(gè)地方。
例如,新的EVO 2.2 Rom中需要修改以下內(nèi)容(修改的地方均位于com\google\android\epst\EntryEPSTInfo.smali文件中):
sput-object v0, Lcom/google/android/epst/EntryEPSTInfo;->mBuildType:Ljava/lang/String;
sget-object v0, Lcom/google/android/epst/EntryEPSTInfo;->mBuildType:Ljava/lang/String;
const-string v1, "user"
修改為
sput-object v0, Lcom/google/android/epst/EntryEPSTInfo;->mBuildType:Ljava/lang/String;
sget-object v0, Lcom/google/android/epst/EntryEPSTInfo;->mBuildType:Ljava/lang/String;
const-string v1, "nouser"
____________________________________________________________________________
if-ne v4, v10, :cond_b5
if-nez v2, :cond_b5
sget-object v4, Lcom/google/android/epst/EntryEPSTInfo;->mBuildType:Ljava/lang/String;
const-string v5, "user"
修改為
if-ne v4, v10, :cond_b5
if-nez v2, :cond_b5
sget-object v4, Lcom/google/android/epst/EntryEPSTInfo;->mBuildType:Ljava/lang/String;
const-string v5, "nouser"
____________________________________________________________________________
move-result v4
if-eqz v4, :cond_b5
sget-object v4, Lcom/google/android/epst/EntryEPSTInfo;->mBuildType:Ljava/lang/String;
const-string v5, "user"
修改為
move-result v4
if-eqz v4, :cond_b5
sget-object v4, Lcom/google/android/epst/EntryEPSTInfo;->mBuildType:Ljava/lang/String;
const-string v5, "nouser"
修復(fù)*#*#4636#*#*
修改文件: Settings.apk
修改原理: 在EVO 2.2的Rom中,HTC把4636的調(diào)用入口刪掉了,其實(shí)4636的功能還在,只是不能通過輸入*#*#4636#*#*調(diào)用了,這里我們重新補(bǔ)回調(diào)用的代碼就可以了。
修改過程:
打開反編譯后的文件 com\android\settings\TestingSettingsBroadcastReceiver.smali。
找到
# virtual methods
.method public onReceive(Landroid/content/Context;Landroid/content/Intent;)V
.registers 5
invoke-virtual {p2}, Landroid/content/Intent;->getAction()Ljava/lang/String;
move-result-object v0
const-string v1, "android.provider.Telephony.SECRET_CODE"
invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
move-result v0
if-eqz v0, :cond_c
:cond_c
return-void
.end method
在
if-eqz v0, :cond_c
和
:cond_c
代碼中間插入以下代碼
new-instance v0, Landroid/content/Intent;
const-string v1, "android.intent.action.MAIN"
invoke-direct {v0, v1}, Landroid/content/Intent;-><init>(Ljava/lang/String;)V
const-class v1, Lcom/android/settings/TestingSettings;
invoke-virtual {v0, p1, v1}, Landroid/content/Intent;->setClass(Landroid/content/Context;Ljava/lang/Class;)Landroid/content/Intent;
const/high16 v1, 0x1000
invoke-virtual {v0, v1}, Landroid/content/Intent;->setFlags(I)Landroid/content/Intent;
invoke-virtual {p1, v0}, Landroid/content/Context;->startActivity(Landroid/content/Intent;)V
修改Google Services Framework確保國(guó)內(nèi)MEID清零的用戶能夠正常綁定Google賬號(hào)
修改文件: GoogleServicesFramework.apk
修改原理: 最近Google在自己的checkin服務(wù)中增加了MEID有效性的判斷,導(dǎo)致國(guó)內(nèi)很多MEID清0的用戶不能正常綁定Google賬號(hào),通過修改代碼,我們讓手動(dòng)指定一個(gè)有效的MEID,即可正常綁定Google賬號(hào)。
修改過程:
打開反編譯后的文件 com\google\android\gsf\checkin\CheckinRequestBuilder.smali。
invoke-virtual {p0}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
move-result-object v7
修改為
const-string v7, "A8888888888888"
____________________________________________________________________________
invoke-virtual {p0}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
move-result-object v5
修改為
const-string v5, "A8888888888888"
invoke-virtual {p0}, Landroid/telephony/TelephonyManager;->getDeviceId()Ljava/lang/String;
move-result-object v6
const-string v6, "A8888888888888"
去除撥號(hào)震動(dòng)
修改文件: HtcDialer.apk
修改原理: HTC撥號(hào)器在初始化的過程中,把是否啟用按鍵震動(dòng)已經(jīng)寫死在代碼中, 我們只需要把啟用改成不啟用即可。
修改過程:
打開反編譯后的文件 com\android\htcdialer\util\KeypadUtils.smali。
.method private initVibrator()V
.registers 2
const/4 v0, 0x1
修改為
.method private initVibrator()V
.registers 2
const/4 v0, 0x0
修復(fù)撥號(hào)號(hào)碼自動(dòng)添加橫線
修改文件: HtcDialer.apk ,Phone.apk
修改原理: 由于Hero 200/Evo 4G均為Sprint定制的機(jī)器,所以HTC在開發(fā)系統(tǒng)的時(shí)候沒考慮過其他國(guó)家用戶的感受,在用戶輸入電話號(hào)碼和撥打電話號(hào)碼的時(shí)候會(huì)自動(dòng)把電話號(hào)碼格式化為1-xxx-xxx-xxx這種格式,我們只需要讓他不調(diào)用格式化電話號(hào)碼的函數(shù)即可。
修改過程:
打開 HtcDialer 反編譯后的文件 com\android\htcdialer\Dialer.smali。
.method static constructor <clinit>()V
.registers 4
const/4 v3, 0x1
修改為
.method static constructor <clinit>()V
.registers 4
const/4 v3, 0x0
打開 HtcDialer反編譯后的文件 com\android\htcdialer\HtcCdmaPhoneNumberFormatting.smali。
invoke-static {p0}, Lcom/android/htcdialer/HtcCdmaPhoneNumberFormatting;->isLegalPhoneNumber(Ljava/lang/String;)Z
move-result v1
修改為
invoke-static {p0}, Lcom/android/htcdialer/HtcCdmaPhoneNumberFormatting;->isLegalPhoneNumber(Ljava/lang/String;)Z
const/4 v1, 0x0
打開 Phone 反編譯后的文件 com\android\phone\PhoneUtils.smali。
.method public static hyphenNumber(Ljava/lang/String;)Ljava/lang/String;
.registers 3
invoke-static {p0}, Lcom/android/phone/PhoneUtils;->isLegalPhoneNumber(Ljava/lang/String;)Z
move-result v1
修改為
.method public static hyphenNumber(Ljava/lang/String;)Ljava/lang/String;
.registers 3
invoke-static {p0}, Lcom/android/phone/PhoneUtils;->isLegalPhoneNumber(Ljava/lang/String;)Z
const/4 v1, 0x0