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

下载本文档

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

文档简介

LPMSTraining

(PackageManagerService)Outline2OverviewPMS启动过程Apk安装/卸载SDSWAP对APK管理的影响Apk安装位置的决定规则L多指令集支持LDexopt原则MTKFeaturesystem/vendor/operator/appLMulti-UserPMS问题分析方法及常见问题PMSOverview3ContextImpl.ApplicationPackageManager/system/etc/permissions/platform.xml&xxx,xml

加载系统feature,并为核心系统进程分配默认权限/data/system/packages.list和packages.xml

系统中所有应用程序的安装信息PackageManagerServiceDefaultContainerServiceInstaller/system/framework/system/app/data/dalvik-cachedex文件存放路径/data/data普通程序数据应用程序层PMS服务层程序文件层/data/system/users/userId/package-restrictions.xml

Multi-User中记录各自enable和disable的component/system/priv-app/system/vendor/operator/app/data/appPMSOverview4提供安装、卸载应用程序的接口,负责系统中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信息。PMS启动过程5在SystemServer中启动PackageManagerService.mainnewPackageManagerService()并添加到ServiceManager中newinstaller(建立installer和installd的socket连接,最终在底层实现install,remove,dexopt等功能)创建PackageHandlerMessageLooper(安装/卸载请求)通过systemConfig获取到xml文件中信息readPLW()(读取data/system/packages.xml)检查/system/etc/permissions/platform.xml中定制的library及/system/framework下的jar档案是否需要dex提取进行优化。若需要优化,会调用installer.dexopt提取dex到/data/dalvik-cache中调用scanDirLI扫描存放apk的各个目录系统应用安装—通过scanPackageLI逐一解析AndroidManifest.xml文件,建立每个apk的配置结构,并将apk配置信息添加到全局列表进行管理。调用writeLPr()从全局列表中将apk信息写到packages.xml和packages.list中。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()APK卸载7卸载apk(data/app):通过phoneUI卸载设置->应用->点击具体的apk->卸载adb命令adbuninstallxxx.apkPMS卸载apk的过程apk卸载是安装的逆过程,删除安装过程中三个目录下创建的文件及目录。停止应用、删除各种文件、更新系统设置、权限等手机内存Sdcarddata/data下的数据目录data/data下的数据目录data/dalvik-cache下的dex文件data/dalvik-cache下的dex文件data/app/目录下对应的apkstorage/sdcard/目录下对应的包信息Forsystemapp,卸载的是updatedsystemapp,还原回原始systemapp.SDSWAP对APK管理的影响8SDSWAPMTK_2SDCARD_SWAP打开SDSWAP后,apk可以安装在手机内存和外置sd卡中Apk安装在sdcard上的目录/mnt/asec/Apk安装在sdcard可能遇到的问题卸载sdcard时,安装在sdcard上的apk会消失安装卸载sdcard时,pms的updateExternalMediaStatus会被调用。即会更新sdcard上的应用。若卸载了sdcard,则安装在sdcard的apk会消失。apk安装位置的决定(1/2)9ID:FAQ08778

应用可以安装在什么地方ID:FAQ04297

如何确认一个应用程序的安装位置Apk安装位置决定的codePackageHelper.javaresolveInstallLocationapk安装位置的决定(2/2)10是否有Installflag?Installflag的值是什么?是“INSTALL_INTERNAL”:只能安装在手机内存上“INSTALL_EXTERNAL”:只能安装在外部存储上AndroidManifest.xmlinstallLocation?否无定义,安装在手机内存Auto若手机内存空间足够,则apk安装在手机内存;若手机内存空间不够则安装在外部存储上“perferExternal”:表明安装到外部存储上“internalOnly”:只能安装到手机内存上L多指令集的支持(1/3)11applib的存放位置Systemappsystem/app/[appname]/lib/arm或arm64Thereallibisundersystem/liborsystem/lib64Non-systemappdata/app/[packagename]/lib/arm或arm64为了兼容旧的android版本,旧的libpath(data/app-lib)会保留L多指令集的支持(2/3)12ABI(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)StringprimaryCpuAbiStringsecondaryCpuAbiL多指令集的支持(3/3)13PrimaryCpuAbi的决定规则ABItype(32bitor64bit)is

