Android PMS(四)-安裝微信

原創(chuàng)內(nèi)容,轉(zhuǎn)載請注明出處礁苗,多謝配合室埋。

經(jīng)過前面三篇文章的分析,基本上對Apk的安裝流程有了個(gè)大體的了解次舌。

再來一張圖回顧下整個(gè)大框架:

下面簡單來實(shí)驗(yàn)下安裝微信:

我選擇在應(yīng)用市場安裝微信熄攘,流程是先下載再安裝,多個(gè)應(yīng)用的場景下是并行下載彼念,串行安裝挪圾。

根據(jù)安裝流程粗分為三步:

一浅萧、復(fù)制Apk
三方應(yīng)用安裝在data/app下,這個(gè)是系統(tǒng)目錄哲思,直接看復(fù)制之后的結(jié)果:

/data/app # ls -al
drwxr-xr-x  4 system system 4096 2019-07-19 13:45 com.tencent.mm-jIsm1s1QsgU_5Q6XcQFYfA==

/data/app/com.tencent.mm-jIsm1s1QsgU_5Q6XcQFYfA== # ls -al
-rw-r--r--  1 system system  111405470 2019-07-19 13:45 base.apk //主apk在這
drwxr-xr-x  3 system system       4096 2019-07-19 13:45 lib //so庫文件
drwxrwx--x  3 system install      4096 2019-07-19 13:45 oat //dex文件

另外還有兩個(gè)APP自己私有目錄在這里一并說下:

內(nèi)部存儲:
/data/data # ls -al
drwx------  18 u0_a167        u0_a167         4096 2019-07-19 15:08 com.tencent.mm

外部存儲:
/sdcard/Android/data # ls -al
drwxrwx--x  3 u0_a167    sdcard_rw 4096 2019-07-19 13:55 com.tencent.mm

點(diǎn)擊應(yīng)用管理的清除全部數(shù)據(jù):
data/data/com.tencent.mm 目錄還在惯殊,內(nèi)部文件全部被清理掉
/sdcard/Android/data/com.tencent.mm 目錄被刪除

點(diǎn)擊應(yīng)用管理的清除緩存:
data/data/com.tencent.mm 目錄還在,內(nèi)部子文件夾也在也殖,這就是只清理緩存
/sdcard/Android/data/com.tencent.mm 目錄還在

二土思、安裝Apk

安裝的本質(zhì)是pull解析AndroidManifext.xml,按組件分類保存在Package數(shù)據(jù)結(jié)構(gòu)中忆嗜,最后通過Settings將所有安裝app的信息 己儒,當(dāng)系統(tǒng)進(jìn)行程序安裝、卸載和更新等操作時(shí)捆毫,均會更新該文件闪湾。通過readLPw()函數(shù)和writeLPr函數(shù)分別來讀寫packages.xml。

  • packages.xml 記錄所有安裝app的信息绩卤,當(dāng)系統(tǒng)進(jìn)行程序安裝途样、卸載和更新等操作時(shí),均會更新該文件濒憋。
  • packages-backup.xml 備份文件
  • packages-stopped.xml 記錄被用戶強(qiáng)行停止的應(yīng)用的Package信息
  • packages-stopped-backup.xml 備份文件
  • packages.list 記錄非系統(tǒng)自帶的APK的數(shù)據(jù)信息何暇,這些APK有變化時(shí)會更新該文件

當(dāng)系統(tǒng)啟動、升級或者有APK安裝凛驮、升級裆站、刪除時(shí)會重新scan,有變化會更新文件信息黔夭。這些xml文件相當(dāng)于是安裝解析之后得到的PackageParser.Package的持久化存儲方案宏胯。

挑一個(gè)packages.xml pull出來看看:
adb root
adb disable-verity
adb reboot
adb root
adb remount
adb pull /data/system/packages.xml .

微信相關(guān)的:

