
去年年底提了新车,这车什么都好就是自带的高德地图版本太低了,在高德地图已经进入6.x的时代,车机上自带的才4.x,更重要的是不支持升级,从高德官网下载的车机版安装提示签名不同,覆盖安装又没有权限,就很难受,好在高德官方论坛里面有很多大佬都有提供共存版本,非常好用。
但是,作为一个Android开发人员,怎能如此没有追求,当然得自己造一个出来啊。
首先需要感谢的是高德地图的APK没有进行加固,这大大减轻了我们反编译的工作量,为此我们需要以下工具:
apktools.jar 用于对apk进行反编译及重新打包 官方地址
dex2jar 用于将apk中的dex文件转换为可读的jar格式 下载地址
jd-gui 用于查看反编译出来的源码信息的图像化工具 下载地址
由于部分网站可能被墙无法访问,可以选择从我打包好的云盘下载
当然,最后还不能忘了下载 高德地图车机版
最终环境结构如下:

首先第一步就是通过 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 文件解压到当前路径,并通过 dex2jar 将 dex 文件转换为 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


在对解包后的数据进行修改之后,我们可以再通过 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打开后,你会发现根本无法使用,会提示应用出现异常错误

这个是高德地图启动的时候做了签名相关的校验,我们修改了包名及签名,所以无法通过校验
定位启动界面其实很简单,还是打开之前的 AndroidManifest.xml 文件,在其中搜索 android.intent.category.LAUNCHER,其所在 Activity 就是启动界面

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

一个简单的类被拆成了这么多,并且对应smali代码我们也不熟悉,更重要的是smali中的中文都被编码了,排查起来更加困难,这个时候我们前面转换出来的 classes-dex2jar.jar 文件就派上了用场
打开 jd-gui 并将classes-dex2jar.jar 拖拽到窗口里,我们很快找到启动 Activity 的代码

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

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

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

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

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

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

修改之后再按照上面 打包APK 的步骤重新打包就能正常使用了。
如果你想要给APP修改为不同的名称,不同的图标甚至是替换内部的图片,这些就都很简单了,只需要找到对应的图片、文本资源,直接进行替换就可以了,不需要像修改包名那么复杂
来看下安装的最终效果吧

文章作者: WangJie0822
文章链接: http://www.wangjie0822.top/posts/5569bb54
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 WangJie0822!
Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u
动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、
最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路
如何只加载map边界内的标记gmaps4rails?当然,在平移和/或缩放后加载新的。与此直接相关的是,如何获取map的当前边界和缩放级别? 最佳答案 我是这样做的,我只在用户完成平移或缩放后替换标记,如果您需要不同的行为,请使用不同的事件监听器:在你看来(index.html.erb):{"zoom"=>15,"auto_adjust"=>false,"detect_location"=>true,"center_on_user"=>true}},false,true)%>在View的底部添加:functiongmaps4rail
技术选型1,前端小程序原生MINA框架cssJavaScriptWxml2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序云开发云函数云开发数据库(基于MongoDB)云存储4,人脸识别算法基于百度智能云实现人脸识别一,用户端效果图预览老规矩我们先来看效果图,如果效果图符合你的需求,就继续往下看,如果不符合你的需求,可以跳过。1-1,登录注册页可以看到登录页有注册入口,注册页如下我们的注册,需要管理员审核,审核通过后才可以正常登录使用小程序1-2,个人中心页登录成功以后,我们会进入个人中心页我们在个人中心页可以注册人脸,因为我们做人脸识别签到,需要先注册人脸才可以进行人脸比对,进
我有一个关于多维数组的初学者ruby问题。我想按年份和月份对条目进行排序。所以我想创建一个包含年->月->月条目的多维数组所以数组应该是这样的:2009->08->Entry1->Entry209->Entry32007->10->Entry5现在我有:@years=[]@entries.eachdo|entry|timeobj=Time.parse(entry.created_at.to_s)year=timeobj.strftime("%Y").to_imonth=timeobj.strftime("%m").to_itmparr=[]tmparrentry}@years.pu
问题总结我想尝试使用Ruby来完成我在Python中所做的事情。在Python中它有r"""syntaxtosupportrawstrings,这很好,因为它允许将原始字符串与代码内联,并以更自然的方式连接它们,而无需特殊缩进。在Ruby中,当使用原始字符串时,必须使用其次是EOT在单独的行中,这会破坏代码布局。你可能会问,为什么不使用Ruby的%q{}?嗯,因为%q{}与Python的r"""相比有局限性因为它不会转义多个\\\并且只处理单个\.我正在动态生成Latex代码并写入一个文件,该文件稍后用pdflatex编译。Latex代码包含类似\\\的内容在许多地方。如果我使用Rub
我正在使用Ruby1.8。似乎downcase不会改变非拉丁字符。例如:"Δ".downcase返回“Δ”我知道在Ruby1.9.1及更高版本中,我可以使用UnicodeUtils(fromhere)。我试过了,它工作正常。返回上一个示例的"δ"。是否有适用于1.8Ruby的等效(或任何)解决方案? 最佳答案 nash@nash:~$ruby-vruby1.8.7(2011-02-18patchlevel334)[i686-linux]gem安装unicode(https://rubygems.org/gems/unicode)re
我正在使用Ruby制作一个命令行工具。它将在屏幕上打印大量文本。目前,我正在使用shell管道(may_app|more)来执行此操作。但我认为最好有一个默认的寻呼机。就像你在执行gitlog时看到的一样。可以使用git--nopagerlog禁用寻呼机。我已经完成了大量的谷歌工作并找到了一颗gem:hirb,但似乎有点矫枉过正。经过多次尝试,我目前正在使用shellwrapper来这样做:#!/bin/bash#xray.rbisthecorescript#doingthemainlogicandwill#outputmanyrowsoftexton#screenXRAY=$HOME
我想知道如何在shell中创建“全屏”窗口的外观,如在vim、emacs等中。是否可以在Ruby中以编程方式执行此操作?这对平台的依赖程度如何?编辑:我不是在寻找如何让我的shell进入全屏模式。我正在寻找一种方法来隐藏以前输入的命令并用应用程序“填充”shell屏幕。它适用于安装程序。 最佳答案 您可能正在寻找的是ncurses或S-Lang支持提供你的全TUI经验。Ruby的gem环境提供了几个可能值得探索的gem:$gemlist--remote|grep-icursescursesx(003)ffi-ncurses(0.4.