QQ 面對面快傳的傳應用功能,如何找到已安裝應用的安裝包?

博客原文: [10 月的好奇心]QQ 面對面快傳的傳應用功能是如何實現的?windows

在手機裏咱們一般看不到已安裝應用的安裝包,可是有時咱們又會有些好玩的應用或遊戲給好友分享。沒有網絡的狀況下怎麼辦呢?bash

有朋友發現了QQ的面對面快傳能直接發送已安裝應用的apk。驚了(驚恐臉)。由於在我印象裏,安卓應用和windows軟件的安裝包同樣,都是一系列文件打包壓縮集合。實際在安裝時會解壓出各個文件安裝到不一樣的目錄裏。難不成QQ在手機上又把各個部分收集起來從新打包了?網絡

因而我去了解了安卓應用的安裝過程,發現問題並無想象的那麼複雜。 關於apk的安裝過程,我寫了一篇文章以備忘。若你也感到好奇,能夠簡單看下。Apk 安裝過程app

簡單說,雖然確實解壓了不少內容出去,但仍在/data/app/ 相應的目錄下留有一份完整的apk。QQ 作的就是找到這個文件,而後做爲普通的文件分享出去。less

那麼,ide

如何找到對應的apk呢?

PackageManager 提供了一份系統安裝應用的清單,這個清單提供了不少有價值的信息 ApplicationInfospa

Screenshot-from-2018-11-01-18-04-05

能夠發現其中的 sourceDir 字段,就是咱們的目標。3d

Screenshot-from-2018-11-01-18-05-37

OK,經過這兩行代碼,就能夠獲取到apk文件的路徑了。有沒有很興奮呢?code

// 獲取已安裝應用列表
    List<ApplicationInfo> apps = {Activity}.getPackageManager().getInstalledApplications(0);

    // 獲取apk地址
    appInfo.sourceDir

複製代碼

權限問題

看到前面說apk保存在 /data/app/ 目錄下,其實很擔憂權限問題。咱們都知道 /data/ 目錄權限是很嚴格的,須要system用戶或同組用戶才擁有讀權限。cdn

drwxrwx--x 44 system system 4096 2018-10-08 16:17 data/
複製代碼

不過不用擔憂,通過驗證,雖然 /data//data/app/ 的other用戶沒有讀權限,但是其下的文件倒是other可讀的:

ocean:/ $ ls -ld data/app/com.qiyi.video 
drwxr-xr-x 4 system system 4096 1970-01-01 08:03 data/app/com.qiyi.video

ocean:/ $ ls -l data/app/com.qiyi.video
-rw-r--r-- 1 system system  31639584 1970-01-01 08:03 com.qiyi.video.apk
drwxr-xr-x 3 system system      4096 1970-01-01 08:03 lib
drwxrwx--x 3 system install     4096 1970-01-01 08:03 oat
複製代碼

是否是感受很神奇?

如今這個世界的大門也爲你打開了,快去探索吧。

相關文章
相關標籤/搜索