我在修改制作Rom的時(shí)候,改的最多的無非就是以下幾項(xiàng):

  1. 修復(fù)EPST使##778#可用
  2. 修復(fù)*#*#4636#*#*
  3. 修改Google Services Framework確保國(guó)內(nèi)MEID清零的用戶能夠正常綁定Google賬號(hào)
  4. 去除撥號(hào)震動(dòng)
  5. 修復(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反編譯/編譯步驟

  1. 建立工作目錄,例如D:\ApkWork\
  2. 將下載的smali-1.2.4.jar, baksmali-1.2.4.jar存放到工作目錄中
  3. 將需要修改的apk也存放到工作目錄中
  4. 打開命令提示符(開始->運(yùn)行->輸入cmd然后回車)
  5. 切換當(dāng)前目錄為D:\ApkWork
  6. 輸入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目錄下)。
  7. 修改EPST目錄下的smali代碼
  8. 輸入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
  9. 把生成的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