determinedbyitslibrarytypelib/arm,lib/arm64SystemwillfindtheproperABI

fromsystemproperty(abilist)Ifpackagehasonlyonelibfolder,

theprimaryABIisthelibraryIfpackagesupportsboth32and64bit

theprimaryABIfollowsdevicearchTheprimaryABIisforcedto32bitABI

whenpackagelibhasrenderscript

codesLDexopt的原则(1/2)14PMS会对apk做dexopt首次开机,会对每个apk都做dexopt的动作非首次开机,若art在dalvik-cache对应指令集目录下找不到dex文件,则会重新做dexopt且提示“android正在升级”Dexopt后的文件存储路径/data/dalvik-cache/arm/……/data/dalvik-cache/arm64/……存储路径是由applicationInfo.primaryCpuAbi决定LDexopt的原则(2/2)15为了加速开机时间,dexopt会对package做排序CoreApps(Applicationdeclaredinitsmanifest,systemapponly)keyguard,settingsprovider,shell…ReceivingACTION_PRE_BOOT_COMPLETEbroadcastAbroadcastbeforeBOOT_COMPLETESystemappsnotbeenupdatedSystemappsbeenupdatedReceivingACTION_BOOT_COMPLETEbroadcastRecentlyusedpackageEng:within30minsUsr:within7daysFirstbootwilladdallpackage按照排序把apk放入到list中,然后按照list的顺序做dexoptMTKFeaturesystem/vendor/operator/app16目的预置的apk可以卸载,但是恢复出厂设置后可恢复L预置apk到system/vendor/operator/app的方法ID:FAQ13232L预置apk此目录下apk的特性可以卸载,但是apk本身不会被删除不支持移动到外置sdcard可更新版本即升级卸载后,容许安装低版本的apkLMulti-User目前支持版本L0.MP6MT6795Howtoenablemulti-user在alps\device\mediatek\xxx\ProjectConfig.mk中加入:MTK_SHARED_SDCARD=yesMTK_OWNER_SDCARD_ONLY_SUPPORT=yes在alps\device\mediatek\xxx\overlay\generic\frameworks\base\core\res\res\valuses\config.xml中加入:<integername=”config_multiuserMaximumUsers”>8</integer><integername=”config_enableMultiUserUI”>true</integer>DisableSDSwap非MP6不建议开PMS问题分析方法及常见问题18如何打开PMS的log开关19方法一adbshelldumpsyspackagelogaon只对当次开机有效方法二PackageManagerService.java中修改DEBUG_XXX为true长久有效adbshelldumpsyspackagepackages>p.txtdumppackage信息遇到APK安装卸载等问题,请打开PMS的log开关抓取mtklog给mtk分析,也请一并提供p.txt文件L版本如何预置apk(1/4)20ID: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)打开文件device\mediatek\common\device.mk将Test添加到PRODUCT_PACKAGES里面。PRODUCT_PACKAGES+=Test5)重新build整个工程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.so\@lib/armeabi/libtest2.so@lib/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)打开文件device\mediatek\common\device.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下。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)打开文件device\mediatek\common\device.mk

将Test添加到PRODUCT_PACKAGES里面。PRODUCT_PACKAGES+=Test5)重新build整个工程注意:这个比不能卸载的多了一句LOCAL_MODULE_PATH:=$(TARGET_OUT_DATA_APPS)L版本如何预置apk(4/4)23如何预置APK使得用户可以卸载,并且恢复出厂设置时能够恢复?1在

