Android反编译:手把手教你制作高德地图车机共存版

Android反编译:手把手教你制作高德地图车机共存版

  • 前言
  • 前期准备
  • 反编译流程
    • 反编译获取有效信息
    • 修改关键信息
      • 修改包名
      • 修改其它配置
    • 生成APK
      • 重新打包成apk
      • 重新签名
    • 绕过校验机制
      • 定位启动界面
      • 定位校验逻辑
      • 修改校验逻辑
      • 资源修改
  • 最终效果

Android反编译:手把手教你制作高德地图车机共存版_第1张图片

前言

去年年底提了新车,这车什么都好就是自带的高德地图版本太低了,在高德地图已经进入6.x的时代,车机上自带的才4.x,更重要的是不支持升级,从高德官网下载的车机版安装提示签名不同,覆盖安装又没有权限,就很难受,好在高德官方论坛里面有很多大佬都有提供共存版本,非常好用。

但是,作为一个Android开发人员,怎能如此没有追求,当然得自己造一个出来啊。

前期准备

首先需要感谢的是高德地图的APK没有进行加固,这大大减轻了我们反编译的工作量,为此我们需要以下工具:

  1. apktools.jar 用于对apk进行反编译及重新打包 官方地址

  2. dex2jar 用于将apk中的dex文件转换为可读的jar格式 下载地址

  3. jd-gui 用于查看反编译出来的源码信息的图像化工具 下载地址

由于部分网站可能被墙无法访问,可以选择从我打包好的云盘下载

当然,最后还不能忘了下载 高德地图车机版

最终环境结构如下:

Android反编译:手把手教你制作高德地图车机共存版_第2张图片

反编译流程

反编译获取有效信息

首先第一步就是通过 apktools.jar 工具对官方的apk进行解包;

# 通过 apktools.jar 进行解包
$ java -jar .\apktool_2.6.0.jar d .\AUTO_V6.1.0.600644_release_signed.apk

命令执行后会在当前路径生成一个 AUTO_V6.1.0.600644_release_signed 文件夹,这里面就是apk解包之后的内容,我们后续的修改也是基于这个文件夹

接着将 AUTO_V6.1.0.600644_release_signed.apk 当作压缩文件打开,将其中的 classes.dex 文件解压到当前路径,并通过 dex2jardex 文件转换为 jar 文件

# 将 dex 转换为 jar
$ .\dex2jar-2.0\d2j-dex2jar.bat .\classes.dex

命令执行后会在当前路径生成 classes-dex2jar.jar 文件

修改关键信息

修改包名

要做共存版,最重要的当然是修改应用包名了,打开 .\AUTO_V6.1.0.600644_release_signed\AndroidManifest.xml,第一行里面 package 属性就是包名,改为你自己的包名,注意不要和其它应用重复即可,我这边是在后面加上了.coexist修改为com.autonavi.amapauto.coexist

包名

修改其它配置

仅修改包名并没有结束,除此之外,我们还需要将 AndroidManifest.xml 文件中的所有涉及到权限及内容提供者的原 com.autonavi.amapauto 修改为 com.autonavi.amapauto.coexist

权限

内容提供者

生成APK

重新打包成apk

在对解包后的数据进行修改之后,我们可以再通过 apktools.jar 将文件夹重新打包为 apk

# 重新打包为apk
$ java -jar .\apktool_2.6.0.jar b .\AUTO_V6.1.0.600644_release_signed -o .\AUTO_V6.1.0.600644_coexist_unsigned.apk

执行后会在当前路径生成 AUTO_V6.1.0.600644_coexist_unsigned.apk,这个时候的apk是没有签名的,无法进行安装使用。

重新签名

对于没有签名的apk,可以通过jarsigner -verbose -keystore 【签名文件】-storepass 【签名密码】 -signedjar 【输出APK】 【未签名APK】 【签名别名】进行签名

# 重新签名
$ jarsigner -verbose -keystore .\wj_android.jks -storepass xxxxxx -signedjar .\AUTO_V6.1.0.600644_coexist_signed.apk .\AUTO_V6.1.0.600644_coexist_unsigned.apk xxxxxx

签名完成会在当前路径生成 AUTO_V6.1.0.600644_coexist_signed.apk,这个apk就可以直接进行安装使用了

绕过校验机制

在安装完上面的apk打开后,你会发现根本无法使用,会提示应用出现异常错误

Android反编译:手把手教你制作高德地图车机共存版_第3张图片

这个是高德地图启动的时候做了签名相关的校验,我们修改了包名及签名,所以无法通过校验

定位启动界面

定位启动界面其实很简单,还是打开之前的 AndroidManifest.xml 文件,在其中搜索 android.intent.category.LAUNCHER,其所在 Activity 就是启动界面

启动页

然后我们就可以按照这个包路径,在之前界面的文件夹里面找到对应的源文件了,解包出来的代码是smali格式的

Android反编译:手把手教你制作高德地图车机共存版_第4张图片

一个简单的类被拆成了这么多,并且对应smali代码我们也不熟悉,更重要的是smali中的中文都被编码了,排查起来更加困难,这个时候我们前面转换出来的 classes-dex2jar.jar 文件就派上了用场

定位校验逻辑

打开 jd-gui 并将classes-dex2jar.jar 拖拽到窗口里,我们很快找到启动 Activity 的代码

Android反编译:手把手教你制作高德地图车机共存版_第5张图片

在这里我们可以直接搜索错误信息文本

Android反编译:手把手教你制作高德地图车机共存版_第6张图片

我们找到方法 g() 的调用地点

Android反编译:手把手教你制作高德地图车机共存版_第7张图片

根据上面的代码,我们能简单的推断,方法 i() 就是跳转进入导航界面

Android反编译:手把手教你制作高德地图车机共存版_第8张图片

由此可知关键代码 p90.d(vd.w().e()) 如果返回为 false 则会直接打开地图,否则就会提示异常

校验代码

这里我们在回调解包出来的 smali 代码里,找到 p90 这个文件,找到 d(Context) 这个方法

Android反编译:手把手教你制作高德地图车机共存版_第9张图片

修改校验逻辑

smali 语法和 Java 还是有很大差别的,但是我们不需要精通,对应这个校验方法看上去很复杂,但是我们的需求只不过是让这个方法返回 true 即可,因此修改如下:

Android反编译:手把手教你制作高德地图车机共存版_第10张图片

修改之后再按照上面 打包APK 的步骤重新打包就能正常使用了。

资源修改

如果你想要给APP修改为不同的名称,不同的图标甚至是替换内部的图片,这些就都很简单了,只需要找到对应的图片、文本资源,直接进行替换就可以了,不需要像修改包名那么复杂

最终效果

来看下安装的最终效果吧

Android反编译:手把手教你制作高德地图车机共存版_第11张图片

作者: WangJie0822
链接: http://www.wangjie0822.top/posts/5569bb54
来源: WangJie0822
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

你可能感兴趣的:(Android开发,android)