2012-03-10 130 views
3

這是一件非常有趣的事情。我有一個APK文件,com.company.app.apk。當使用Eclipse,使用下面的代碼來獲取apk文件的文件名安裝模擬器:從Market安裝後,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'文件夾)和清單文件(AndroidManifest.xml)。然而,Market上安裝在真實設備上的只有兩個部分:資源和清單文件。

問題:我認爲從Market安裝時,.apk文件被分成兩個(或多個)文件。一個文件由ApplicationInfo.publicSourceDir指向,其中只包含資源。我怎樣才能得到其他文件的路徑名?

添加:我有兩個版本的同一個應用程序,一個是使用Google的供應商許可服務付費的,另一個是免費的。上述現象只發生在付費版本上。爲什麼?

糾錯:當我說'com'文件夾存在於第一個安裝的apk文件中時,我應該會更清楚。代碼本身,* .java文件不在'com'文件夾中。事實上,'com'文件夾中只包含一些垃圾文件,這些文件在構建過程中無意中留在那裏。如果不是那些垃圾文件,我不認爲'com'文件夾會放在第一位。

回答

2

好吧,這裏是我發現了,萬一這有助於有人出來:

當市場安裝我的應用程序的免費版本,apk文件被安裝到/data/app/com.company.app.apk,文件內容是完全與我建立它一樣,文件大小相同,一切都一樣。

對於使用Market Vendor Licensing的付費版本,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替換爲app-private,並用.apk替換.zip以獲取原始文件。

如果我將apk直接安裝到仿真器,那麼只有一個文件,並且總是安裝在/ data/app下。

+0

這是非常有趣的,感謝解決它。它似乎是作爲反盜版措施的工作嗎? – edthethird 2013-05-10 02:20:26

2

我認爲你是不對的。市場的運作方式如下:您選擇一個應用程序並按下一個按鈕來安裝它。在那之後市場發送意圖到gtalk服務安裝應用程序。此服務下載您已上傳到市場的apk文件,並在完成時安裝此apk。在安裝過程中,可能會發生一些變化。在我看來,在安裝classes.dex文件的過程中,應用程序會從該文件中提取優化的dex(.odex),並將其放入單獨的目錄中。這就是爲什麼你看到文件中的差異。

+0

是的,你是對的。文件classes.dex在文件com.company.app-2.zip中沒有出現,也沒有任何.odex。我在這個ZIP文件中看到的所有內容是resources.arsc,清單和res文件夾。你能告訴我如何找出簽名文件(在META-INF文件夾中)去哪裏?我想將簽名文件的內容與一組已知值進行比較,以用於反盜版目的。謝謝。 – wwyt 2012-03-10 16:31:12

+0

我想我對這個問題沒有太大的幫助。這個軟件包本身是用jarsigner簽名的,並且我猜沒有實際的證書。您可以在這裏閱讀更多關於簽名的信息:http://developer.android.com/guide/publishing/app-signing.html – Yury 2012-03-10 16:52:39

+0

非常感謝。無論如何,我在META-INF文件夾中看到了一些與證書/簽名相關的文件。我所做的是在運行時,它通過逐字節讀取整個apk文件來查找我知道屬於我的證書的特定字節模式。如果找不到它,這意味着這個apk文件是由其他人簽署的,一個盜版案例。這在免費版本中是成功的。但沒有在付費版本上工作,因爲apk文件已被分割,我找不到其他部分。 – wwyt 2012-03-10 21:39:31