APK(全称:Android application package,
Android应用程序包)是
Android操作系统使用的一种
应用程序包文件格式,用于分发和安装
移动应用及中间件。一个Android应用程序的代码想要在Android设备上运行,必须先进行
编译,然后被打包成为一个被Android系统所能识别的文件才可以被运行,而这种能被Android系统识别并运行的
文件格式便是“APK”。 一个APK文件内包含被编译的代码文件(.dex 文件),文件资源(resources), 原生资源文件(assets),证书(certificates),和清单文件(manifest file)。
介绍
APK是Android application package的缩写,即Android
安装包(apk)。APK是类似
SymbianSis或
Sisx的文件格式。通过将APK文件直接传到
Android模拟器或
Android手机中执行即可安装。
apk文件和sis一样,把androidsdk编译的工程打包成一个安装
程序文件,格式为apk。 APK文件其实是zip格式,但后缀名被修改为apk,通过
UnZip解压后,可以看到Dex文件,Dex是
DalvikVM executes的简称,即Android Dalvik执行程序,并非Java ME的
字节码而是
Dalvik字节码。Android在运行一个程序时首先需要
UnZip,然后类似Symbian那样直接,但不同于
Windows mobile中的
PE文件,程序的保密性和可靠性不是很高,通过dexdump命令可以反编译它,但这种架构符合发展规律,微软的WindowsGadgets(
WPF)也采用了这种架构方式。在
Android平台中,dalvikvm的执行文件被打包为apk格式,最终运行时加载器会先解压,然后获取编译后的androidmanifest.xml文件中的
permission声明对安全访问的限制,要知道仍然存在很多安全限制,但将apk文件传到/system/app文件夹下会发现执行是不受限制的。也许我们平时安装都不会选用这个文件夹,但在androidrom中,系统的apk文件默认会放入这个文件夹,它们拥有
root权限。
结构
一个APK文件通常包含以下文件:
AndroidManifest.xml: 一个传统的Android清单文件,用于描述该应用程序的名字、版本号、所需权限、注册的服务、链接的其他应用程序。该文件使用XML文件格式,可以编译为二进制的XML,使用的工具为AXMLPrinter2或
apktool。
classes.dex: classes文件通过DEX编译后的文件格式,用于在Dalvik虚拟机上运行的主要代码部分。
resources.arsc:程序的语言文件,可以透过这软件用(AndroidResEdit等工具)来进行翻译,也可以用ApkTool等工具反编译后再开始进行软件修改。
文件格式
格式定义
在Android平台中,dalvikvm的执行文件被打包为apk格式,最终运行时加载器会解压,然后获取编译后的androidmanifest.xml文件中的
permission分支相关的安全访问,但仍然存在很多安全限制,如果你将apk文件传到/system/app文件夹下,会发现执行是不受限制的。安装的文件可能不是这个文件夹,而在androidrom中,系统的apk文件默认会放入这个文件夹,它们拥有着
root权限。
开发环境
Android是一个基于Java的开发环境,Google也在API文档的书写和样例的提供上做了很出色的工作。
获取SDK
下载并安装
android的SDK[软件开发套件],这套SDK主要包括有核心库文件,一个模拟器,开发工具和一些示范的样例文件。推荐使用Eclipse 和androideclipse 扩展。如果只是使用
android,Eclipse IDE就已经足够了,但如果是第一次开发Java应用,建议下载完整的Java SE 开发工具 (JDK) 因为它包括签发应用程序所需要的工具。
应用架构
android应用架构很关键,如果不学习它,设计出来的游戏将是一种很难修复bug的产品。 需要了解应用程序、活动、Intents以及它们是如何互相联系交互的,Google在这儿提供了良好的
信息架构。真正重要的是,要理解为什么在设计的游戏中,需要不止一个的活动进程,以及如何设计一个用户体验良好的游戏。这些都应当配合到应用的生命周期中。
应用的生命周期
应用的生命周期是由
Android OS操作系统进行管理的,活动进程都将做为系统命令进行创建,正确处理这些事件对一个
应用程序来说是极为重要的,因为终端用户不会知道什么是正确的。最好在开始设计游戏之前搞明白这些,因为这有助于节省
调试时间以及避免代价高昂的重新设计。对大多数应用而言,默认设置即可开始工作,但对游戏而言,可能需要调整单态实例的信号为打开。在默认情况下,
Android会新建一个活动实例进程,因为它认为这是比较合适的,而游戏,可能只希望有一个活动的实例进程,这有一点儿影响,它需要了解一些
系统状态的管理。
apk反编译
apk反编译就是通过使用apk编译工具,将apk文件中的
源文件和资源反编译出来,得到的源文件和资源文件可以进行处理后再进行编译,以达到个性化定制、
汉化apk等目的。
反编译工具
1.最典型的apk编译工具的核心是
apktool,但是因为操作需要调用
cmd命令,所以出现了很多具有可视化界面的各种编译工具,像easyapk、apkdb、doapk。
2.dex2jar.jar,将apk中的classes.dex转化成Jar文件,再通过
jd-gui工具反编译
jar文件。
反编译方法
以apkdb编译apk文件为例,只需要在安装apkdb后,直接右击反编译就可以将apk文件反编译出来。
1.使用原生apktool工具,需要将apktool的两个文件释放到
window目录下,在
cmd中使用 apktool d apk文件名命令来编译apk文件,此时命令行的执行目录与apk文件所在目录必须一致。
2.首先将apk文件,将后缀改为zip,解压,得到其中的classes.dex,它就是 java文件
编译再通过dx工具打包而成的;将classes.dex复制到dex2jar.bat所在目录。在命令行下定位到dex2jar.bat所在目录,运行 dex2jar.bat classes.dex。
APK优化
Android SDK中包含了一个用于优化APK的新工具zipalign,它能够对打包的应用程序进行优化。通过zipalign优化后的应用程序可使得Android与应用程序间的交互更加有效率。
使用zipalign优化程序的步骤如下。在
cmd中输入如下命令:
zipalign优化的最根本目的是帮助
操作系统更高效率地根据请求索引资源,Resource Handling Code统一将Data Structure Alignment(数据结构对齐标准:DSA)限定为4-byte Boundaries。如果不采取对齐的标准,处理器无法准确和快速地在
内存地址中定位相关资源。目前的系统中使用Fallback Mechanism机制处理那些没有应用DSA标准的应用程序,这大大方便了普通开发者,使其无需关注繁琐的内存操作问题。但是相反,这种处理机制将给普通用户带来一定的麻烦,不但影响程序运行的效率,而且使系统的整体执行效率下降,使程序占用大量不必要的内存资源,甚至消耗一定的电池资源。
注意:zipalign操作必须且仅在标记apk文件附有个人加密钥之后。如果在标记之前进行zipalign操作,标记过程将会干扰整理。