[转]微信零基础美化反编译教程 – 10 – 实例集合

有了以上全部的知识之后,我们可以做的事情就很多了,以下是一些实例,让大家体会一下理论是如何产生于实践并指导更好的实践。

实例 6. 给顶栏增加阴影展开目录

注:

  • 此处使用的是 Android 5.0 以后的新特性,作出这个修改后将导致 4.4 及以下系统打开修改版微信闪退
  • 这个以及下一个实例,只用 MT 管理器做不到,必须要在完全反编译后才可操作

当时我修改的时候的心路历程是:这玩意儿应该在 style 里吧.. 然后直接打开 styles.xml 搜索 @color/z(不知道看到这里还记不记得顶栏的颜色名字叫做 z..),就找到了这个 style:

<style name="j0" parent="@style/ti">
        <item name="android:icon">@drawable/a8</item>
        <item name="android:background">@color/z</item>
        <item name="android:paddingLeft">0.0dip</item>
        <item name="android:paddingRight">0.0dip</item>
        <item name="android:titleTextStyle">@style/MMActionBar.TitleTextStyle</item>
        <item name="android:subtitleTextStyle">@style/MMActionBar.SubTitleTextStyle</item>
        <item name="android:indeterminateProgressStyle">@style/ActionBarCustomProgressBar</item>
        <item name="android:backgroundStacked">@color/z</item>
        <item name="android:backgroundSplit">@color/z</item>
        <item name="m">@style/MMActionBar.TitleTextStyle</item>
        <item name="n">@style/MMActionBar.SubTitleTextStyle</item>
        <item name="o">@drawable/a8</item>
        <item name="r">@color/z</item>
        <item name="s">@color/z</item>
        <item name="t">@color/z</item>
        <item name="x">@style/ActionBarCustomProgressBar</item>
        <item name="a1">0.0dip</item>
        <item name="a2">0.0dip</item>
        <item name="a3">0.0dip</item>
        <item name="a4">0.0dip</item>
        <item name="a5">0.0dip</item>
    </style>

加阴影非常简单,仿照 style 定义的格式,加一行<item name="android:elevation">3.5dip</item> ,随后回编译即可,其中 3.5dip 和阴影的长度成正比,3.5dip 是我个人实践出来比较合理的一个长度

但是有一个地方比较蛋疼,修改后内置浏览器的顶部将会变得比较难看:

实例 7. 水波纹点击效果展开目录

注:和上一个加阴影的修改一样,使用了 Android 5.0 的新特性

这里演示的是为主界面点击聊天添加水波纹效果

  1. 首先丢一个 xml 文件到 res/drawable-v21,具体代码如下
<?xml version="1.0" encoding="utf-8"?>
<ripple android:color="#fff5f5f5"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/mask" android:drawable="@android:color/white" />
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#ffffffff" />
            <corners android:radius="0.0dip" />
        </shape>
    </item>
</ripple>

新建一个记事本复制进去保存为 xml 文件即可,我们这里保存为 ripple.xml

  1. 回编译
  2. 找到需要更改的元素的背景 drawable xml
    1. 通过取色,获得主界面聊天列表按压时的颜色为 D9D9D9
    2. 用上面提到过的方法,在 color 中逐一排除,确定具体是哪一个 color,复制其 ID 并搜索 XML,得到的 color 名为 jl ,ID 为 7F0F017D
    3. 将搜索到的 xml,逐一将 @7F0F017D 用 MT 管理器的搜索替换功能,替换为 #FF000000(黑色) 等非常明显的颜色,反复更改反复重启测试主界面聊天列表按压是否变成黑色,若是则该 xml 为定义主界面按压的 xml,应为 ec.xml
  3. 在 MT 管理器 resources.arsc 中找到这个文件,并更改它的路径为我们塞进去的 ripple.xml 的路径:

这样就完成了一个重定向的操作,把原本的背景替换成了我们塞进去的 ripple,实现了水波纹效果,值得一提的是,ec.xml 是主界面普通聊天条目的背景,eb.xml 是主界面置顶条目的背景,也需要对它进行类似的操作,只是需要把 ripple.xml 改动一下塞一个新的 xml 进去,具体请看下面的介绍

并且类似的,其他的元素如果要实现水波纹点击效果,也只需要找到背景调用的 drawable xml,然后用这个方法重定向到我们自己塞进去的 xml 即可,在这里我对 ripple.xml 进行一下说明:

ripple.xml展开目录

<?xml version="1.0" encoding="utf-8"?>
<ripple android:color="#fff5f5f5"  这一个颜色决定了水波纹的颜色
  xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/mask" 
          android:drawable="@android:color/white"这个颜色没有用 />
    <item>
        <shape android:shape="rectangle"> 这里是定义元素没有被按压的时候,显示的内容,这里我是定义了一个矩形
            <solid android:color="#ffffffff" /> 这是矩形的颜色
            <corners android:radius="0.0dip" /> 这是定义圆角的长度,越大角越圆,在为一些按钮添加水波纹效果的时候可以把 0.0dip 改为 2.0dip
        </shape>
    </item>
</ripple>

实例 8. 去掉游戏、购物入口展开目录

通过字符定位 (搜索游戏这个字符串),可以定位到这样一个 xml 文件,我们可以在其中发现一个字符串:
more_tab_game_recommend,今后我们要定位这个 xml 文件只需要搜索这一个字符串即可

