apk文件中的代码从Market安装后去了哪里?

时间:2012-03-10 02:36:05

标签: 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,最重要的是,文件大小明显小于原始大小。

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

Eclipse安装在模拟器上的那个与我预期的完全相同。即:代码('com'文件夹),资源('res'文件夹),签名('META-INF'文件夹),资产('assets'文件夹)和清单文件(AndroidManifest.xml)。但是,市场上安装在真实设备上的只有两部分:资源和清单文件。

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

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

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

2 个答案:

答案 0 :(得分:2)

我认为你不对。市场以下列方式工作:您选择一个应用程序并按下按钮进行安装。之后市场发送gtalk服务的意图来安装应用程序。此服务下载您上传到市场的apk文件,完成后安装此apk。只是在安装过程中可能会发生一些变化。在我看来,从安装过程中的应用程序中提取classes.dex文件并从该文件中生成优化的dex(.odex)并将其放在单独的目录中。这就是你看到文件差异的原因。

答案 1 :(得分:2)

好的,这是我发现的,如果这有助于那里的人:

当Market安装我的应用程序的免费版本时,apk文件安装到/data/app/com.company.app.apk,文件内容与我构建的完全相同,文件大小相同,一切都相同。

对于使用市场供应商许可的付费版本,apk文件本身安装到/data/app-private/com.company.app.apk。这和我发布的文件相同。但是,资源将被提取并安装到另一个文件/data/app/com.company.app.zip,请注意文件扩展名。这个zip文件只包含资源,所以它要小得多。但/data/app-private中的.apk文件包含所有内容,因此文件大小与我构建的相同。

ApplicationInfo.publicSourceDir始终指向/ data / app中的文件,因此在付费版本的情况下为/data/app/com.company.app.zip,对于免费版本为/data/app/com.company.app.apk。对于付费版本,我从publicSourceDir获取路径名,然后使用app-private获取replace.app,并将.zip替换为.apk以获取原始文件。

如果我将apk直接安装到模拟器,那么只有一个文件,并且始终安装在/ data / app下。