<package name="com.tencent.mm" codePath="/data/app/com.tencent.mm-jIsm1s1QsgU_5Q6XcQFYfA==" nativeLibraryPath="/data/app/com.tencent.mm-jIsm1s1QsgU_5Q6XcQFYfA==/lib" primaryCpuAbi="armeabi-v7a" publicFlags="941112900" privateFlags="0" ft="16c08c37d08" it="16c08c387b2" ut="16c08c387b2" version="1440" userId="10167" installer="com.xiaomi.market">
        <sigs count="1" schemeVersion="1">
            <cert index="12" key="308202eb30820254a00302010202044d36f7a4300d06092a864886f70d01010505003081b9310b300906035504061302383631123010060355040813094775616e67646f6e673111300f060355040713085368656e7a68656e31353033060355040a132c54656e63656e7420546563686e6f6c6f6779285368656e7a68656e2920436f6d70616e79204c696d69746564313a3038060355040b133154656e63656e74204775616e677a686f7520526573656172636820616e6420446576656c6f706d656e742043656e7465723110300e0603550403130754656e63656e74301e170d3131303131393134333933325a170d3431303131313134333933325a3081b9310b300906035504061302383631123010060355040813094775616e67646f6e673111300f060355040713085368656e7a68656e31353033060355040a132c54656e63656e7420546563686e6f6c6f6779285368656e7a68656e2920436f6d70616e79204c696d69746564313a3038060355040b133154656e63656e74204775616e677a686f7520526573656172636820616e6420446576656c6f706d656e742043656e7465723110300e0603550403130754656e63656e7430819f300d06092a864886f70d010101050003818d0030818902818100c05f34b231b083fb1323670bfbe7bdab40c0c0a6efc87ef2072a1ff0d60cc67c8edb0d0847f210bea6cbfaa241be70c86daf56be08b723c859e52428a064555d80db448cdcacc1aea2501eba06f8bad12a4fa49d85cacd7abeb68945a5cb5e061629b52e3254c373550ee4e40cb7c8ae6f7a8151ccd8df582d446f39ae0c5e930203010001300d06092a864886f70d0101050500038181009c8d9d7f2f908c42081b4c764c377109a8b2c70582422125ce545842d5f520aea69550b6bd8bfd94e987b75a3077eb04ad341f481aac266e89d3864456e69fba13df018acdc168b9a19dfd7ad9d9cc6f6ace57c746515f71234df3a053e33ba93ece5cd0fc15f3e389a3f365588a9fcb439e069d3629cd7732a13fff7b891499" />
        </sigs>
        <perms>
            <item name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" granted="true" flags="0" />
            <item name="com.google.android.finsky.permission.BIND_GET_INSTALL_REFERRER_SERVICE" granted="true" flags="0" />
            <item name="com.google.android.c2dm.permission.RECEIVE" granted="true" flags="0" />
            <item name="android.permission.MODIFY_AUDIO_SETTINGS" granted="true" flags="0" />
            <item name="android.permission.ACCESS_NOTIFICATION_POLICY" granted="true" flags="0" />
            <item name="android.permission.MANAGE_ACCOUNTS" granted="true" flags="0" />
            <item name="com.tencent.mm.matrix.strategynotify" granted="true" flags="0" />
            <item name="android.permission.NFC" granted="true" flags="0" />
            <item name="android.permission.FOREGROUND_SERVICE" granted="true" flags="0" />
            <item name="android.permission.WRITE_SYNC_SETTINGS" granted="true" flags="0" />
            <item name="android.permission.RECEIVE_BOOT_COMPLETED" granted="true" flags="0" />
            <item name="com.tencent.mm.permission.MM_MESSAGE" granted="true" flags="0" />
            <item name="com.android.launcher.permission.UNINSTALL_SHORTCUT" granted="true" flags="0" />
            <item name="android.permission.REQUEST_IGNORE_BATTERY_OPTIMIZATIONS" granted="true" flags="0" />
            <item name="android.permission.READ_PROFILE" granted="true" flags="0" />
            <item name="android.permission.BLUETOOTH" granted="true" flags="0" />
            <item name="android.permission.CHANGE_WIFI_MULTICAST_STATE" granted="true" flags="0" />
            <item name="android.permission.GET_TASKS" granted="true" flags="0" />
            <item name="android.permission.AUTHENTICATE_ACCOUNTS" granted="true" flags="0" />
            <item name="android.permission.INTERNET" granted="true" flags="0" />
            <item name="com.android.vending.BILLING" granted="true" flags="0" />
            <item name="android.permission.BLUETOOTH_ADMIN" granted="true" flags="0" />
            <item name="android.permission.GET_PACKAGE_SIZE" granted="true" flags="0" />
            <item name="com.tencent.mm.plugin.permission.READ" granted="true" flags="0" />
            <item name="com.tencent.mm.wear.message" granted="true" flags="0" />
            <item name="com.tencent.mm.ext.permission.WRITE" granted="true" flags="0" />
            <item name="com.android.launcher.permission.READ_SETTINGS" granted="true" flags="0" />
            <item name="android.permission.BROADCAST_STICKY" granted="true" flags="0" />
            <item name="android.permission.CHANGE_WIFI_STATE" granted="true" flags="0" />
            <item name="android.permission.FLASHLIGHT" granted="true" flags="0" />
            <item name="android.permission.ACCESS_NETWORK_STATE" granted="true" flags="0" />
            <item name="miui.permission.READ_STEPS" granted="true" flags="0" />
            <item name="com.tencent.mm.permission.C2D_MESSAGE" granted="true" flags="0" />
            <item name="android.permission.USE_FINGERPRINT" granted="true" flags="0" />
            <item name="android.permission.READ_SYNC_SETTINGS" granted="true" flags="0" />
            <item name="com.tencent.mm.plugin.permission.WRITE" granted="true" flags="0" />
            <item name="android.permission.VIBRATE" granted="true" flags="0" />
            <item name="android.permission.ACCESS_WIFI_STATE" granted="true" flags="0" />
            <item name="com.android.launcher.permission.INSTALL_SHORTCUT" granted="true" flags="0" />
            <item name="android.permission.WAKE_LOCK" granted="true" flags="0" />
            <item name="com.tencent.mm.ext.permission.READ" granted="true" flags="0" />
        </perms>
        <proper-signing-keyset identifier="32" />
    </package>

