本帖最后由 烈火 于 2015-1-22 22:54 编辑
今天有个孩纸弱弱的问我:不联网的情况下,能否把老黄历3.66在启动时显示的“网络不可用, 请保持您的网络畅通”这种烦人的提示去掉。我当时一看,这不是吃饱没事干蛋疼的吗?!心下,对这种小CASE的修改(当然我也改不了啥太大的CASE)非常的那啥!若在平时就直接拒绝了,转念一想,虽然不是大神,在新手的眼里,也是光辉灿烂,这样做有点残忍,毕竟我的一些小小成就也是因为看了大神们的教程学来的,反正今天无事,分分钟折腾的事儿。。。
反编译APK粗来,用 NOTEPAD++ 先搜索整个 res\ 目录 ASCII 字符串“网络不可用”,在 \res\values-zh-rCN\strings.xml 找到如下一行
<string name="alc_lbs_status_net_err">网络不可用, 请保持您的网络畅通</string>
继续在 smali\ 整个目录搜索字符串“alc_lbs_status_net_err”,全部结果如下:
Search "alc_lbs_status_net_err" (9 hits in 8 files)
H:\老黄历_3.6.6_build366\res\values\strings.xml (1 hit)
Line 84: <string name="alc_lbs_status_net_err">網路不可用, 請保持您的網路暢通</string>
H:\老黄历_3.6.6_build366\res\values\public.xml (1 hit)
Line 2415: <public type="string" name="alc_lbs_status_net_err" id="0x7f0e004f" />
H:\老黄历_3.6.6_build366\res\values-zh-rCN\strings.xml (1 hit)
Line 67: <string name="alc_lbs_status_net_err">网络不可用, 请保持您的网络畅通</string>
H:\老黄历_3.6.6_build366\res\values-en\strings.xml (1 hit)
Line 28: <string name="alc_lbs_status_net_err">The network is not available.</string>
H:\老黄历_3.6.6_build366\smali\oms\mmc\almanac\R$string.smali (1 hit)
Line 164: .field public static final alc_lbs_status_net_err:I = 0x7f0e004f
H:\老黄历_3.6.6_build366\smali\oms\mmc\app\almanac\R$string.smali (1 hit)
Line 162: .field public static final alc_lbs_status_net_err:I = 0x7f0e004f
H:\老黄历_3.6.6_build366\smali\oms\mmc\app\almanac\ui\b\a.smali (2 hits)
Line 243: sget v1, Loms/mmc/app/almanac/R$string;->alc_lbs_status_net_err:I
Line 261: sget v1, Loms/mmc/app/almanac/R$string;->alc_lbs_status_net_err:I
H:\老黄历_3.6.6_build366\smali\oms\mmc\fortunetelling\gmpay\almanac_vip\R$string.smali (1 hit)
Line 164: .field public static final alc_lbs_status_net_err:I = 0x7f0e004f
忽略其它,单看这段
H:\老黄历_3.6.6_build366\smali\oms\mmc\app\almanac\ui\b\a.smali (2 hits)
Line 243: sget v1, Loms/mmc/app/almanac/R$string;->alc_lbs_status_net_err:I
Line 261: sget v1, Loms/mmc/app/almanac/R$string;->alc_lbs_status_net_err:I
双击打开,直达243行,如图:
一共两处,大家看到第一处,即 251 行行首的#号了吗,对,这是我加的,我们先注释掉这一行,本次修改就应该搞定收工了!
反编译下看吧,关掉手机 WiFi,安装重新编译好的 APK,然后运行,喜滋滋等待结果……
结果,刚运行到启动导航页显示完毕,进入主界面前,程序就闪退(FC)了。我擦…… 我忘了逆向的规矩:修改前,先什么也不改,重新编译一下,看看是否正确运行或 FC……
好吧按规矩什么也不改,重新编译,安装,运行,果然,带了自校验了——运行就自动退出。
放个大招,ddms 看看 logcat!(这部分是咋回事需要你另外寻找大神的教程)再次运行程序,FC 退出后,果然在一堆繁杂的信息中,找看到了熟悉的语句:
一般遇上自校验,人们往往会想到去搜索 /pm/sign....,当然这确实是一种重要的方法…… 不过因为我看到了 未捕获异常 这个词,那么我就先搜索一下看看它是怎么处理异常退出的。
搜索整个 smali目录,在 smali\oms\mmc\app\b\b.smali 中找到它。如下:
# virtual methods
.method public uncaughtException(Ljava/lang/Thread;Ljava/lang/Throwable;)V
.locals 1
invoke-direct {p0, p2}, Loms/mmc/app/b/b;->a(Ljava/lang/Throwable;)Z
move-result v0
if-nez v0, :cond_0
iget-object v0, p0, Loms/mmc/app/b/b;->b:Ljava/lang/Thread$UncaughtExceptionHandler;
if-eqz v0, :cond_0
iget-object v0, p0, Loms/mmc/app/b/b;->b:Ljava/lang/Thread$UncaughtExceptionHandler;
invoke-interface {v0, p1, p2}, Ljava/lang/Thread$UncaughtExceptionHandler;->uncaughtException(Ljava/lang/Thread;Ljava/lang/Throwable;)V
:goto_0
return-void
:cond_0
sget-boolean v0, Loms/mmc/c/e;->a:Z
if-eqz v0, :cond_1
iget-object v0, p0, Loms/mmc/app/b/b;->b:Ljava/lang/Thread$UncaughtExceptionHandler;
invoke-interface {v0, p1, p2}, Ljava/lang/Thread$UncaughtExceptionHandler;->uncaughtException(Ljava/lang/Thread;Ljava/lang/Throwable;)V
goto :goto_0
:cond_1
iget-object v0, p0, Loms/mmc/app/b/b;->c:Landroid/content/Context;
invoke-static {v0}, Lcom/umeng/analytics/b;->d(Landroid/content/Context;)V
invoke-static {}, Landroid/os/Process;->myPid()I
move-result v0
invoke-static {v0}, Landroid/os/Process;->killProcess(I)V
goto :goto_0
.end method
嗯,没错,看到 killProcess了。跳楼自杀一般都用它。那就把整个方法删空看看是否还 FC 吧!万一不成,再去找 /pm/sign... 也不迟。
修改后的方法如下:
# virtual methods
.method public uncaughtException(Ljava/lang/Thread;Ljava/lang/Throwable;)V
.locals 0
return-void
.end method
编译好 APK 后,卸载之前的安装,关闭 WiFi,安装修改后的APK,运行,不闪退,不提示“网络不可用, 请保持您的网络畅通”。
现在,可任意修改而不再闪退了。本文结束。
|