vendor\mediatek\proprietary\binary\3rd-party\free下面以需要预置的APK名字创建文件夹,以预置一个名为Test的APK为例2将Test.apk放入vendor\mediatek\proprietary\binary\3rd-party\free\Test下面3在vendor\mediatek\proprietary\binary\3rd-party\free\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_CERTIFICATE:=PRESIGNEDLOCAL_MODULE_PATH:=$(TARGET_OUT)/vendor/operator/appinclude$(BUILD_PREBUILT)2打开文件device\mediatek\common\device.mk将Test添加到PRODUCT_PACKAGES里面。PRODUCT_PACKAGES+=Test3然后重新build整个工程如何分析“开机提示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/system@priv-app@xxx@xxx.apk@classes.dex'forfilelocation'/system/priv-app/xxx/xxx.apk':Failedtoopenoatfilenameforreading:Nosuchfileordirectory如何分析“开机提示android正在升级”(3/3)25L可能会遇到未知问题分析打开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文件adbshelldumpsyspackagepackages>p.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/system@app@xxx@xxx.apk@classes.dex--instruction-set=arm--instruction-set-features=default--runtime-arg-Xms64m--runtime-arg-Xmx512m首次开机慢26第一次开机慢是否可以优化?原因:首次开机,需要对每个apk提取odex文件,花费较多时间方案KK版本宏WITH_DEXPREOPTUser版本会在预编译时提取有sourcecode的APK的odex文件(首次开机节省提取odex文件时间,开机时间会优化)[FAQ12138]PrebuiltAPK提取odex在预编译时提取通过prebuilt方式预置的APK(无sourcecode)的odex文件L版本宏WITH_DEXPREOPT可直接打开。

若有遇到问题请提交给mtk处理。如何检查apk安装失败的原因27打开PMS的log开关抓取安装失败的mtklog搜索TAG:PackageManager安装失败的原因有很多,只能具体case具体看安装apk正常logPackageManager:init_copyidx=0:InstallParams{1339f952file=/data/local/tmp/skpye.apkcid=null}PackageManager:mcs_boundPackageManager:startCopyUserHandle{-1}:InstallParams{1339f952file=/data/local/tmp/skpye.apkcid=null}PackageManager: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:Package{39add66fcom.skype.rover}PackageManager: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如何检查apk安装失败的原因28PackageManager:ResolvednativeLibraryRootforcom.skype.rovertoroot=/data/app/com.skype.rover-1/lib,isa=truePackageManager:Abisforpackage[com.skype.rover]areprimary=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/data@app@com.skype.rover-1@base.apk@classes.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=0x4000000Bundle[{ent.extra.UID=10100,ent.extra.user_handle=0}]ActivityManager:Broadast:Intent{act=ent.action.PACKAGE_ADDEDdat=package:com.skype.roverflg=0x4000010(hasextras)}ordered=falseuserid=0callerApp=null其他常见问题29安装apk提示存储空间不足[FAQ09276]存储空间不足的提示门槛优先安装位置KK版本以及之前版本可以打开(不建议打开)L版本google彻底拿掉了相关code,无法再打开Packages.xml(1/4)31记录系统的permissions,所有应用程序的包管理相关信息,包括name、codePath、flags、userid等,PMS将根据这些信息进行包管理的各种操作。Permissions标签<permissions>包含了系统中所有的权限列表,包括framework定义和应用程序自己定义的权限<permissions><itemname="com.aspire.mm.permission.ReceiveTokenChanged"package="com.aspire.mm"/><itemname="android.permission.CONTROL_INCALL_EXPERIENCE"package="android"protection="18"/><itemname="android.permission.RESTART_PACKAGES"package="android"/>Packages.xml(2/4)32Package标签一个package标签包含了一个应用程序包的相关信息。包括包名、codepath、程序类型、签名等等。<packagename="com.cyber.wallet"codePath="/system/vendor/operator/app/MobileWallet"

nativeLibraryPath="/data/app-lib/MobileWallet"primaryCpuAbi="armeabi"flags="572996"pkgFlagsEx="1"ft="14a09bcbde0"it="14a09bcbde0"ut="14a09bcbde0"version="140300063"userId="10090"><sigscount="1"><certindex="4"key=“xxx"/></sigs><perms><itemname="android.permission.SYSTEM_ALERT_WINDOW"/></perms></package>Packages.xml(3/4)33Package标签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中每使用一个<uses-permission>,则packages.xml中<perms>标签就会增加一项。Packages.xml(4/4)34Shared-user标签定义了共享用户id对应的签名和权限Preferred-

温馨提示

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

评论

0/150

提交评论