我也面临相同的问题,但目前还没找到类似反编译smali文件的方法,一般得到dex文件只需要用WinRAR或其他压缩软件打开apk文件就能得到。但也有例外好像,技术先进了,今天遇到个apk用WinRAR打开异常,没有dex文件,所以得到源代码的计划就泡影了,至少用目前常规的方法无法得到,还在学习中。如果真需要修改源代码的话,没有dex的情况下只能从smali文件着手了,参考下面这位仁兄的做法吧,应该有用。~共同学习

这篇文章是针对Android系统的产品而言(而不是只针对原道产品),不过,我只有一台N5p那就发这儿了(貌视坛子里没有技术区)。如果是打酱油的高手路过,请继续去打酱油,当然也欢迎围观。vivi_an首发imp3.net,转载请注明出处。

  主要目标:对于没有SD卡但想要安装运行那些只有SD卡支持的apk程序的(比如仙剑)。

  次要目标:apk程序反编译、汉化、修改程序的数据读取和保存路径。

  本文针对“思维导图 Thinking Space Pro 2.16”的apk程序ThinkingSpacePro.apk进行修改。题外话,这程序人手配备一个,不错的东西。

一、相关工具(针对windows系统)

  • JDK:http://www.oracle.com/technetwork/java/javase/downloads/index.html 
    下载windows安装版的程序,安装后不用管它了。
  • Apktool:http://code.google.com/p/android-apktool/
    下载apktool-install-windows-2.2_r01-3.tar.bz2和apktool1.3.2.tar.bz2,用winrar解压后把解压出来的文件都放在一个目录下,比如:E:/apktool/ 下(为简单起见,下文都用这个路径为apktool工作目录)。
  • Auto-Sign签名工具:N/A

二、反编译

  说要把apk“装冰箱(反编译)”分三步走:

  • 第一步:先把apk程序(这里用ThinkingSpacePro.apk)程序放到 E:/apktool/ 下。
  • 第二步:启动windows的cmd.exe,用命令行cd到 E:/apktool 目录下。
  • 第三步:键入命令
    1. apktool d ThinkingSpacePro.apk

    这个命令的格式是:

    1. apktool d xxx.apk output

    其中 d 参数用来指示工具要进行反编译操作,xxx.apk是要反编译的程序,output 源码输出的路径。如果最后不指定输出的路径,默认是放在同目录下的 xxx 文件夹下(即apk程序名称去掉.apk后的名称)。如果你的apk文件名称中有空格,那键入命令时用双引号引起来,不过为方便起见,反编译之前把apk文件名中的空格都去掉先。
    运行反编译命令后会在同级目录下得到一个 ThinkingSpacePro 文件夹,源文件都在里面了。

三、汉化

  汉化这个比较简单,在反编译apk程序得到源码后,一般程序的文档都放在res目录下,都是些xml文档,用记事本之类的打开查看一下,一般都会比较容易看出来哪些是可以汉化的文本。这个就不去弄它了。可能不同程序还有不一样的,反正英语差点,汉化这种事我也不去深究了。你如果只想汉化的话,进res文件夹找找,完成汉化后就可以直接重新编译程序了(最后讲编译),不用太多的编程知识。思维导图本身支持多国语言(都在源文件的res文件夹里),所以也用不着汉化了。但大致的汉化过程就是这样了。

  另外貌视还有Android ResEdit之类的专用汉化软件,不用搞什么反编译,用起来可能更简单。

