首页 文章 精选 留言 我的

精选列表

搜索[动态代码分析],共10050篇文章
优秀的个人博客,低调大师

Android应用程序安装过程源代码分析(3)

Step 7.PackageManagerService.main 这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中: [cpp] view plain copy classPackageManagerServiceextendsIPackageManager.Stub{ ...... publicstaticfinalIPackageManagermain(Contextcontext,booleanfactoryTest){ PackageManagerServicem=newPackageManagerService(context,factoryTest); ServiceManager.addService("package",m); returnm; } ...... } 这个函数创建了一个PackageManagerService服务实例,然后把这个服务添加到ServiceManager中去,ServiceManager是Android系统Binder进程间通信机制的守护进程,负责管理系统中的Binder对象,具体可以参考 浅谈Service Manager成为Android进程间通信(IPC)机制Binder守护进程之路 一文。 在创建这个PackageManagerService服务实例时,会在PackageManagerService类的构造函数中开始执行安装应用程序的过程: [java] view plain copy classPackageManagerServiceextendsIPackageManager.Stub{ ...... publicPackageManagerService(Contextcontext,booleanfactoryTest){ ...... synchronized(mInstallLock){ synchronized(mPackages){ ...... FiledataDir=Environment.getDataDirectory(); mAppDataDir=newFile(dataDir,"data"); mSecureAppDataDir=newFile(dataDir,"secure/data"); mDrmAppPrivateInstallDir=newFile(dataDir,"app-private"); ...... mFrameworkDir=newFile(Environment.getRootDirectory(),"framework"); mDalvikCacheDir=newFile(dataDir,"dalvik-cache"); ...... //Findbaseframeworks(resourcepackageswithoutcode). mFrameworkInstallObserver=newAppDirObserver( mFrameworkDir.getPath(),OBSERVER_EVENTS,true); mFrameworkInstallObserver.startWatching(); scanDirLI(mFrameworkDir,PackageParser.PARSE_IS_SYSTEM |PackageParser.PARSE_IS_SYSTEM_DIR, scanMode|SCAN_NO_DEX,0); //Collectallsystempackages. mSystemAppDir=newFile(Environment.getRootDirectory(),"app"); mSystemInstallObserver=newAppDirObserver( mSystemAppDir.getPath(),OBSERVER_EVENTS,true); mSystemInstallObserver.startWatching(); scanDirLI(mSystemAppDir,PackageParser.PARSE_IS_SYSTEM |PackageParser.PARSE_IS_SYSTEM_DIR,scanMode,0); //Collectallvendorpackages. mVendorAppDir=newFile("/vendor/app"); mVendorInstallObserver=newAppDirObserver( mVendorAppDir.getPath(),OBSERVER_EVENTS,true); mVendorInstallObserver.startWatching(); scanDirLI(mVendorAppDir,PackageParser.PARSE_IS_SYSTEM |PackageParser.PARSE_IS_SYSTEM_DIR,scanMode,0); mAppInstallObserver=newAppDirObserver( mAppInstallDir.getPath(),OBSERVER_EVENTS,false); mAppInstallObserver.startWatching(); scanDirLI(mAppInstallDir,0,scanMode,0); mDrmAppInstallObserver=newAppDirObserver( mDrmAppPrivateInstallDir.getPath(),OBSERVER_EVENTS,false); mDrmAppInstallObserver.startWatching(); scanDirLI(mDrmAppPrivateInstallDir,PackageParser.PARSE_FORWARD_LOCK, scanMode,0); ...... } } } ...... } 这里会调用scanDirLI函数来扫描移动设备上的下面这五个目录中的Apk文件 /system/framework /system/app /vendor/app /data/app /data/app-private Step 8.PackageManagerService.scanDirLI 这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中: [java] view plain copy classPackageManagerServiceextendsIPackageManager.Stub{ ...... privatevoidscanDirLI(Filedir,intflags,intscanMode,longcurrentTime){ String[]files=dir.list(); ...... inti; for(i=0;i<files.length;i++){ Filefile=newFile(dir,files[i]); if(!isPackageFilename(files[i])){ //Ignoreentrieswhicharenotapk's continue; } PackageParser.Packagepkg=scanPackageLI(file, flags|PackageParser.PARSE_MUST_BE_APK,scanMode,currentTime); //Don'tmessaroundwithappsinsystempartition. if(pkg==null&&(flags&PackageParser.PARSE_IS_SYSTEM)==0&& mLastScanError==PackageManager.INSTALL_FAILED_INVALID_APK){ //Deletetheapk Slog.w(TAG,"Cleaningupfailedinstallof"+file); file.delete(); } } } ...... } 对于目录中的每一个文件,如果是以后Apk作为后缀名,那么就调用scanPackageLI函数来对它进行解析和安装。 Step 9.PackageManagerService.scanPackageLI 这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中: [java] view plain copy classPackageManagerServiceextendsIPackageManager.Stub{ ...... privatePackageParser.PackagescanPackageLI(FilescanFile, intparseFlags,intscanMode,longcurrentTime){ ...... StringscanPath=scanFile.getPath(); parseFlags|=mDefParseFlags; PackageParserpp=newPackageParser(scanPath); ...... finalPackageParser.Packagepkg=pp.parsePackage(scanFile, scanPath,mMetrics,parseFlags); ...... returnscanPackageLI(pkg,parseFlags,scanMode|SCAN_UPDATE_SIGNATURE,currentTime); } ...... } 这个函数首先会为这个Apk文件创建一个PackageParser实例,接着调用这个实例的parsePackage函数来对这个Apk文件进行解析。这个函数最后还会调用另外一个版本的scanPackageLI函数把来解析后得到的应用程序信息保存在PackageManagerService中。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/966522,如需转载请自行联系原作者

优秀的个人博客,低调大师

Android应用程序启动过程源代码分析(5)

Step 35. MainActivity.onCreate 这个函数定义在packages/experimental/Activity/src/shy/luo/activity/MainActivity.java文件中,这是我们自定义的app工程文件: publicclassMainActivityextendsActivityimplementsOnClickListener{ ...... @Override publicvoidonCreate(BundlesavedInstanceState){ ...... Log.i(LOG_TAG,"MainActivityCreated."); } ...... } 这样,MainActivity就启动起来了,整个应用程序也启动起来了。 整个应用程序的启动过程要执行很多步骤,但是整体来看,主要分为以下五个阶段: 一. Step1 - Step 11:Launcher通过Binder进程间通信机制通知ActivityManagerService,它要启动一个Activity; 二. Step 12 - Step 16:ActivityManagerService通过Binder进程间通信机制通知Launcher进入Paused状态; 三. Step 17 - Step 24:Launcher通过Binder进程间通信机制通知ActivityManagerService,它已经准备就绪进入Paused状态,于是ActivityManagerService就创建一个新的进程,用来启动一个ActivityThread实例,即将要启动的Activity就是在这个ActivityThread实例中运行; 四. Step 25 - Step 27:ActivityThread通过Binder进程间通信机制将一个ApplicationThread类型的Binder对象传递给ActivityManagerService,以便以后ActivityManagerService能够通过这个Binder对象和它进行通信; 五. Step 28 - Step 35:ActivityManagerService通过Binder进程间通信机制通知ActivityThread,现在一切准备就绪,它可以真正执行Activity的启动操作了。 这里不少地方涉及到了Binder进程间通信机制,相关资料请参考Android进程间通信(IPC)机制Binder简要介绍和学习计划一文。 这样,应用程序的启动过程就介绍完了,它实质上是启动应用程序的默认Activity,在下一篇文章中,我们将介绍在应用程序内部启动另一个Activity的过程,即新的Activity与启动它的Activity将会在同一个进程(Process)和任务(Task)运行,敬请关注。 本文转自 Luoshengyang 51CTO博客,原文链接:http://blog.51cto.com/shyluo/965993,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册