安卓资源文件编译成字节码
‘壹’ apk软件是用什么语言编写和编译的如何开发滴
apk
APK是AndroidPackage的缩写,即Android安装包(anapk)。APK是类似Symbian
Sis或Sisx的文件格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。
apk文件和sis一样最终把android
sdk编译的工程打包成一个安装程序文件格式为apk。
APK文件其实是zip格式,但后缀名被修改为apk,通过UnZip解压后,可以看到Dex文件,Dex是Dalvik
VM
executes的全称,即Android
Dalvik执行程序,并非java
ME的字节码而是Dalvik字节码。一个APK文件结构为:
META-INF
Jar文件中常可以看到
res
存放资源文件的目录
AndroidManifest.xml
程序全局配置文件
classes.dex
Dalvik字节码
resources.arsc
编译后的二进制资源文件总结下我们发现Android在运行一个程序时首先需要UnZip,然后类似Symbian那样直接,和Windows
Mobile中的PE文件有区别,这样做对于程序的保密性和可靠性不是很高,通过dexmp命令可以反编译,但这样做符合发展规律,微软的
Windows
Gadgets或者说WPF也采用了这种构架方式。在Android平台中dalvik
vm的执行文件被打包为apk格式,最终运行时加载器会解压然后获取编译后的androidmanifest.xml文件中的permission分支相关的安全访问,但仍然存在很多安全限制,如果你将apk文件传到/system/app文件夹下会发现执行是不受限制的。最终我们平时安装的文件可能不是这个文件夹,而在android
rom中系统的apk文件默认会放入这个文件夹,它们拥有着root权限。
‘贰’ Android的APK包里的文件类型都是什么
一个APK文件结构为: res/ 存放资源文件的目录 META-INF/ Jar文件中常可以看到 resources.arsc 编译后的二进制资源文件,主要是程序中使用字符串! AndroidManifest.xml 程序全局配置文件 classes.dex Dalvik字节码文件,我们写的JAVA文件被编译成DEX格式的字节码了 总结下我们发现Android在运行一个程序时首先需要UnZip,然后类似Symbian那样直接,和Windows Mobile中的PE文件有区别,这样做对于程序的保密性和可靠性不是很高,通过dexmp命令可以反编译,但这样做符合发展规律,微软的 Windows Gadgets或者说WPF也采用了这种构架方式。 1. Java文件-----应用程序源文件 我想这是大家听到android时就听到的文件,android本身相当一部分都是用java编写而成(基本上架构图里头蓝色的部份都是用Java开发的),android的应用必须使用java来开发。 2. Class文件------Java编译后的目标文件 不像通常我们使用的J2se,java编译成class就可以直接运行,android平台上class文件不能直接在android上运行。由于Google使用了自己Dalvik来运行应用,所以这里的class也肯定不能在sun的java环境中运行,我个人感觉android的class文件实际上只是编译过程中的中间目标文件,需要链接成dex文件后才能在dalvik上运行。 3. Dex文件-----Android平台上的可执行文件 Android虚拟机Dalvik支持的字节码文件格式Google在新发布的Android平台上使用了自己的Dalvik虚拟机来定义,这种虚拟机执行的并非Java字节码,而是另一种字节码:dex格式的字节码。在编译Java代码之后,通过Android平台上的工具可以将Java字节码转换成Dex字节码。虽然Google称Dalvik是为了移动设备定做的,但是业界很多人认为这是为了规避向sun申请Java license。由于没有太多的细节公开,现在还找不到Dalvik的具体实现,只能根据SDK做一些简单的分析工作。 这个Dalvik VM针对手机程式/CPU做过最佳化,可以同时执行许多VM而不会占用太多Resource,Dalvik VM的source目前还没有开放让人下载(未来整个系统都会开放),目前Google的角度是希望能让大家用这套SDK开始开发AP,底层的东西会慢慢发布。 4. Apk文件-------Android上的安装文件 Apk是Android安装包的扩展名,一个Android安装包包含了与某个Android应用程序相关的所有文件。 apk文件将AndroidManifest.xml文件、应用程序代码(.dex文件)、资源文件和其他文件打成一个压缩包。
‘叁’ 求助:Android逆向涉及到的dalvik字节码和smali文件,ARM汇编三者的联系和区别是什么
dalvik字节码就是smali或者(java)用编译产生的dalvik可执行文件
ARM汇编,是操作芯片级的指令集。这三个东西不在一个层面
android
|(编译产生.dex,也可理解为smali压缩文件,也就是虚机可执行文件)
dalvik虚机
|
ARM汇编
|
硬件
‘肆’ 什么是程序源代码文件,什么是编译后生成的字节码文件
你好,你在编写程序的时候,将写的代码保存到一个文件中,而这个文件的格式是.java。这样的文件就是源代码文件。经过javac编译后,生成的.class文件就是字节码文件。
‘伍’ 如何反编译Android 的apk/dex/odex,获得源码
关于APK,DEX的介绍
当我们编译一个安卓项目的时候,整个项目会被打包成一个 .apk文件。这个文件其实是一个标准的zip文件,因此可以用解压缩工具打开。这个apk文件一般都包含程序的代码(在classes.dex文件中), 资源文件, 证书, manifest 文件等。 其中对我们最重要的是classes.dex文件,因为编译后的字节码(bytecode)都是放在这个文件中。我们后面讲的反编译就是针对这个dex文件来的。
反编译普通的APK文件:
对于普通的APK/DEX文件的反编译,其实工具有很多, 包括:
ByteCode Viewer: 一个可视化的集成工具,说实话,不太好用,不够稳定,生成代码质量中等。
dex2jar + jd_gui: 这两个工具组合还可以, 用起来比ByteCode Viewer麻烦一些,但比较稳定,生成代码质量中等。
在线反编译工具JADX: http://www.javadecompilers.com/apk , 这是基于SourceForge上的JADX的开源工具来实现的。本来以为在线反编译质量不会好,但出人意料的是:JADX是我发现的最好的反编译工具, 不但使用简单(直接上传,转换,下载就ok),而且反编译出来的代码质量很高,特别是变量命名方面,可读性很不错。
反编译ODEX文件:
Android 5.0 Lollipop以后,Google用ART代替了以前的Dalvik,对于普通的app来说我们仍然可以用上面的方法来把dex文件反编译成Java源代码。但对于系统预装的App,特别是类似应用商店,播放器等, 你会发现这些应用的apk文件中找不到对应的classes.dex文件,而是会发现在其子目录下有个.odex文件。 那如何反编译这个odex文件呢?我通过google查了查,知道应该用baksmali,但从github上下载了几个版本都不行,报各种不同错误。经过反复搜索和尝试,终于找到了这篇文章
: http://www.naldotech.com/how-to-deodex-applications-on-android-5-0-lollipop/ 。 具体方法如下:
1. 从这里下载工具包, 解压缩到本地。 这里的baksmali的版本是2.0.3. 不同版本的baksmali针对的Android内核不同。有时候高版本反倒不好用。
2. 打开工具所在目录, 按住shift键, 点击鼠标右键,打开windows命令窗口
3. 把 odex文件拷贝到该目录
4. 在命令窗口运行: oat2dex.bat *.odex. 正常情况下,应该显示OK等信息。如果报错的话,说明这个文件无法转换,后面的也不用试了。
5. 运行 oat2dex.bat *.odex temp.dex . 运行后会创建一个temp.dex文件。
6. 运行 java -jar baksmali-2.0.3.jar -a 21 -x temp.dex -o source . 运行后会创建一个source的文件夹,并将temp.dex反编译到该文件夹。-a 21 表明的是Android内核的版本21
7. 运行 java -jar small-2.0.3.jar -a 21 source -o classes.dex, 反编译为classes.dex文件。
需要注意的是:由这种方式反编译成的classes.dex 文件相比原生的classes.dex 还是缺少了些信息,因此反编译这种classes.dex 文件后生成的java代码可读性会更差些。
8. 用在线工具JADX 来把 classes.dex 最终反编译为java代码。
‘陆’ android中怎么把图片资源(png,jpg 等等)转换成 byte数组
直接用流啊
‘柒’ android问题 如何将drawable中的图片转换成byte
//从资源中获取BitmapResources res = getResources(); Bitmap bmp = BitmapFactory.decodeResource(res, R.drawable.icon);//Bitmap → byte[]public byte[] Bitmap2Bytes(Bitmap bm) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); bm.compress(Bitmap.CompressFormat.PNG, 100, baos); return baos.toByteArray(希望对你有用