四、SDcard to Flash

  对于N5p,app2sd只是一个传说,不过sd2flash下面就可以实现。用SD卡玩机的人可以无视。

  下面这个是本文的重点。目的就是要修改程序的默认数据读取和保存路径,主要针对那些必须有SD卡才能使用的程序。比如说一个游戏它分为主程序和游戏的关卡数据。主程序可能只有1M,但游戏关卡数据可能是几十甚至上百M,这类游戏一般是主程序安装在内存中,而关卡数据会要求你安装或下载到SD卡上。如果你没有SD卡,那就玩不成了。我之所以要改它的路径,就是不想让它占我的SD卡,N5p不是自带8G(实际好像只有6.5G)Flash闪存么,那为什么不用它?下面的修改就是要欺骗apk程序,我们的Flash闪存就是程序你要的SD卡。

  正式修改时,除了要修改所有源文件(主要是.smali程序源文件)中的/sdcard 路径,使之指向 /flash 外,还要修改含有 Environment.getExternalStorageState 和 Environment.getExternalStorageDirectory 的源文件,前者用于检测是否安装SD卡,后者获取SD卡的路径。

  那么从头来修改思维导图 Thinking Space Pro 2.16的数据读写路径。原版程序你必须要有SD卡才能正常保存你的数据,修改之后,所有数据读取、保存都针对N5p自己的Flash闪存,从而解放SD卡。

  • 用apktool反编译ThinkingSpacePro.apk

    1. apktool d ThinkingSpacePro.apk

    反编译后得到ThinkingSpacePro文件夹,存放着程序源文件。

  • 使用UltraFileSearch搜索ThinkingSpacePro文件夹中所有包含"sdcard"文字的文件(搜索时,UltraFileSearch去掉"Whole word"的选项)。没有UltraFileSearch可以用windows系统自带的搜索工具,只是要用搜索文件中包含有指定内容的文件,而不是搜索文件名(我的系统搜索工具坏了,所以用UltraFileSearch这个软件代替)。
  • 对搜索到的文件(主要是其中的.smali程序源文件)用记事本打开编辑,将文件中所有 "/sdcard" 的字串改成 "/flash" 字串,这样将原先指向 /sdcard 的路径全部指向 /flash 路径。
  • 搜索程序中判断SD卡是否安装的方法,修改它使判断SD卡是否安装的方法返回True。一般的检测SD卡是否安装的方法是用下面的代码判断的:
    1. Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)

    所以用UltraFileSearch查找包含有"getExternalStorageState"字串的文件。 
    有些软件会用这个检测,有些软件则不用它,所以找不到的话可以窃喜:不用那么复杂了。
    针对思维导图这个程序,在App.smali中会找到(其它程序不一定在这里)。具体查找到的代码如下:

    1. .method public static isSdPresent()Z
    2. .locals 2
    3. .prologue
    4. .line 476
    5. invoke-static {}, Landroid/os/Environment;->getExternalStorageState()Ljava/lang/String;
    6. move-result-object v0
    7. const-string v1, "mounted"
    8. invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
    9. move-result v0
    10. return v0
    11. .end method

    这个是Dalvik opcodes,修改它需要一点专业知识(参考这里), 修改成如下(后来发现似乎只需要将最后的 return v0 改成 return 1 就可以了,不过没去做测试,对Dalvik opcodes尚未仔细研究过):

    1. .method public static isSdPresent()Z
    2. .locals 2
    3. .prologue
    4. .line 476
    5. const-string v0, "mounted"
    6. const-string v1, "mounted"
    7. invoke-virtual {v0, v1}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
    8. move-result v0
    9. return v0
    10. .end method

    改后因为v0始终等于v1,所以这个方法就返回True,这样就欺骗程序我们已经安装了SD卡了。

  • 搜索程序中获取SD卡路径的方法,修改它使它返回的路径从原来的指向 sdcard 变成 flash,再次欺骗程序我们的 flash 就是我们的 sdcard。一般的获取SD卡路径的方法如下:
    1. Environment.getExternalStorageDirectory

    注意这个方法返回的是一个java.io.File对象,而不是字符串,修改时要注意这一点。所以用UltraFileSearch搜索包含"getExternalStorageDirectory"的文件(主要是.smali文件),针对思维导图这个程序会搜索到App.smali和FileIO.smali二个文件,分别打开修改。具体对于App.smali相关内容如下(FileIO.smali也是类似):

    1. .line 246
    2. :cond_0
    3. new-instance v2, Ljava/lang/StringBuilder;
    4. invoke-direct {v2}, Ljava/lang/StringBuilder;->()V
    5. invoke-static {}, Landroid/os/Environment;->getExternalStorageDirectory()Ljava/io/File;
    6. move-result-object v3
    7. invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
    8. move-result-object v2
    9. sget-object v3, Ljava/io/File;->separator:Ljava/lang/String;

    把它修改成如下:

    1. .line 246
    2. :cond_0
    3. new-instance v2, Ljava/lang/StringBuilder;
    4. invoke-direct {v2}, Ljava/lang/StringBuilder;->()V
    5. const-string v3, "/flash"
    6. invoke-virtual {v2, v3}, Ljava/lang/StringBuilder;->append(Ljava/lang/Object;)Ljava/lang/StringBuilder;
    7. move-result-object v2
    8. sget-object v3, Ljava/io/File;->separator:Ljava/lang/String;

