这是一件非常有趣的事情。我有一个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'文件夹。
答案 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下。