主要還是權(quán)限

這里就不對每個(gè)xml一一分析了。
詳細(xì)信息可以dumpsys package com.tencent.mm查看本姥。

三肩袍、編譯Apk

frameworks/base/services/core/java/com/android/server/pm/Installer.java

public void dexopt(String apkPath, int uid, @Nullable String pkgName, String instructionSet,
int dexoptNeeded, @Nullable String outputPath, int dexFlags,
String compilerFilter, @Nullable String volumeUuid, @Nullable String sharedLibraries,
@Nullable String seInfo, boolean downgrade, int targetSdkVersion,
@Nullable String profileName, @Nullable String dexMetadataPath,
@Nullable String compilationReason) throws InstallerException {
    Slog.i(TAG,"installdebug: getCallers:"+ Debug.getCallers(20)+"; apkPath:"+apkPath+"; pkgName: "+pkgName+"; compileFilter: "+compilerFilter);
assertValidInstructionSet(instructionSet);
if (!checkBeforeRemote()) return;
try {
        mInstalld.dexopt(apkPath, uid, pkgName, instructionSet, dexoptNeeded, outputPath,
dexFlags, compilerFilter, volumeUuid, sharedLibraries, seInfo, downgrade,
targetSdkVersion, profileName, dexMetadataPath, compilationReason);
} catch (Exception e) {
        throw InstallerException.from(e);
}
}

這里加了個(gè)Log,打印信息如下:

07-19 13:45:27.855 1501 1596 I Installer: installdebug: getCallers:
com.android.server.pm.PackageDexOptimizer.dexOptPath:305
com.android.server.pm.PackageDexOptimizer.performDexOptLI:253
com.android.server.pm.PackageDexOptimizer.performDexOpt:149
com.android.server.pm.PackageManagerService.installPackageLI:18215
com.android.server.pm.PackageManagerService.installPackageTracedLI:17635
com.android.server.pm.PackageManagerService.access$3300:407
com.android.server.pm.PackageManagerService$10.run:15465
android.os.Handler.handleCallback:873
android.os.Handler.dispatchMessage:99
android.os.Looper.loop:201
android.os.HandlerThread.run:65
com.android.server.ServiceThread.run:44
就是之前介紹的流程

apkPath:    /data/app/com.tencent.mm-jIsm1s1QsgU_5Q6XcQFYfA==/base.apk;
pkgName:   com.tencent.mm;
compileFilter:  quicken  編譯方式為quicken
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載婚惫,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者氛赐。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市辰妙,隨后出現(xiàn)的幾起案子鹰祸,更是在濱河造成了極大的恐慌,老刑警劉巖密浑,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛙婴,死亡現(xiàn)場離奇詭異,居然都是意外死亡尔破,警方通過查閱死者的電腦和手機(jī)街图,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進(jìn)店門浇衬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人餐济,你說我怎么就攤上這事耘擂。” “怎么了絮姆?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵醉冤,是天一觀的道長。 經(jīng)常有香客問我篙悯,道長蚁阳,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任鸽照,我火速辦了婚禮螺捐,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘矮燎。我一直安慰自己定血,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布诞外。 她就那樣靜靜地躺著澜沟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪浅乔。 梳的紋絲不亂的頭發(fā)上倔喂,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天铝条,我揣著相機(jī)與錄音靖苇,去河邊找鬼。 笑死班缰,一個(gè)胖子當(dāng)著我的面吹牛贤壁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播埠忘,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼脾拆,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了莹妒?” 一聲冷哼從身側(cè)響起名船,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旨怠,沒想到半個(gè)月后渠驼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡鉴腻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年迷扇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了百揭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,030評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜓席,死狀恐怖器一,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情厨内,我是刑警寧澤祈秕,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站雏胃,受9級特大地震影響踢步,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜丑掺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一获印、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧街州,春花似錦兼丰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至面徽,卻和暖如春艳丛,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背趟紊。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工氮双, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人霎匈。 一個(gè)月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓戴差,卻偏偏與公主長得像,于是被迫代替她去往敵國和親铛嘱。 傳聞我的和親對象是個(gè)殘疾皇子暖释,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容