五、重新编译程序

  修改完成后,回到cmd.exe窗口,键入重新编译的命令:
  apktool b ThinkingSpacePro 
  第一次编译会出状况,后来发现是源码中的AndroidManifest.xml这个配置文件有问题,在这个文件的倒数第二行:

  1. <supports-screens android:anyDensity="true" android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:resizeable="true" />

  问题就出在那个android:xlargeScreens="true"上,好像不支持吧。所以删掉它,变成:

  1. <supports-screens android:anyDensity="true" android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:resizeable="true" />

  再次重新编译,成功。
  重新编译后,编译输出的apk程序文件保存在 ThinkingSpacePro 子目录下的 dist 文件夹下。
  这时候工作都基本完成了,不过,这个生成的apk程序还不能直接安装使用,因为缺少签名。

六、签名

  抓鬼用保鲜膜,打鬼用巧克力,签名用Auto-Sign。这个工具的下载和使用方法网上搜吧。我这里不说了,已经出了本文的范围。

  另外像物理空间Space Physic这个游戏的修改方法与此类似,不过它还要简单一点。还有像仙剑,它的修改不用涉及Dalvik opcodes,所以更简单,不过,它的不同点在于还要修改.so文件(.so文件相当于动态连接库dll文件),对.so的修改时用hedit等二进制编辑工具打开后将 "/sdcard" 替换为 "//flash" 即可。

  全当抛砖引玉,你可能有不同的目的来修改原程序,不过万变不离其宗,大致如此。

  如果你仍然不知道我上面改来改去到底在改什么,那么可以在你的N5p不插SD卡的情况下安装原版的思维导图这个软件,看能不能正常运行和使用;然后,卸载原版,同样在不插SD卡的情况下,安装我的修改版,看能否正常运行和使用了。

  题外话,仙剑这个程序修改后能运行,但过了几分钟就自动退出,原先以为我修改的有问题,后来拿原版的用SD卡玩,一样没过几分钟就自动退出,网上一搜都有这种情况,所以不是我改的有问题,原本程序移植的就有问题。

  最后提供思维导图和仙剑的Flash版(不需要SD卡即可运行),FLASH_ThinkingSpacePro2.16.apk、FLASH_PAL31.apk。对于仙剑这里只提供主程序,游戏数据用论坛的那个原版的,把 pal 上传到 N5p的flash闪存中(而不需要SD卡),就是连接电脑后出现的 "N5 Pro" 的那个磁盘(这个仙剑移植的不咱地,无故自动退出、菜单不支持触摸需要物理按键、分辨率太低造成大大的马赛克等等),安装FLASH_PAL31.apk即可。

  修改程序的下载地址:http://u.115.com/file/t597954474
  仙剑原版(只用数据):http://bbs.imp3.net/viewthread.php?tid=962491&extra=&highlight=%CF%C9%BD%A3&page=1

