Android反编译odex然后重新打包


最近不知道怎么回事,突然把我那刷了氧OS的root了,然后就开始好奇起来氢OS所带有的那些本地化的东西,比如通话录音就是典型的一个之一。其中也做了很多的尝试,XDA上有人说把/system/build.prop里面的"persist.sys.oem.region"的值改成“CN”,我尝试了一下确实可以,但是有的APP出现了崩溃卡死的问题,我发现改了后设置里面系统版本变成了氢OS,然后三大金刚键都变成了又返回在右边了,短信默认的都出现了氢的卡片效果,电话设置里面也有了通话录音,一切都成了氢OS的样子,但是副作用是好多的第三方APP出新了不能运行崩溃等各种问题。

于是又把build.prop改成了原本的样子,然后开始了反编译的探索之旅,于是就有了这篇博客,好多中文的博客写的都过时了,真的是好几天各种挖坑填坑爬坑的结果。本文的反编译是在Android7.1.1环境下在mac操作系统下操作的

好了废话说完了,一些概念诸如为什么有odex,odex之于apk里面的dex,下面开始正文


修改这种系统预装的app然后再打包理论上需要经过以下步骤

odex -> smali files -> dex -> jar -> modify smali files -> dex -> apk(包括class.dex的apk)

一开始我就是按照这个步骤来的,因为odex依赖的系统版本比较高,好多中文博客介绍的都是过时的工具,导致中间遇到了太多太多的坑。因为我弄的这个apk是控制电话接通后的童话的那个逻辑的,所以每次弄好了还要把apk复制到手机里面,然后再复制到/system/priv-app里面,然后改权限,还要保存之前的备份等的东西然后再重启手机,再拨打电话尝试,所以操作步骤极其繁琐。应该有更好的方法,只不过目前还懒的去发现。

  1. odex -> smali files: 这一步是使用的smali工具,我用的是baksmali-2.2.1.jar,其基本的命令为
java -jar baksmali-2.2.1.jar deodex OPInCallUI.odex -b ./framework/arm64/boot.oat -o OPInCallUI
deodex参数,指定要操作的文件名为“OPInCallUI.odex”
-b参数,指定bootclasspath,也就是要把手机rom的/system/framework里面的文件直接拷贝到电脑上的当前工作目录
-o参数,指定输出的smali文件的目录
  1. smali files -> dex: 这一步用的还是smali工具,不过jar文件变了,为smali-2.2.1.jar,使用的基本命令为
java -jar smali-2.2.1.jar assemble OPInCallUI -o classes_o.dex
assemble参数,指定smali files的文件夹所在
-o参数,指定输出的文件名为“classes_o.dex”
  1. dex -> jar: 这一步用的是dex2jar工具,使用的基本命令为
./dex2jar-2.0/d2j-dex2jar.sh classes_o.dex -o classes_o.jar
意思是把“classes_o.dex”转成“classes_o.jar”
  1. modify smali files: 这一步使用的工具主要会有不同,但是JD-GUI是少不了的,它能直接查看jar里面的class文件所对应的源代码,有了源码,看一些逻辑就方便了太多了啊。

    jclasslib是查看java字节码的一个工具。其实这个地方基本用不到看java的字节码,而主要看smali(即Dalvik opcodes)文件 。

    smali文件用普通的文本编辑器查看修改就可以了,但是需要先了解一下基本的语句,这是对照表。其实第2和第3步的主要目的就是看java的源码,帮助更好的理解,如果你感觉看smali跟看java是一样的,那就可以省略2和3步了
  2. modify smali files -> dex: 这一步是使用的还是smali工具,不过要用smali-2.2.1.jar,其基本的命令为
java -jar smali-2.2.1.jar assemble OPInCallUI -o classes.dex
  1. dex -> apk(包括class.dex的apk): 把第五步生成的classes.dex用压缩工具放在在手机"/system/priv-app/OPIncallUI"提取的OPInCallUI.apk里。这里我比较推荐BetterZip,可以去编辑压缩文件,制作压缩文件的时候还可以排除.DS_Store的影响。
  2. 把修改后的apk放回到"/system/priv-app/"里面,重启手机测试一下吧

注意:

  1. boot.oat依赖的时候要拷贝全面,要不然就会报错

Error occurred while loading class path files. Aborting.

org.jf.dexlib2.analysis.ClassPathResolver$ResolveException: Error while loading oat file ./boot.oat

具体的有篇文章,介绍了boot.oat和boot.art等的关系。初探boot.art与boot.oat

  1. 减少中间环节,我查过各种资料后总结出来流程应该是这个样子的
odex -> smali files -> dex -> jar -> modify jar -> dex -> apk(包括class.dex的apk)

后来发现这个坑实在是太深了,有的时候用低版本的baksmali的时候就会报大量的错误

org.jf.dexlib2.analysis.AnalysisException: Could not resolve the method in class Ljava/lang/reflect/Method;

以此顺延下去,肯定打包的程序不能运行了。

然后步骤多了出错的地方就更多了,定位起问题来就更麻烦了。

  1. 安利一个Google的工具吧android-classyshark,用来查看apk的包资源,类方法名等的工具,简直利器。再加一个插件intellij-java2smali,很方便的把java转成smali查看

