Android应用开发207Package和签名•APK文件介绍•aapt•为什么要签名•签名的注意事项•Android数字证书的有效期•使用Eclipse工具签名•keytool•jarsigner3APK:在Android平台下,程序文件的后缀名为“.APK”,APK是AndroidPackage的缩写,意思是Android安装包,是类似WM系统“.CAB”和Symbian系统“.sis”的文件格式。Apk文件实际是一个zip压缩包,可以通过解压缩工具解开。以下是我们用zip解开helloworld.apk文件后看到的内容,可以看到其结构跟工程结构有些类似:APK文件介绍1.Manifest文件AndroidManifest.xml是每个应用都必须定义和包含的,它描述了应用的名字、版本、权限、引用的库文件等等信息,如要把Apk上传到GoogleMarket上,也要对这个xml做一些配置。2.META-INF目录META-INF目录下存放的是签名信息,用来保证Apk包的完整性和系统的安全。在eclipse编译生成一个API包时,会对所有要打包的文件做一个校验计算,并把计算结果放在META-INF目录下。而在Android平台上安装Apk包时,应用管理器会按照同样的算法对包里的文件做校验,如果校验结果与META-INF下的内容不一致,系统就不会安装这个Apk。这就保证了Apk包里的文件不能被随意替换。比如拿到一个Apk包后,如果想要替换里面的一幅图片,一段代码,或一段版权信息,想直接解压缩、替换再重新打包,基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度,有助于保护系统的安全。APK文件介绍3.classes.dex文件classes.dex是java源码编译后生成的java字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的,dex文件与class文件相比,不论是文件结构还是opcode都不一样。目前常见的java反编译工具都不能处理dex文件。Android模拟器中提供了一个dex文件的反编译工具dexdump。用法为首先启动Android模拟器,把要查看的dex文件用adbpush上传的模拟器中,然后通过adbshell登录,找到要查看的dex文件,执行dexdumpxxx.dex。目前在网上能找到的另一个dex文件的反编译工具是Dedexer。Dedexer可以读取dex格式的文件,生成一种类似于汇编语言的输出。这种输出与jasmin[]的输出相似,但包含的是Dalvik的字节码。4.res目录res目录存放资源文件。5.resources.arsc编译后的二进制资源文件。APK文件介绍AAPT即AndroidAssetPackagingTool,在SDK的tools/目录下。该工具可以查看,创建,更新ZIP格式的文档附件(zip,jar,apk)。也可将资源文件编译成二进制文件。通常不需要直接使用AAPT工具,IDE插件和编译脚本能利用它打包apk文件来合成应用程序。详细的用法可以打开命令行终端,到tools文件夹下运行如下命令:Linux或MacOSX:./aaptwindow下如果设置了SDK的path环境变量,可以直接在CMD中输入aapt。如果没有设置,需要加上完整的SDK路径信息。aapt具体如下:这个命令就是查看apk内容aapt1.列出apk包的内容aaptl[ist][-v][-a]file.{zip,jar,apk}-v以table形式列出来-a详细列出内容例如:aaptl<你的apk文件>,这个命令就是查看apk内容2.查看apk一些信息aaptd[ump][--values]WHATfile.{apk}[asset[asset...]]badgingPrintthelabelandiconfortheappdeclaredinAPKpermissionsPrintthepermissionsfromtheAPK.resourcesPrinttheresourcetablefromtheAPK.configurationsPrinttheconfigurationsintheAPK.xmltreePrintthecompiledxmlsinthegivenassets.xmlstringsPrintthestringsofthegivencompiledxmlassets.例如:aaptdpermissions
,这个就是显示这个apk所具有的权限3.编译android资源aaptp[ackage][-d][-f][-m][-u][-v][-x][-z][-MAndroidManifest.xml]/[-0extension[-0extension...]][-gtolerance][-jjarfile]/[--debug-mode][--min-sdk-versionVAL][--target-sdk-versionVAL]/[--app-versionVAL][--app-version-nameTEXT][--custom-packageVAL]/aapt[--rename-manifest-packagePACKAGE]/[--rename-instrumentation-target-packagePACKAGE]/[--utf16][--auto-add-overlay]/[--max-res-versionVAL]/[-Ibase-package[-Ibase-package...]]/[-Aasset-source-dir][-Gclass-list-file][-Ppublic-definitions-file]/[-Sr...