android反编译APK后,是smali文件,能反编译成dex文件相关推荐

  1. Android APK系列4-------Android编译APK后的系统结构

    Android APK系列4-------Android编译APK后的系统结构 system文件夹就是system.img的解压结果,data就是userdata.img的解压结果,root就是ram ...

  2. 可视化反编译APK工具,查看部分JAVA代码与全部资源文件。

    ###前言 APK是安卓安装包,里面主要就是两大部分 资源文件,主要是图片与布局. dex文件,也就是各种代码转换成的Android可执行文件. 如果直接ZIP打开混淆打包过的APK的话,会出现dex ...

  3. Java文件是如何编译成Dex文件的?如何执行Dex文件?

    Dex文件介绍 Android系统中,一个App的所有代码都在一个Dex文件里面.Dex是一个类似Jar的存储了多有Java编译字节码的归档文件. 为什么要使用dex文件来存储呢? Java源码经过编 ...

  4. html文件批量快速转换成JSP文件

    html文件批量快速转换成JSP文件 一.新建一个Web项目,把准备好的xxx.html(1个或多个)粘贴到项目的WebRoot文件夹或WebContent\WEB-INF\jsps文件夹(jsps这 ...

  5. android killer回编译apk后,提示无法安装的解决办法

    今天在使用android killer反编译自己写的android demo时遇到了回编译app后无法安装的问题 编译成功,并生成了apk文件,如下图所示: 在模拟器安装时,提示无法安装,如图: 上图 ...

  6. Python文件用pyinstaller打包成.exe文件后如何获取Python源码(Python文件反编译)

    此文章自己做个学习记录,也希望对跟我有一样困扰的同学一些帮助! 使用到的工具下载链接我都已经附上,点击下面蓝色字体可直接下载: 1.pyinstxtractor.py 2.wxMEDIT 3.在线编译 ...

  7. android打包apk不能安装程序,Android Studio 打包apk后应用未安装

    本文转载地址 http://blog.csdn.net/sinat_14849739/article/details/76383281 前言 Android 要求所有 APK 必须先使用证书进行数字签 ...

  8. Android平台dalvik模式下java Hook框架ddi的分析(2)--dex文件的注入和调用

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/77942585 前面的博客<Android平台dalvik模式下java Ho ...

  9. json qt 解析数组_Qt中 UI文件是如何转成C++文件的

    文章首发公众号:Qt那些事儿 序 UI文件为标准的XML h文件为标准的Qt语法的文件. 先思考一分钟:如何让你来设计,你如何做转化? 过程 其实过程很简单 读取ui文件(即xml) -> 经过 ...

最新文章

  1. 造一个鸿蒙,仅有华为还不够
  2. C++在构造函数中调用构造函数
  3. 企业网站标题优化要学会运用技巧和方法
  4. C# ,asp.net 获取当前,相对,绝对路径
  5. ubuntu 设置root启动
  6. Angular动态表单生成(八)
  7. boost::fibers::fiber用法的测试程序
  8. 【转】[Java] HashMap使用的示例
  9. 前端学习(1841):前端面试题之react和vue区别
  10. 径向基神经网络_谷歌开源Neural Tangents:5行代码打造无限宽神经网络模型,帮助“打开ML黑匣子”...
  11. 如何解决 IDEA 占用大量 CPU 导致的卡顿问题?这顿操作猛如虎
  12. ajax传递map参数给后端
  13. Odoo 14 版本优化更新的新功能体验
  14. 深度学习“三巨头”、图灵奖得主 Yann LeCun:我没有天赋,所以才追随聪明人...
  15. iOS中转义后的html标签如何还原
  16. 光伏发电最大功率点跟踪 (mppt) matlab/simulink仿真程序 恒定电压法 扰动观察法(po) 电导增量法(inc)模糊控制法(fuzzy)多种方法
  17. 在网页中插入MediaPlayer控件
  18. 行严格对角占优矩阵——一道矩阵代数作业题
  19. 自定义View 实现圆形seekbar (音量旋钮)
  20. This beta version of Typora is expired, please download and install a newer;Typora的测试版已过期,请下载并安装更新版本

热门文章

  1. PTA 7-25 买U盘(误差修正版)
  2. [转]iptables详解
  3. Java基础之多线程
  4. 真正优秀的人,从来都是不动声色
  5. VMWare/VMPlayer中“HGFS“的全称
  6. 攻防世界can_has_stdio?
  7. 炫彩界面库UI设计器分享, 集成开发环境,C++,易语言
  8. PhotonServer
  9. react+ts+redux+react-router-dom+less+反向代理+antd
  10. idea打包自定义包名称