r/e/am.xml (res/xml/am.xml)

我把具体操作写在了代码中间

<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res-auto">
    <PreferenceSmallCategory />
    <com.tencent.mm.ui.friend.FriendSnsPreference
        android:title="@7F0812E5"
        android:key="album_dyna_photo_ui_title" />
    <PreferenceSmallCategory />
    <NormalIconPreference
        android:title="@7F08088B"
        android:icon="@7F070193"
        android:key="find_friends_by_qrcode" />
    <NormalIconPreference
        android:title="@7F08126A"
        android:icon="@7F070194"
        android:key="find_friends_by_shake" />
    <PreferenceSmallCategory />
    <NormalIconPreference
        android:title="@7F080D62"
        android:icon="@7F070190"
        android:key="find_friends_by_near" />
    <NormalIconPreference
        android:title="@7F080341"
        android:icon="@7F07018D"
        android:key="voice_bottle" />
    <PreferenceSmallCategory />
    <NormalIconPreference android:key="jd_market_entrance" />

    这一段被我独立出来
    <NormalIconPreference
        android:title="@7F0809DC"
        android:icon="@7F070357"
        android:key="more_tab_game_recommend" />
    是因为它的 key 叫做 more_tab_game_recommend,显然是我们需要去掉的游戏入口的定义,直接删掉这一段,游戏入口就被去掉了

    <NormalIconPreference
        android:title="@7F0806F9"
        android:icon="@7F07018C"
        android:key="settings_emoji_store" />
    <PreferenceSmallCategory />
    <NormalIconPreference
        android:title="@7F0800D0"
        android:icon="@7F02078A"
        android:key="app_brand_entrance" />
    <PreferenceSmallCategory />
    <NormalIconPreference
        android:title="@7F080ACB"
        android:icon="@7F07018E"
        android:key="ip_call_entrance" />
</PreferenceScreen>

细心的朋友肯定发现了,我在代码中间标识出来的游戏入口的上方还有一行:<NormalIconPreference android:key="jd_market_entrance" />,显然是用于定义购物入口的,但是这里除了删掉这一行以外,我们还需要改动 Java,否则会闪退,具体操作如下:

  1. 使用「Dex 编辑器」方式打开 classes.dex
  2. 使用「字符串」搜索「jd_market」
  3. 我们会得到两个结果,接下来的操作看图
  4. 我们在最顶上一行加上 return-void ,返回保存即可

实例 9. 给底栏图标更换颜色展开目录

实际上我是不想仅仅只是这么做的.. 但是在我解决图片模糊的问题之前先把这个方案暂时放在这里..

在 resources.arsc > raw > raw 中过滤 navbar,以 navbar 开头的条目便是底栏所有用到的 svg 矢量图,我们复制它们的 ID,在 classes.dex 中搜索,这里我以 navbar_addresslist_icon_focus为例,顾名思义,这是页面焦点在通讯录上时底栏显示的图标

在 classes.dex 中按「十六进制」搜索 ID:

搜索之后就得到了我之前提到的 SVGPreload 这个类 (微信之后的版本,SVGPreload 的路径不同于教程成文时,但搜索仍然可以得到它的路径,故影响不大),我们打开 SVGPreload 后选择「反编译」,在里面再次搜索 ID:

可以发现后面有一个 new vt(),而在这个类的开头看到了大量的 import

于是我们可以判断,真正的 svg 代码应该在这个 com.tencent.mm.svg.a.a 中,而每一个 ID

后面对应的 new xx()xx 就是其中对应的类名,我们在 classes.dex 中找到 com.tencent.svg.a.a,发现其中果然有一个叫做 vt 的类:

点击后我们进入方法列表,点击 j 这个方法:

此时我们搜索 color,一般来说会有两个 (或者四个) 匹配的结果:

其中,上方的 -0x100 我们可以忽略,下面的 -0xba3fe6 才是我们真正需要更改的颜色代码,我们注意这个颜色代码前方有一个负号,所以它是反色代码,也就是说我们要把我们真正想替换成的颜色,转换成反色的代码,再将 -0xba3fe6 修改成反色代码,才可以完成修改

我们可以使用类似在线调色板之类的网站,把自己需要的颜色代码转换成 RGB 颜色代码,再把 R G B 三项的数值都用 255 减去后再填入,转换得到反色的 16 进制颜色代码,比如:

获得反色代码

实例 10. 更改气泡文字颜色展开目录

这里以更改自己气泡文字的颜色为例:

  1. 用「开发者助手」获得自己气泡的 ID,7F100151
  2. 搜索 XML
  3. 打开搜索到的其中一个 xml,在 xml 中再次搜索 7F100151,在这个 ID 所在的段落加入一行:android:textColor="#FFFFFFFF" (比如我这里使用白色)
  4. 逐一排查,最终使得自己气泡颜色发生改变的 xml 就是我们需要找的 xml,为 hd.xml

实例 11. 更改未读小点颜色展开目录

通过之前对底栏布局文件的分析,我们偶然看到了 UnreadCountTipsStyle 以及 UnreadDotStyle,查找 style 中的这两个 style,很容易就可以定位到 k 文件夹 (drawable 文件夹) 下的 oy.xml 和 p0.xml 这两个 drawable xml,将其中的
<solid android:color="@这里是ID" />
后面的 ID 改为 #FF00ACC1 之类的你需要的颜色代码即可

文 / anson
LEAVE A REPLY
loading