其实这次反编译的初衷来源于想让我的一加3T手机的氧OS能够像氢一样拥有通话录音的功能。然后经历的种种,还受oos-call-recording项目的影响,还问了厚脸皮的问了作者原理。现在我也自建了一个项目,会上传我微改的系统的APP,使氧OS的系统APP拥有氢OS的功能,而又不失去氧OS更新快的特点。项目的地址为https://github.com/ysk666666/OxygenOS-SystemAppModified

Android反编译odex然后重新打包的更多相关文章

  1. android反编译odex文件

    关于android的反编译工具,相信大家并不陌生 如APK-TOOL,dex2jar APK-TOOL 用于反编译出布局文件 下载地址http://code.google.com/p/android- ...

  2. Android反编译apk并重新打包签名(Mac环境)

    工具下载 apktool :https://ibotpeaches.github.io/Apktool/install dex2jar:https://github.com/pxb1988/dex2j ...

  3. Android反编译和二次打包

    参考:APK反编译 一.工具介绍: 1.解压工具 2.JDK 3.apktool: aapt.exe,apktool.bat,apktool.jar;三个在同一目录结合使用,用来反编译apk,反编译生 ...

  4. android 反编译(dex 和 odex),非脑残转帖,绝对可靠

    Android 反编译 反编译odex文件(比如framework.odex),若是反编译dex,直接第4步 1.因为反编译odex的工具在D:\Develop tools\android反编译工具\ ...

  5. Android反编译(三)之重签名

    Android反编译(三) 之重签名 [目录] 1.原理 2.工具与准备工作 3.操作步骤 4.装X技巧 5.问题 1.原理 1).APK签名的要点 a.所有的应用程序都必须有数字证书 ,Androi ...

  6. Android反编译(二)之反编译XML资源文件

    Android反编译(二) 之反编译XML资源文件 [目录] 1.工具 2.反编译步骤 3.重新编译APK 4.实例 5.装X技巧 6.学习总结 1.工具 1).反编译工具  apktool http ...

  7. Android反编译工具的使用-Android Killer

    今天百度搜索“Android反编译”搜索出来的结果大多数都是比较传统的教程.刚接触反编译的时候,我也是从这些教程慢慢学起的.在后来的学习过程中,我接触到比较方便操作的Android反编译.在这,我将使 ...

  8. Android 反编译apk 详解

    测试环境: win 7 使用工具: CSDN上下载地址: apktool (资源文件获取)  下载          dex2jar(源码文件获取) 下载        jd-gui  (源码查看)  ...

  9. Android反编译教程

    本文摘自 http://blog.csdn.net/ithomer/article/details/6727581 本文Android反编译教程,测试环境: Win7 Ultimate x64 Ubu ...

随机推荐

  1. 小tips:用java模拟小球做抛物线运动

    这几天刚刚学习了java线程,然后跟着书做了几个关于线程的练习,其中有一个练习题是小球动起来.这个相信很简单,只要运用线程就轻松能够实现.然后看到了它的一个课后思考题,怎样让小球做个抛物线运动,这点我 ...

  2. React 读书笔记

    序言: 领导安排部门同事本月内看一本跟自己职业相关的书籍, 根基类的书籍已经看过了,重复阅读的意义不大,所以我平时看的都是视频,也许是视频作者没有出书的条件,也许是现在出书看的人越来越少了,也许有其他 ...

  3. Zepto源码分析-form模块

    源码注释 // Zepto.js // (c) 2010-2015 Thomas Fuchs // Zepto.js may be freely distributed under the MIT l ...

  4. 一天搞定CSS:支持IE的Layout布局--16

    1.BFC和Layout区别: BFC和Layout的作用是一样的,只是对浏览器的支持不同而已. BFC- -标准浏览器所具有的 Layout- -IE浏览器所具有的 BFC详解地址:http://b ...

  5. Java阶段性测试--第四五六大题参考代码

    第四题:.此题要求用IO流完成 使用File类在D盘下创建目录myFiles, 并在myFiles目录下创建三个文件分别为:info1.txt, info2.txt, info3.txt . 代码: ...

  6. python requests get/post

    基本Get请求: #-*- coding:utf-8 -*- import requests url = 'http://www.baidu.com' r = requests.get(url) pr ...

  7. 动态添加Redis密码认证

    如果redis已在线上业务使用中,但没有添加密码认证,那么如何在不影响业务服务的前提下给redis添加密码认证,就是一个需要仔细考虑的问题. 本文描述一种可行的方案,适用于客户端使用了jedis连接池 ...

  8. 按钮开关demo

    源码如下: <style> .container{ margin: 0px;padding: 100px 250px;} .switch-test{ -webkit-appearance: ...

  9. maven无法加载本地jar包以及maven项目打包后本地jar包没有打进项目的问题解决办法

    1.首先设置依赖项,这样maven就会把该路径下的jar包导入项目引用 <dependency> <groupId>DPSDK-Manager</groupId> ...

  10. C#开发移动应用系列(2.使用WebView搭建WebApp应用)

    前言 上篇文章地址:C#开发移动应用系列(1.环境搭建) 嗯..一周了 本来打算2天一更的 - - ,结果 出差了..请各位原谅.. 今天我们来讲一下使用WebView搭建WebApp应用. 说明一下 ...