android - 从市场安装后,apk 文件中的代码去了哪里?

标签 android

这是一件非常有趣的事情。我有一个 APK 文件,com.company.app.apk。使用Eclipse安装到模拟器时,通过以下代码获取apk的文件名:

String fileName = activity.getPackageManager().getApplicationInfo(
    activity.getPackageName(), PackageManager.GET_META_DATA).publicSourceDir;

我得到一个像这样的路径名com.company.app-1.apk。文件大小与我构建的apk文件相同。

现在,当我将此应用发布到 Market 并将其安装到真实设备 (Android 2.3) 时,相同的代码返回如下路径名:com.company.app-2.zip。请注意,文件扩展名已更改为 .zip,最重要的是,文件大小明显小于原始大小。

现在,如果我将这两个文件传输到我的电脑并使用 WinZip 打开它们,我发现了一件非常有趣的事情:

通过 Eclipse 安装在模拟器上的内容与我预期的完全相同。即:代码(“com”文件夹)、资源(“res”文件夹)、签名(“META-INF”文件夹)、 Assets (“assets”文件夹)和 list 文件(AndroidManifest.xml)。而Market安装在真实设备上的只有两部分:资源和manifest文件。

问题:我认为从市场安装时,.apk 文件会被分成两个(或更多)文件。 ApplicationInfo.publicSourceDir 指向一个文件,该文件仅包含资源。如何获取其他文件的路径名?

添加:我有同一应用的两个版本,一个是使用 Google 供应商许可服务付费的,另一个是免费的。上述现象仅发生在付费版本中。为什么?

更正:当我在第一种情况下说“com”文件夹存在于安装的apk文件中时,我应该更清楚。代码本身(*.java 文件)不在“com”文件夹中。事实上,“com”文件夹只包含一些在构建过程中无意中留下的垃圾文件。如果没有那些垃圾文件,我认为“com”文件夹首先不会存在。

最佳答案

我觉得你说的不对。市场的运作方式如下:您选择一个应用程序并按下按钮来安装它。之后,市场将 Intent 发送给 gtalk 服务来安装应用程序。此服务下载您上传到市场的 apk 文件,完成后安装此 apk。在安装过程中可能会发生一些变化。在我看来,在安装期间从应用程序中提取了classes.dex 文件,并从该文件中生成了优化的dex (.odex) 并将其放入单独的目录中。这就是您看到文件差异的原因。

关于android - 从市场安装后,apk 文件中的代码去了哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9643461/

相关文章:

android - 恢复/置于顶部 Activity (但隐藏) fragment

java - 使用 Intent 在 Activity 之间传递自定义对象

java - 按尺寸值自动缩放文本大小

android - phonegap运行android报错

java - 如何获取数组的索引

android - 以编程方式在 TextView 中居中文本

android - java.lang.NoClassDefFoundError android.support.v7.view.menu.MenuBuilder

php - Android:如何使我检索到的(从 mysql 中)JSON 解析数据添加到 ListView 每分钟刷新一次

安卓虚拟设备

Android - 如何设置一个特定的日历插入一个有 Intent 的事件