我在修改制作Rom的时候,改的最多的无非就是以下几项:

  1. 修复EPST使##778#可用
  2. 修复*#*#4636#*#*
  3. 修改Google Services Framework确保国内MEID清零的用户能够正常绑定Google账号
  4. 去除拨号震动
  5. 修复拨号号码自动添加横线

由于最近有不少朋友问怎么修改EPST之类的问题,决定把以上这些问题的修改方法公开,方便大家自己使用自己喜欢的ROM。

注: 本修改方法绝对原创, 转载请注明出处, 谢谢!

第一部分: 准备工作

相关工具:

baksmali-1.2.4.jar(反编译工具)
下载地址: http://smali./files/baksmali-1.2.4.jar
smali-1.2.4.jar(编译工具)
下载地址: http://smali./files/smali-1.2.4.jar
JAVA环境
访问 http://www./getjava/ 安装JAVA环境

相关知识:

Android中的软件是以apk文件的方式存在的,apk文件格式其实就是zip,我们可以用winrar打开apk文件,就会发现一般的apk目录如下图所示:
 01
其中classes.dex就是我们需要修改的程序文件,dex是Dalvik VM executes的缩写。
一般情况下apk中都会存在classes.dex的。还有另外一种情况,某些ROM中apk中是没有dex的,而是在apk所在的目录下存在同名的odex文件,这是一种优化的dex文件,以便在运行的时候能够获得更好的性能。

我们这里只讨论编译和反编译dex文件, odex的编译和反编译请大家自己google一下相关教程。

dex的反编译与编译: 使用baksmali反编译后的文件为smali格式,与java代码还是有一定区别的,可读性较差,但是这个并不妨碍我们修改程序。程序修改后使用smali重新编译,即可得到修改后的dex文件。

APK反编译/编译步骤

  1. 建立工作目录,例如D:\ApkWork\
  2. 将下载的smali-1.2.4.jar, baksmali-1.2.4.jar存放到工作目录中
  3. 将需要修改的apk也存放到工作目录中
    02
  4. 打开命令提示符(开始->运行->输入cmd然后回车)
  5. 切换当前目录为D:\ApkWork
    03
  6. 输入java -jar baksmali-1.2.4.jar EPST.apk -b -o EPST 然后回车,这条命令就是反编译EPST.apk的代码,并保存到EPST目录下。
    参数说明:
    EPST.apk 需要反编译的apk文件.
    -b smali文件中不生成.line的信息(不指定-b参数的话,smali文件中会包含大量的.line代码)
    -o EPST 表示生成的smali文件保存到EPST目录下(不指定-o 参数的话,smali文件默认会保存到out目录下)。
  7. 修改EPST目录下的smali代码
  8. 输入java -jar smali-1.2.4.jar EPST -o classes.dex 然后回车,这条命令就是编译EPST下的代码然后保存为classes.dex。
    参数说明:
    EPST 需要编译的smali目录
    -o classes.dex 编译后的dex保存为classes.dex,不指定 -o 参数的话,默认保存为out.dex
  9. 把生成的classes.dex替换到epst.apk中,这样我们的epst.apk就完成了反编译/修改/编译的全部步骤,然后我们就可以把epst.apk替换到rom中,然后重新签名rom即可。

仔细阅读上面的准备工作,了解了如何反编译和编译apk后,我们就可以进行下面的修改。

第一部分: 具体修改

修复EPST使##778#可用

修改文件: EPST.apk
修改原理: EPST读取系统的ro.build.type变量,如果该变量的值为user,就限制使用##778#。由于大部分ROM的ro.build.type为user,所以这些ROM的用户均不能使用##778#。我们通过修改EPST.apk,让其本来判断ro.build.type是否是user改为判断ro.build.type是否是nouser(这里这个nouser大家随便写),这样就可以让大家都能使用##778#了。
修改过程:
在反编译后的目录下查找包含"user"的内容,把所有"user" 均改为"nouser"。
在早期rom的epst中,只能找到一个地方,最近的2.2的evo rom中,可以找到3个地方。
例如,新的EVO 2.2 Rom中需要修改以下内容(修改的地方均位于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"

修复*#*#4636#*#*

修改文件: Settings.apk

修改原理: 在EVO 2.2的Rom中,HTC把4636的调用入口删掉了,其实4636的功能还在,只是不能通过输入*#*#4636#*#*调用了,这里我们重新补回调用的代码就可以了。

修改过程:

打开反编译后的文件 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确保国内MEID清零的用户能够正常绑定Google账号

修改文件: GoogleServicesFramework.apk

修改原理: 最近Google在自己的checkin服务中增加了MEID有效性的判断,导致国内很多MEID清0的用户不能正常绑定Google账号,通过修改代码,我们让手动指定一个有效的MEID,即可正常绑定Google账号。

修改过程:

打开反编译后的文件 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"

去除拨号震动

修改文件: HtcDialer.apk

修改原理: HTC拨号器在初始化的过程中,把是否启用按键震动已经写死在代码中, 我们只需要把启用改成不启用即可。

修改过程:

打开反编译后的文件 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

 

 

修复拨号号码自动添加横线

修改文件: HtcDialer.apk ,Phone.apk

修改原理: 由于Hero 200/Evo 4G均为Sprint定制的机器,所以HTC在开发系统的时候没考虑过其他国家用户的感受,在用户输入电话号码和拨打电话号码的时候会自动把电话号码格式化为1-xxx-xxx-xxx这种格式,我们只需要让他不调用格式化电话号码的函数即可。

修改过程:

打开 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