zoukankan      html  css  js  c++  java
  • 【转】android应用程序的安装方式与原理

    四种安装方式:

    1.系统应用安装――开机时完成,没有安装界面

    2.网络下载应用安装――通过market应用完成,没有安装界面

    3.ADB工具安装――没有安装界面。

    4.第三方应用安装――通过SD卡里的APK文件安装,有安装界面,由packageinstaller.apk应用处理安装及卸载过程的界面。

    应用安装的流程及路径 
    应用安装涉及到如下几个目录:        

    system/app ---------------系统自带的应用程序,获得adb root权限才能删除

    data/app  ---------------用户程序安装的目录。安装时把                                                                                                      apk文件复制到此目录
    data/data ---------------存放应用程序的数据
    data/dalvik-cache--------将apk中的dex文件安装到dalvik-cache目录下(dex文件是dalvik虚拟机的可执行文件,其大小约为原始apk文件大小的四分之一)

    安装过程:

    复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。

    卸载过程:

    删除安装过程中在上述三个目录下创建的文件及目录。

    安装过程详解

    安装应用的过程解析

    一.开机安装 
    PackageManagerService处理各种应用的安装,卸载,管理等工作,开机时由systemServer启动此服务

    (源文件路径:androidframeworksaseservicesjavacomandroidserverPackageManagerService.java) 

    PackageManagerService服务启动的流程:

    1.首先扫描安装“systemframework”目录下的jar包

    2.扫描安装系统system/app的应用程序

    3.制造商的目录下/vendor/app应用包

    4.扫描“dataapp”目录,即用户安装的第三方应用

    5.扫描" dataapp-private"目录,即安装DRM保护的APK文件(一个受保护的歌曲或受保 护的视频是使用 DRM 保护的文件)

    并且从该扫描方法中可以看出调用了scanPackageList()

    private PackageParser.Package scanPackageList(File scanFile,int parseFlags, int scanMode, long currentTime)

    跟踪scanPackageList()方法后发现,程序经过很多次的if else 的筛选,最后判定可以安装后调用了 mInstaller.install

    mInstaller.install()  通过    

      LocalSocketAddress address = new LocalSocketAddress(

                    "installd", LocalSocketAddress.Namespace.RESERVED);

    指挥installd在C语言的文件中完成工作

    PackageManagerService小节 :

    1)从apk, xml中载入pacakge信息, 存储到内部成员变量中, 用于后面的查找. 关键的方法

        是scanPackageList().

    2)各种查询操作, 包括query Intent操作.
    3)install package和delete package的操作. 还有后面的关键方法是installPackageList().

    二、从网络上下载应用:

      下载完成后,会自动调用Packagemanager的安装方法installPackage()   

       PackageManagerService类的installPackage()函数

       其中是通过PackageHandler的实例mhandler.sendMessage(msg)把信息发给继承Handler的类HandleMessage()方法......最后终于回到了和开机安装一样的地方.与开机方式安装调用统一方法。

    三、从ADB工具安装 

       其入口函数源文件为pm.java 

       (源文件路径:androidframeworksasecmdspmsrccomandroidcommandspmpm.java)

       其中systemframeworkpm.jar 包管理库

       包管理脚本 systeminpm 解析

       其中的PackageInstallObserver obs = new PackageInstallObserver();             

       mPm.installPackage(Uri.fromFile(new File(apkFilePath)), obs, installFlags,

                        installerPackageName);   

    四、从SD卡安装

          系统调用PackageInstallerActivity.java(/home/zhongda/androidSRC/vortex-8inch-for-hoperun/packages/apps/PackageInstaller/src/com/android/packageinstaller)

    进入这个Activity会判断信息是否有错,然后调用

          private void initiateInstall()判断是否曾经有过同名包的安装,或者包已经安装

    通过后执行private void startInstallConfirm() 点击OK按钮后经过一系列的安装

  • 相关阅读:
    C# DataGridview转换为DataTable
    未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序
    ORM(Object Relational Mapping)框架
    C#开发小技巧
    Windows系统中Oracle11g R2 版本数据库卸载
    world特殊控制符输入
    Java中生成帮助文档
    Java类——JDBC链接、并操作MySQL数据库
    Java——实现对密码进行MD5加密
    HTTP协议详解
  • 原文地址:https://www.cnblogs.com/l2rf/p/4284306.html
Copyright © 2011-2022 走看看