博客原文: [10 月的好奇心]QQ 面對面快傳的傳應用功能是如何實現的?windows
在手機裏咱們一般看不到已安裝應用的安裝包,可是有時咱們又會有些好玩的應用或遊戲給好友分享。沒有網絡的狀況下怎麼辦呢?bash
有朋友發現了QQ的面對面快傳能直接發送已安裝應用的apk。驚了(驚恐臉)。由於在我印象裏,安卓應用和windows軟件的安裝包同樣,都是一系列文件打包壓縮集合。實際在安裝時會解壓出各個文件安裝到不一樣的目錄裏。難不成QQ在手機上又把各個部分收集起來從新打包了?網絡
因而我去了解了安卓應用的安裝過程,發現問題並無想象的那麼複雜。 關於apk的安裝過程,我寫了一篇文章以備忘。若你也感到好奇,能夠簡單看下。Apk 安裝過程app
簡單說,雖然確實解壓了不少內容出去,但仍在/data/app/ 相應的目錄下留有一份完整的apk。QQ 作的就是找到這個文件,而後做爲普通的文件分享出去。less
那麼,ide
PackageManager
提供了一份系統安裝應用的清單,這個清單提供了不少有價值的信息 ApplicationInfo
。spa
能夠發現其中的 sourceDir
字段,就是咱們的目標。3d
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
複製代碼
是否是感受很神奇?
如今這個世界的大門也爲你打開了,快去探索吧。