<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[Heck's  Blog]]></title> 
<link>https://www.heckjj.com/index.php</link> 
<description><![CDATA[一瞬间的决定，往往可以改变很多，事实上，让自己成功的往往不是知识，是精神！ 如果你总是为自己找借口，那只好让成功推迟。执行力，今天！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[Heck's  Blog]]></copyright>
<item>
<link>https://www.heckjj.com/android-file-struct-package-skills/</link>
<title><![CDATA[Android:apk文件结构及打包技巧]]></title> 
<author>Heck &lt;@hecks.tk&gt;</author>
<category><![CDATA[编程杂谈]]></category>
<pubDate>Mon, 27 Sep 2010 11:03:07 +0000</pubDate> 
<guid>https://www.heckjj.com/android-file-struct-package-skills/</guid> 
<description>
<![CDATA[ 
	&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="font-family: 微软雅黑;">apk文件，即Android application package文件。<br/>每个要安装到Android平台的应用都要被编译打包为一个单独的文件，后缀名为.apk，其中包含了应用的二进制代码、资源、配置文件等。APK文件其实是zip格式，但后缀名被修改为apk， <br/>在Android 系统安装时，APK 程序会被存放在系统默认的APP 目录中。<br/><br/>既然是一个Zip压缩包，那我们就不妨先解压出来看看其目录结构和内容，在我这我以NDK中的two-libs为例，以NDK为例，主要是要在本文中介绍SDK和NDK结合打包的方法。先看图：<br/><a href="https://www.heckjj.com/attachment.php?fid=78" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=78" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/></span><span style="font-family: 微软雅黑;">其实这个目录结构与源代码的目录结构类似，接下来我们对比看看源代码（我用的是eclipse）：<br/><a href="https://www.heckjj.com/attachment.php?fid=79" target="_blank"><img src="https://www.heckjj.com/attachment.php?fid=79" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>看见没有，几乎就是一样的！接下来挨个介绍下apk中个文件及目录的内容和作用吧，一下资料来源于网络和官方文档当然还有个人理解。<br/><br/><strong><span style="color: #4169E1;">AndroidManifest.xml</span> </strong><br/>该文件是每个应用都必须定义和包含的，它描述了应用的名字、版本、权限、引用的库文件等等信息[ , ]，如要把apk上传到Google Market上，也要对这个xml做一些配置。在apk中的AndroidManifest.xml是经过压缩的，可以通过AXMLPrinter2工具[ , ]解开，具体命令为：<strong><span style="color: #DC143C;">java -jar AXMLPrinter2.jar AndroidManifest.xml </span></strong><br/><br/><span style="color: #4169E1;"><strong>META-INF目录</strong> </span><br/>META-INF目录下存放的是签名信息，用来保证apk包的完整性和系统的安全。在eclipse编译生成一个apk包时，会对所有要打包的文件做一个校验计算，并把计算结果放在META-INF目录下。这就保证了apk包里的文件不能被随意替换。比如拿到一个apk包后，如果想要替换里面的一幅图片，一段代码， 或一段版权信息，想直接解压缩、替换再重新打包，基本是不可能的。如此一来就给病毒感染和恶意修改增加了难度，有助于保护系统的安全。 <br/><br/><strong><span style="color: #4169E1;">res目录</span> </strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;res目录存放资源文件。包括图片，字符串等等。 <br/><br/><strong><span style="color: #4169E1;">lib目录</span></strong> <br/>lib目录下的子目录armeabi存放的是一些so文件。这个地方多讲几句，都是在开发过程中摸索出来的。eclipse在打包的时候会根据文件名的命名规则（lib****.so）去打包so文件，开头和结尾必须分别为“lib”和“.so”，否则是不会打包到apk文件中的。其他非eclipse开发环境没有测试过。如果你是用SDK和NDK开发的话，这部分很重要，甚至可以通过把一些不是so文件的文件通过改名打包到apk中，具体能干些什么那就看你想干什么了，呵呵呵！ <br/><br/><strong><span style="color: #4169E1;">assets目录</span> </strong><br/>assets目录可以存放一些配置文件，这些文件的内容在程序运行过程中可以通过相关的API获得。具体的方法可以参考SDK中的例子：在sdk的 &#92;SDK&#92;1.6&#92;android-sdk-windows-1.6_r1&#92;platforms&#92;android-1.6&#92;samples&#92;ApiDemos 例子中，有个com.example..android.apis.content 的例子，在这个例子中他把一个text文件放到工程的asset目录下，然后把这个txt当作普通文件处理。处理的过程在ReadAsset.java中。同理，asset也可以放置其他文件。 <br/><br/><strong><span style="color: #4169E1;">classes.dex文件</span> </strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;classes.dex是java源码编译后生成的java字节码文件。但由于Android使用的dalvik虚拟机与标准的java虚拟机是不兼容的，dex文件与class文件相比，不论是文件结构还是opcode都不一样。目前常见的java反编译工具都不能处理dex文件。Android模拟器中提供了一个dex文件的反编译工具，dexdump。用法为首先启动Android模拟器，把要查看的dex文件用adb push上传的模拟器中，然后通过adb shell登录，找到要查看的dex文件，执行dexdump xxx.dex。另，有人介绍到Dedexer是目前在网上能找到的唯一一个反编译dex文件的开源工具，需要自己编译源代码。 <br/><br/><strong><span style="color: #4169E1;">resources.arsc</span> </strong><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;编译后的二进制资源文件 </span><br/>Tags - <a href="https://www.heckjj.com/tags/android/" rel="tag">android</a> , <a href="https://www.heckjj.com/tags/%25E6%2596%2587%25E4%25BB%25B6%25E7%25BB%2593%25E6%259E%2584/" rel="tag">文件结构</a> , <a href="https://www.heckjj.com/tags/%25E6%2589%2593%25E5%258C%2585%25E6%258A%2580%25E5%25B7%25A7/" rel="tag">打包技巧</a>
]]>
</description>
</item><item>
<link>https://www.heckjj.com/android-file-struct-package-skills/#blogcomment</link>
<title><![CDATA[[评论] Android:apk文件结构及打包技巧]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://www.heckjj.com/android-file-struct-package-skills/#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>