android应用安装流程PPT_第1页
android应用安装流程PPT_第2页
android应用安装流程PPT_第3页
android应用安装流程PPT_第4页
android应用安装流程PPT_第5页
已阅读5页,还剩32页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

LPMSTraining(PackageManagerService),Outline,2,OverviewPMS启动过程Apk安装/卸载SDSWAP对APK管理的影响Apk安装位置的决定规则L多指令集支持LDexopt原则MTKFeaturesystem/vendor/operator/appLMulti-UserPMS问题分析方法及常见问题,5/1/2020,PMSOverview,3,ContextImpl.ApplicationPackageManager,/system/etc/permissions/platform.xml&xxx,xml加载系统feature,并为核心系统进程分配默认权限,/data/system/packages.list和packages.xml系统中所有应用程序的安装信息,PackageManagerService,DefaultContainerService,Installer,/system/framework,/system/app,/data/dalvik-cachedex文件存放路径,/data/data普通程序数据,应用程序层,PMS服务层,程序文件层,/data/system/users/userId/package-restrictions.xmlMulti-User中记录各自enable和disable的component,/system/priv-app,/system/vendor/operator/app,/data/app,5/1/2020,PMSOverview,4,提供安装、卸载应用程序的接口,负责系统中package的管理相关文件/data/systemPackages.list记录已安装的程序包列表Packages.xml记录了系统中所有应用程序的包管理信息,包括permission,package,shared-user等/system/etc/permissions/xxx.xml包含很多feature,用来描述手机应该支持的硬件特性,如支持camera,蓝牙等。Platform.xml建立上层permission同底层uid/gid的关系/data/system/users/userId/Package-restrictions.xmlMulti-User中记录各自enable和disable的component信息。,5/1/2020,PMS启动过程,5,5/1/2020,APK安装,6,安装apk(data/app):通过phoneUI安装adb命令adbinstallxxx.apkL版本不能使用adbpush命令安装apkPMS安装apk的过程复制apk安装包到data/app目录下copyApk()解压并扫描安装包,把dex编译为oat文件(User版本)且保存到data/dalvik-cache目录,并在data/data目录下创建对应的应用数据目录scanPackageLI(),5/1/2020,APK卸载,7,卸载apk(data/app):通过phoneUI卸载设置-应用-点击具体的apk-卸载adb命令adbuninstallxxx.apkPMS卸载apk的过程apk卸载是安装的逆过程,删除安装过程中三个目录下创建的文件及目录。停止应用、删除各种文件、更新系统设置、权限等,Forsystemapp,卸载的是updatedsystemapp,还原回原始systemapp.,5/1/2020,SDSWAP对APK管理的影响,8,SDSWAPMTK_2SDCARD_SWAP打开SDSWAP后,apk可以安装在手机内存和外置sd卡中Apk安装在sdcard上的目录/mnt/asec/Apk安装在sdcard可能遇到的问题卸载sdcard时,安装在sdcard上的apk会消失安装卸载sdcard时,pms的updateExternalMediaStatus会被调用。即会更新sdcard上的应用。若卸载了sdcard,则安装在sdcard的apk会消失。,5/1/2020,apk安装位置的决定(1/2),9,ID:FAQ08778应用可以安装在什么地方ID:FAQ04297如何确认一个应用程序的安装位置Apk安装位置决定的codePackageHelper.javaresolveInstallLocation,5/1/2020,apk安装位置的决定(2/2),10,5/1/2020,L多指令集的支持(1/3),11,applib的存放位置Systemappsystem/app/appname/lib/arm或arm64Thereallibisundersystem/liborsystem/lib64Non-systemappdata/app/packagename/lib/arm或arm64为了兼容旧的android版本,旧的libpath(data/app-lib)会保留,5/1/2020,L多指令集的支持(2/3),12,ABI(ApplicationBinaryInterface)theCPUduct.cpu.abilist32:armeabi-v7a,duct.cpu,abilist64:duct.cpu.abilist:armeabi-v8a,armeabi-v7a,armeabiABI:arm64-v8a,armeabi-v7a,armeabiThesequenceisimportantFirstappearABImeansthesystempreferinstructionsetFor64bit,arm64-v8acomestothefirstplaceFor32bit,pApplicationInfo(PMS)StringprimaryCpuAbiStringsecondaryCpuAbi,5/1/2020,L多指令集的支持(3/3),13,PrimaryCpuAbi的决定规则ABItype(32bitor64bit)isdeterminedbyitslibrarytypelib/arm,lib/arm64SystemwillfindtheproperABIfromsystemproperty(abilist)Ifpackagehasonlyonelibfolder,theprimaryABIisthelibraryIfpackagesupportsboth32and64bittheprimaryABIfollowsdevicearchTheprimaryABIisforcedto32bitABIwhenpackagelibhasrenderscriptcodes,5/1/2020,LDexopt的原则(1/2),14,PMS会对apk做dexopt首次开机,会对每个apk都做dexopt的动作非首次开机,若art在dalvik-cache对应指令集目录下找不到dex文件,则会重新做dexopt且提示“android正在升级”Dexopt后的文件存储路径/data/dalvik-cache/arm/data/dalvik-cache/arm64/存储路径是由applicationInfo.primaryCpuAbi决定,5/1/2020,LDexopt的原则(2/2),15,为了加速开机时间,dexopt会对package做排序CoreApps(Applicationdeclaredinitsmanifest,systemapponly)keyguard,settingsprovider,shellReceivingACTION_PRE_BOOT_COMPLETEbroadcastAbroadcastbeforeBOOT_COMPLETESystemappsnotbeenupdatedSystemappsbeenupdatedReceivingACTION_BOOT_COMPLETEbroadcastRecentlyusedpackageEng:within30minsUsr:within7daysFirstbootwilladdallpackage按照排序把apk放入到list中,然后按照list的顺序做dexopt,5/1/2020,MTKFeaturesystem/vendor/operator/app,16,目的预置的apk可以卸载,但是恢复出厂设置后可恢复L预置apk到system/vendor/operator/app的方法ID:FAQ13232L预置apk此目录下apk的特性可以卸载,但是apk本身不会被删除不支持移动到外置sdcard可更新版本即升级卸载后,容许安装低版本的apk,5/1/2020,LMulti-User,目前支持版本L0.MP6MT6795Howtoenablemulti-user在alpsdevicemediatekxxxProjectConfig.mk中加入:MTK_SHARED_SDCARD=yesMTK_OWNER_SDCARD_ONLY_SUPPORT=yes在alpsdevicemediatekxxxoverlaygenericframeworksbasecoreresresvalusesconfig.xml中加入:8trueDisableSDSwap非MP6不建议开,17,5/1/2020,PMS问题分析方法及常见问题,18,5/1/2020,如何打开PMS的log开关,19,方法一adbshelldumpsyspackagelogaon只对当次开机有效方法二PackageManagerService.java中修改DEBUG_XXX为true长久有效adbshelldumpsyspackagepackagesp.txtdumppackage信息遇到APK安装卸载等问题,请打开PMS的log开关抓取mtklog给mtk分析,也请一并提供p.txt文件,5/1/2020,L版本如何预置apk(1/4),20,ID:FAQ13232L预置apk如何将带源码的APK预置进系统?,1)在packages/apps下面以需要预置的APK的名字创建一个新文件夹,以预置一个名为Test的APK为例2)将TestAPK的Sourcecode拷贝到Test文件夹下,删除/bin和/gen目录3)在Test目录下创建一个名为Android.mk的文件,内容如下:LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)LOCAL_MODULE_TAGS:=optionalLOCAL_SRC_FILES:=$(callall-subdir-java-files)LOCAL_PACKAGE_NAME:=Testinclude$(BUILD_PACKAGE)4)打开文件devicemediatekcommondevice.mk将Test添加到PRODUCT_PACKAGES里面。PRODUCT_PACKAGES+=Test5)重新build整个工程,5/1/2020,L版本如何预置apk(2/4),21,如何将无源码的APK预置进系统?,1)在packages/apps下面以需要预置的APK名字创建文件夹,以预置一个名为Test的APK为例2)将Test.apk放到packages/apps/Test下面3)在packages/apps/Test下面创建文件Android.mk,文件内容如下:LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)#ModulenameshouldmatchapknametobeinstalledLOCAL_MODULE:=TestLOCAL_MODULE_TAGS:=optionalLOCAL_SRC_FILES:=$(LOCAL_MODULE).apkLOCAL_MODULE_CLASS:=APPSLOCAL_MODULE_SUFFIX:=$(COMMON_ANDROID_PACKAGE_SUFFIX)LOCAL_PREBUILT_JNI_LIBS:=lib/armeabi/libtest.solib/armeabi/libtest2.solib/armeabi-v8aLOCAL_CERTIFICATE:=PRESIGNEDinclude$(BUILD_PREBUILT)若无so,删除LOCAL_PREBUILT_JNI_LIBS若有so,使用LOCAL_PREBUILT_JNI_LIBS列出所有so的路径,不要忘记使用。标识符会将apk中的so抽离出来build进system/lib或者system/lib64中4)打开文件devicemediatekcommondevice.mk将Test添加到PRODUCT_PACKAGES里面。PRODUCT_PACKAGES+=Test5)重新build整个工程注:如果App使用SystemLevel的permission,需要預置到/system/priv-app底下(原在/system/app)。修改Android.mk,增加LOCAL_PRIVILEGED_MODULE:=true,以声明app需要放在/system/priv-app下。,5/1/2020,L版本如何预置apk(3/4),22,如何预置APK使得用户可以卸载,恢复出厂设置时不能恢复?,1)在packages/apps下面以需要预置的APK名字创建文件夹,以预置一个名为Test的APK为例2)将Test.apk放到packages/apps/Test下面3)在packages/apps/Test下面创建文件Android.mk,文件内容如下:LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)#ModulenameshouldmatchapknametobeinstalledLOCAL_MODULE:=TestLOCAL_MODULE_TAGS:=optionalLOCAL_SRC_FILES:=$(LOCAL_MODULE).apkLOCAL_MODULE_CLASS:=APPSLOCAL_MODULE_SUFFIX:=$(COMMON_ANDROID_PACKAGE_SUFFIX)#LOCAL_PRIVILEGED_MODULE:=trueLOCAL_MODULE_PATH:=$(TARGET_OUT_DATA_APPS)LOCAL_CERTIFICATE:=PRESIGNEDinclude$(BUILD_PREBUILT)4)打开文件devicemediatekcommondevice.mk将Test添加到PRODUCT_PACKAGES里面。PRODUCT_PACKAGES+=Test5)重新build整个工程注意:这个比不能卸载的多了一句LOCAL_MODULE_PATH:=$(TARGET_OUT_DATA_APPS),5/1/2020,L版本如何预置apk(4/4),23,如何预置APK使得用户可以卸载,并且恢复出厂设置时能够恢复?,1在vendormediatekproprietarybinary3rd-partyfree下面以需要预置的APK名字创建文件夹,以预置一个名为Test的APK为例2将Test.apk放入vendormediatekproprietarybinary3rd-partyfreeTest下面3在vendormediatekproprietarybinary3rd-partyfreeTest下面创建文件Android.mk,文件内容如下LOCAL_PATH:=$(callmy-dir)include$(CLEAR_VARS)#ModulenameshouldmatchapknametobeinstalledLOCAL_MODULE:=TestLOCAL_MODULE_TAGS:=optionalLOCAL_SRC_FILES:=$(LOCAL_MODULE).apkLOCAL_MODULE_CLASS:=APPSLOCAL_MODULE_SUFFIX:=$(COMMON_ANDROID_PACKAGE_SUFFIX)LOCAL_CERTIFICATE:=PRESIGNEDLOCAL_MODULE_PATH:=$(TARGET_OUT)/vendor/operator/appinclude$(BUILD_PREBUILT)2打开文件devicemediatekcommondevice.mk将Test添加到PRODUCT_PACKAGES里面。PRODUCT_PACKAGES+=Test3然后重新build整个工程,5/1/2020,如何分析“开机提示android正在升级”(1/2),24,开机提示android正在升级的原因?非首次开机,Art有对一些apk做dexopt做dexopt的原因?Art在dalvik目录下找不到apk对应的odex文件L和KK的不同L多指令集支持(arm/arm64)/data/dalvik-cache/arm/data/dalvik-cache/arm64/Odex存储位置由applicationInfo.primaryCpuAbi决定,art:DexFile_isDexOptNeededfailedtoopenoatfile/data/dalvik-cache/arm/systempriv-appxxxxxx.apkclasses.dexforfilelocation/system/priv-app/xxx/xxx.apk:Failedtoopenoatfilenameforreading:Nosuchfileordirectory,5/1/2020,如何分析“开机提示android正在升级”(3/3),25,L可能会遇到未知问题分析打开PMS的log开关使用方法二设置DEBUG_XXX为true在mainlog里搜索关键字dex2oat:oat-location表示odex文件存储位置Instruction-set表示此apk的primaryCpuAbi对应的指令集这条log打印出就代表这个apk有在做dexopt且是32还是64的指令集1查看重启手机之前上一次开机log,这个apk是否有做dex2oat且oat-location的值2在/data/dalvik-cache/arm64/xxx下查找是否已经有这个apk的odex3检查做dexopt的apk中包含的lib文件是armeabi-v7a还是armeabi-v8a?Armeabi-v7a对应arm,Armeabi-v8a对应arm64(arm64优先)将这些信息整理好提交eservice到mtk分析首次开机到复现问题开机的所以开机过程的log做了dex2oat的apk文件adbshelldumpsyspackagepackagesp.txtp.txt一起提交,dex2oat:/system/bin/dex2oat-zip-fd=11-zip-location=/system/app/xxx/xxx.apk-oat-fd=12-oat-location=/data/dalvik-cache/arm/systemappxxxxxx.apkclasses.dex-instruction-set=arm-instruction-set-features=default-runtime-arg-Xms64m-runtime-arg-Xmx512m,5/1/2020,首次开机慢,26,第一次开机慢是否可以优化?原因:首次开机,需要对每个apk提取odex文件,花费较多时间方案KK版本宏WITH_DEXPREOPTUser版本会在预编译时提取有sourcecode的APK的odex文件(首次开机节省提取odex文件时间,开机时间会优化)FAQ12138PrebuiltAPK提取odex在预编译时提取通过prebuilt方式预置的APK(无sourcecode)的odex文件L版本宏WITH_DEXPREOPT可直接打开。若有遇到问题请提交给mtk处理。,5/1/2020,如何检查apk安装失败的原因,27,打开PMS的log开关抓取安装失败的mtklog搜索TAG:PackageManager安装失败的原因有很多,只能具体case具体看安装apk正常log,PackageManager:init_copyidx=0:InstallParams1339f952file=/data/local/tmp/skpye.apkcid=nullPackageManager:mcs_boundPackageManager:startCopyUserHandle-1:InstallParams1339f952file=/data/local/tmp/skpye.apkcid=nullPackageManager:ApkcopydonePackageManager:mcs_checkackageManager:installPackageLI:path=/data/app/vmdl536406847.tmpPackageManager:Startparsingapk:nullPackageManager:Parsingdoneforapk:nullPackageManager:Renaming/data/app/vmdl536406847.tmpto/data/app/com.skype.rover-1PackageManager:Startinstallationforpackage:nullPackageManager:installNewPackageLI:Package39add66fcom.skype.roverPackageManager:Scanningpackagecom.skype.roverPackageManager:Wantthisdatadir:/data/data/com.skype.roverinstalld:do_install:com.skype.rover1010010100defaultPackageManager:Linkingnativelibrarydirfor/data/app/com.skype.rover-1installd:do_linklib:com.skype.rover/data/app/com.skype.rover-1/lib/arm0,5/1/2020,如何检查apk安装失败的原因,28,PackageManager:ResolvednativeLibraryRootforcom.skype.rovertoroot=/data/app/com.skype.rover-1/lib,isa=truePackageManager:Abisforpackagecom.skype.roverareprimary=armeabisecondary=nullPackageManager:Performpre-dexoptforpackage:com.skype.roverPackageManager:Runningdexopton:/data/app/com.skype.rover-1/base.apkpkg=com.skype.roverisa=armvmSafeMode=falseinstalld:do_dexopt:/data/app/com.skype.rover-1/base.apk501001com.skype.roverarm0dex2oat:/system/bin/dex2oat-zip-fd=15-zip-location=/data/app/com.skype.rover-1/base.apk-oat-fd=16-oat-location=/data/dalvik-cache/arm/dataappcom.skype.rover-1base.apkclasses.dex-instruction-set=arm-instruction-set-features=default-runtime-arg-Xms64m-runtime-arg-Xmx512m-compiler-filter=interpret-onlyPackageManager:Dexoptdoneon:com.skype.roverPackageManager:Newpackageinstalledin/data/app/com.skype.rover-1PackageManager:Installationdoneforpackage:nullPackageManager:BMfinishingpackageinstallfor1PackageManager:mcs_unbindPackageManager:callingdisconnectService()PackageManager:Sendingtouser0:act=ent.action.PACKAGE_ADDEDdat=package:com.skype.roverflg=0 x4000000Bent.extra.UID=10100,ent.extra.user_handle=0ActivityManager:Broadast:Intentact=ent.action.PACKAGE_ADDEDdat=package:com.skype.roverflg=0 x4000010(hasextras)ordered=falseuserid=0callerApp=null,5/1/2020,其他常见问题,29,安装apk提示存储空间不足FAQ09276存储空间不足的提示门槛优先安装位置KK版本以及之前版本可以打开(不建议打开)L版本google彻底拿掉了相关code,无法再打开,5/1/2020,Packages.xml(1/4),31,记录系统的permissions,所有应用程序的包管理相关信息,包括name、codePath、flags、userid等,PMS将根据这些信息进行包管理的各种操作。Permissions标签包含了系统中所有的权限列表,包括framework定义和应用程序自己定义的权限,5/1/2020,Packages.xml(2/4),32,Package标签一个package标签包含了一个应用程序包的相关信息。包括包名、codepath、程序类型、签名等等。,5/1/2020,Packages.xml(3/4),33,Package标签Name:程序包名称codePath:程序包所在路径nativeLibraryPath:该程序所使用的native库文件路径。primaryCpuAbi:apk支持的abi类型(优先)userId:应用程序对应的Linux用户IdsharedUserId:若在androidManifest.xml中定义了sharedUserId,则此处使用它而非userId。Sigs:签名信息。一个应用程序只能有一个签名。Count表示该签名包含多少个证书。Cert:证书。一个应用程序可以包含一个或多个证书。不同应用程序可以使用相同证书。Index证书索引Key若index首次出现,则key必须指定(来源于对apk进行签名的证书文件)Perms:一个应用程序所申请的权限列表。androidManifest.xml中每使用一个,则packages.xml中标签就会增加一项。,5/1/2020,Packages.xml(4/4),34,Shared-user标

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论