精华内容
下载资源
问答
  • 源地址: Android应用安装有如下四种方式 1.系统应用安装――...4.第三方应用安装――通过SD卡里的APK文件安装,有安装界面,由packageinstaller.apk应用处理安装及卸载过程的界面。     下载好的A

    源地址:http://www.cnblogs.com/vivid-stanley/archive/2012/10/17/2727617.html

    Android应用安装有如下四种方式

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

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

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

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

     

     system/app  系统自带的应用程序,无法删除

    下载好的Android apk, 在安装过程中,其中文件内容是这样处理的:

    1. 先把apk拷贝到/data/app下, 没错,就是完整的apk, 例如com.calendar.UI-2.apk

    2. 解压apk,把其中的classes.dex 拷贝到/data/dalvik-cache, 其命名规则是 apk路径+classes.dex, 如: data@app@com.calendar.UI-2.apk@classes.dex, 其中@表示目录符号/

    3. 在/data/data下创建对应的目录,用于存储程序的数据,例如cache, database等, 目录名称与包名相同, 如com.calendar.ui.

     

    要注意的是, 安装过程并没有把资源文件, assets目录下文件拷贝出来,他们还在apk包里面呆着,所以,当应用要访问资源的时候,其实是从apk包里读取出来的。其过程是,首先加载apk里的resources.arsc(这个文件是存储资源Id与值的映射文件),根据资源id读取加载相应的资源。

    展开全文
  • system/app------系统自带的应用安装目录 data/app -------用户程序安装的目录,安装时把apk文件复制到此目录 data/data ------存放应用程序的数据 data/dalvik-cache-----将apk中的dex文件安装到dalvik-cache目录下...
    • 一个apk文件在安装到手机过程中,涉及到如下几个目录:
    system/app------系统自带的应用安装目录
    data/app -------用户程序安装的目录,安装时把apk文件复制到此目录
    data/data ------存放应用程序的数据
    data/dalvik-cache-----将apk中的dex文件安装到dalvik-cache目录下
    

    安装过程:

    1. 将apk复制到data/app目录下面,会放到data/app/包名/目录下面,同时apk中的so文件也会拷贝到此目录下的lib文件目录中。
    2. 解压apk,把其中的classes.dex拷贝到data/dalvik-cache,其命名规则是apk路径+classes.dex
    3. 在data/data/目录下创建对应的包名目录, /data/data/包名/, 并在该目录下创建存储应用数据的相关目录,例如cache, database, lib, shared_prefs等

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

    要注意的是, 安装过程并没有把资源文件, assets目录下文件拷贝出来,他们还在apk包里面呆着,所以,当应用要访问资源的时候,其实是从apk包里读取出来的。其过程是,首先加载apk里的resources.arsc(这个文件是存储资源Id与值的映射文件),根据资源id读取加载相应的资源。

    转载:https://blog.csdn.net/lyabc123456/article/details/81624431

    展开全文
  • 一文看懂Android APK安装的原理

    千次阅读 2019-07-23 23:56:12
    我们知道,Windows应用程序的安装包是一个可执行的压缩包,安装的过程是把压缩包中的数据和依赖库拷贝到安装目录,再在桌面或启动栏创建快捷方式,那么安卓APK安装过程是不是也是这样的呢?本文将为大家解答这些...

    一文看懂Android APK安装的原理

    前言

    大家有没有想过一个应用的APK是怎么被安装到安卓手机上的,安装的本质是什么?我们知道,Windows应用程序的安装包是一个可执行的压缩包,安装的过程是把压缩包中的数据和依赖库拷贝到安装目录,再在桌面或启动栏创建快捷方式,那么安卓的APK安装过程是不是也是这样的呢?本文将为大家解答这些问题。

    APK包的构成

    首先,我看一下APK包的构成,Android的APK包和Windows应用程序安装包是不同的,它只是个简单的压缩包,没有可执行的能力,我们还可以用zip工具直接解压它。

    一个APK包含以下这些文件:

    • META-INF目录:包含两个签名文件(CERT.SF和CERT.RSA),以及一个manifest文件(MANIFEST.MF)
    • assets目录:包含工程中的asset目录下的文件,可以使用AssetManager获取
    • res目录:包含那些没有被编译到resources.arsc的资源
    • lib目录:包含适用于不同处理器的第三方依赖库,这里边可以有多个子目录,比如armeabi, armeabi-v7a, arm64-v8a, x86, x86_64, 以及mips
    • resources.arsc文件:存储编译好的资源,包括项目工程中的res/values目录里的xml文件,它们都被编译成二进制格式,也包括一些路径,指向那些没有被编译的资源,比如layout文件和图片
    • classes.dex文件:项目中的java类都被编译到该dex文件,这个文件可以被Android的Dalvik/ART虚拟机解析。
    • AndroidManifest.xml:二进制格式的manifest文件,这个文件是必须的。

    这些文件是Android系统运行一个应用程序时会用到的数据和代码,下面介绍系统如何安装一个APK包。

    安装APK

    我们安装应用程序,最常用的方法就是在PC上运行命令adb install 加APK的文件路径,回车等待Android设备安装完成,安装成功命令行会显示Success。那么其内部是怎样的一个过程呢?

    1. 将APK包push到手机
    首先,adb会将PC端的APK文件push到Android设备的/data/local/tmp目录下,一些手机会将拷贝的进度反馈给adb客户端,于是PC上的命令行会展示拷贝的进度。

    2. 执行pm命令
    PC端的adb程序会向Android端的adbd发送shell:pm命令,于是adbd会向系统的PackageManagerService(PMS)进程发送消息,通知其安装apk包。这里我有两个理解:
    **理解一:**我们平常也可以在adb shell上执行pm命令与PMS交互,那么pm应该是个独立的进程,adbd执行pm命令,是启动了pm这个进程,这个进程再向PMS进程发送消息,通知其安装APK。
    **理解二:**adbd直接向PMS进程发送消息,通知其安装APK。
    不知哪个正确,这个有待继续研究,如果有童鞋了解这个,希望能不吝赐教。

    3. 触发安装过程
    PMS首先将APK包拷贝到另外一个目录/data/app,这个目录是非系统应用的apk存放的目录,与之相对应的,系统应用的apk存放的目录是/system/frameworks、/system/app和/vendor/app。
    PMS内部有个AppDirObserver类,其监听着/data/app目录的变化,当apk被复制到/data/app目录之后,该类随即触发PMS对APK进行解析。

    4. APK的解析
    我们可以先想想,Android系统是如何启动一个APP的?比如点击屏幕上的应用图标,然后一个Activity就被启动了。这个过程中,桌面程序Launcher先是向ActivityManagerService(AMS)进程发送了一个Intent,AMS随即会将这个Intent扔给PMS,PMS则解析这个Intent得到Activity的信息给到AMS,然后AMS会启动一个空进程,并通知该进程创建该Activity。那么PMS为什么会有这个Activity的信息呢?

    这就是PMS解析APK要做的事情了,而解析APK的时机又要分成两种场景:

    1. 系统启动时解析APK
    Android系统在启动的时候,会启动一个system_server进程,这个进程驻留着系统多个重要的服务,其中便包含了与APK最相关的PackageManagerService服务,这个服务在启动的时候,会扫描Android系统中几个目标文件夹中的APK,对每个APK进行解析。
    2. 安装过程中解析APK
    安装一个apk的过程,PMS也会对这个APK进行解析,其调用的是PackageManagerService.java的scanPackageLI()方法,其实在系统启动时扫描全部apk的过程也是调用该方法。

    可以这样理解,系统启动的时候,是解析已经安装的所有APK,而安装单个APK时,则是用同样的方法解析这个APK,过程是一样的。

    那么解析APK具体做的是什么事情呢?

    其中主要的过程就是解析APK中的AndroidManifest.xml文件,将APK的关键信息四大组件信息、权限信息等存储在内存中的PackageParser对象中,PackageParser对象的结构如图所示:

    来源:https://blog.csdn.net/Innost/article/details/47253179

    这个PackageParser包含了IntentFilter的信息,使得PMS可以根据Intent来获取一个Activity的信息。那么,PMS在得到PackageParser对象之后,接着会将这个APK的信息加入到PMS自身管理中去,比如将Activity的数据保存在mActivities对象中,将Provider的数据保存在mProviders对象中等,PKMS提供了好几个重要数据结构来保存这些数据,这些数据结构的相关信息如图所示:

    来源:https://blog.csdn.net/Innost/article/details/47253179

    除了解析和保存APK的核心数据,PMS还会创建应用程序目录:/data/data/包名,同时提取apk中的dex文件并保存到/data/dalvik-cache中,如果该APK包含了native动态库,则需要将它们从APK文件中解压并复制到对应目录中,以及对APK进行dex优化,还有其它一些细节比如APK签名的校验,杀死APK所在进程(覆盖安装的情况)等,安装过程的最后,会发送ACTION_PACKAGE_ADDED广播,通知所有其它应用有新应用安装了。

    总结

    至此,APK安装过程就结束了。纵观整个过程,apk安装的关键就是解析AndroidManifest.xml,将重要的信息保存在PMS进程的内存中,以保证后续启动这个应用程序的组件时,可以在PMS中找到这个组件的信息。我们本来认为的更重要的代码只是进行dex优化后简单地提取到一个目录中而已,另外,APK中的资源并没有被处理,而是在启动应用进程的时候,动态去从APK包中加载而已。

    本文完。


    简书:https://www.jianshu.com/p/79e963715d1d
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • android apk安装过程源码解析

    千次阅读 2017-07-13 23:11:18
    前言: 前一篇博客分析了一下PackageManagerService是如何解析apk的以及我们如何解析未安装apk中的androidManifest.xml文件。解析完肯定要安装的,索性写一篇关于android系统是如何...apk安装java层的起始位置是在Pm.

    *本篇文章已授权微信公众号 guolin_blog (郭霖)独家发布

    前言:

    前一篇博客分析了一下PackageManagerService是如何解析apk的以及我们如何解析未安装apk中的androidManifest.xml文件。解析完肯定要安装的,索性写一篇关于android系统是如何安装我们apk的流程分析。不过这里仅仅只分析java层面的代码,C层方面的就跳过了。

    apk安装起始点-Pm.java run()

    apk安装java层的起始位置是在Pm.java的run()中。

    这里有2个重点,第一个红框可以看到与我们的PackageManagerService有关,获取PackageManagerService的binder对象,与PackageManagerService进行通信。并且如果这个对象为null 则输出异常信息直接返回,其实也不难理解,PackageManagerService把我们的apk给扫描了,那安装应该也会在其中。所以这里可以肯定的是apk的安装实现就在我们的PackageManagerService中;第二点就是根据这个install标识来执行安装的方法了。那我们就进入到runInstall()中来看下,它的内部是调用了PackageManagerService的什么方法来进行apk安装的。

    runInstall()


    从上面的runInstall()方法的代码可以看到 有3个标红框的地方需要了解,第一个obs对象,用于接收PackageManagerService安装结果,其实从第三个红框就一目了然的了解INSTALL_SUCCEEDED,安装成功!就输出Success;第二个红框就是通过binder来调起PackageManagerService中的installPackageWithVerificationAndEncryption()方法。

    那接下来看下PackageManagerService中的installPackageWithVerificationAndEncryption()方法是如何操作的



    这个方法代码并不是很多,重点在最后一部分,通过handler发送一个INIT_COPY的消息,消息的内容是一个InstallParams对象。(这里要注意下InstallParams,等下会说下这个)
    那我们就只要找到handleMessage中处理这个INIT_COPY的消息代码就行了


    这里值得一提的是,安装apk的操作还需要一个服务,只有这个服务被bind了,才行进行下一步的工作,也就是通过handler继续发送一个消息。(这个服务是com.android.defcontainer.DefaultContainerService这里就不深层次分析了,它的作用就是用来解析APK,以及获取推荐安装路径的,安装的路径与内存情况以及一些标识来决定)
    绕来绕去,开启服务之后又发送了一个消息,那只好继续看下这个MCS_BOUND消息是如何处理的。

    MCS_BOUND:



    从代码中就能明显看到,这里又对服务进行了一次判断,是否已经连接,所以这个服务于我们的apk安装是共存的,其中mPendingInstalls就是用于存储需要安装的请求,只有当这个队列为空时才断开连接。(在INIT_COPY消息处理中被添加到mPendingInstalls中的),然后又调用了HandlerParams的startCopy()方法执行安装。


    可以看到以下几个重点
    1.HandlerParams是个抽象类
    2.箭头那可以知道,这个安装会尝试4次,超过4次就GG了
    3.执行handleStartCopy()方法
    4.执行handleReturnCode()方法

    在这之前值得一提的是前面installPackageWithVerificationAndEncryption()方法中通过handler发送消息,消息的内容是InstallParams,而InstallParams又是继承自HandlerParams这个抽象类,所以具体执行的是handleStartCopy()与handleReturnCode()的是InstallParams。

    不过InstallParams这个方法的代码很长,这里大致说下,InstallParams的handleStartCopy()的主要内容是通过com.android.defcontainer.DefaultContainerService来获取apk的推荐安装路径,通过这个路径来确定是内部安装还是SD卡安装,并且在这个方法的末尾,根据路径来创建不同的InstallArgs,分别是FileInstallArgs/SdInstallArgs执行各自的copyApk()方法!




    这里就从FileInstallArgs的copyApk()这条路线来分析。

    FileInstallArgs.copyApk()



    这个方法的重点部分就在红框位置,它的作用就是把我们的APK给复制到/data/app下,这个的路径可以通过context.getPackageCodePath()获取到,命名规则一般都是XXX.base.apk,不过这里是个临时文件,在安装的时候会对其进行改名操作。
    到这就分析完了InstallParams的handleStartCopy()方法,还有一个重点部分是handleReturnCode方法,所以接着分析handleReturnCode();

    handleReturnCode():




    这里很简单,调用了processPendingInstall()方法

    processPendingInstall():



    这里分为两部分:
    第一张图可以看到标红框部分执行了doPreInstall()和installPackageLI(),doPostInstall();
    doPreInstall和doPostInstall内部很简单,他的作用就是把我们安装过程中的临时文件删除,installPackageLI就是我们的正真安装操作。
    第二张图则是安装之后,发送一个POST_INTALL消息,告诉系统是否安装完毕。

    一系列的安装流程终于走到最后了,看下最终的install操作的方法

    installPackageLI:



    下面两个红框可以看到,分别通过两种不同的方式进行安装,具体的判断逻辑是根据包名来判断的,如果存在包名则是覆盖安装,而不存在就是安装一个新的apk。replacePackageLI()和installNewPackageLI()内部就和扫描系统中的package信息一样,如果不了解的,可以看下我这篇博客android 解析未安装apk中的AndroidManifest.xml以及系统源码分析  它把APK进行扫描,然后把apk中的信息存储到PackageManagerService中。了解4大组件的启动过程就会知道,有一段流程是在PackageManagerService中获取四大组件信息,这些信息就是通过把我们apk扫描安装然后存储到PackageMangerService中的。这样我们的apk就已经安装完成了。

    图中还有一个红框,args.doRename()方法(这个args就是我们的FileInstallArgs),前面提到过我们的apk文件会被复制到/data/app下,当复制进来的时候命名格式不是xx.apk,而这里的doRename()方法就是把这个复制进来的文件改名成XXXbase.apk。所以我们context.getPackageCodePath()获取到的路径就是改名后的信息。


    APK安装的源码分析就分析到这,大致的流程就是获取我们的安装位置,然后复制我们的apk文件到特定目录,然后安装我们的apk把apk的信息存储到PackageManagerService中。跟着上面的代码走一遍,相信还是很好理解的。










    展开全文
  • 以下是本人安装apk失败的经验之谈,不完善之处,还请指教。 1、未签名文件 Build apk生成的apk文件,或者直接运行,不经过签名过程。都属于这种。正常运行可以,但是无法使用版本更新和apk文件覆盖安装。 .....
  • 注:本文不对apk安装之前,系统所做的复杂工作做分析,只针对普通的apk安装过程进行简单的过程理解 一般情况下,在apk安装时,系统一般会显示一个安装界面,获取用户同意之后进行安装,并且有一些apk预处理相关的...
  • 我们知道,Windows应用程序的安装包是一个可执行的压缩包,安装的过程是把压缩包中的数据和依赖库拷贝到安装目录,再在桌面或启动栏创建快捷方式,那么安卓APK安装过程是不是也是这样的呢?本文将为大家解答这些...
  • Android 下载APK 安装APK 打开APK

    热门讨论 2014-05-23 11:25:42
    载一个apk文件 然后当你下载完成后 按钮的文字发生改变 变成点击安装 然后安装完成之后 变成打开 1分这个要求不过分吧 尴尬
  • Android APK安装与卸载机制

    千次阅读 2016-07-18 12:49:20
    本文主要介绍Android系统如何实现APK安装、卸载、更新等操作。主要内容包括以下内容: 安装和卸载APK的方法有哪些,每种方法实现的原理是什么?APK安装和卸载过程中,系统数据发生了哪些变化?Android App端...
  • Android apk安装过程

    千次阅读 2012-03-09 13:15:51
    通过将APK文件直接传到Android模拟器或Android手机中执行即可安装Android应用安装有如下四种方式 1. 系统应用安装――开机时完成,没有安装界面 2. 网络下载应用安装――通过market应用完成,没有安装界面 ...
  • 看了一篇关于apk安装过程的文章,感觉很好,在这转载一下,供大家学习。 Android应用安装有如下四种方式 1.系统应用安装――开机时完成,没有安装界面 2.网络下载应用安装――通过market应用完成,没有安装界面...
  • 关于android apk安装

    2012-05-14 14:10:33
    默认安装在/data/app下。 系统app在/system/app下。 可以将安装apk移动到sdcard中,但需要应用程序支持。 apk安装不像windows需要将exe文件解压出来,直接将apk放在app目录下即可。
  • Android APK安装完成自动删除安装包

    万次阅读 2018-01-10 16:10:24
    Android APK安装完成自动删除安装包 需要实现此功能,一般实际开发是在自动版本更新上,当更新完开始自动安装完毕后,删除内存卡里的安装包。实现方式很简单,监听应用广播,获取内存卡下的文件,删除! 1、监听...
  • Android apk安装过程

    千次阅读 2018-08-13 09:38:55
    system/app------系统自带的应用安装目录 data/app -------用户程序安装的目录,安装时把apk文件复制到此目录 data/data ------存放应用程序的数据 data/dalvik-cache-----将apk中的dex文件安装到dalvik-cache目录下...
  • Android Apk编译的apk安装失败解决

    千次阅读 2018-07-05 10:16:34
    一:如果直接拷贝到手机进行安装 提示安装失败,解决有两种第一:在我们项目中的 gradle.properties文件中加入,下面的那句android.injected.testOnly=false第二:也就是在我们的App中的AndroidManifest.xml文件中...
  • android APK 安装后显示名称

    千次阅读 2014-04-29 19:46:50
    通过修改AndroidManifest.xml中的android:label="@string/app_name"可以修改apk安装后的显示名称;
  • Android APK安装常见错误列表

    万次阅读 多人点赞 2015-08-04 23:53:38
    adb的安装过程分为传输与安装两步。 在出错后,adb会报告错误信息,但是信息可能只是一个代号,需要自己定位分析出错的原因。  下面是从网上找到的几种常见的错误及解决方法: 1、INSTALL_FAILED_INVALID_APK:...
  • 开发 Android 应用后,一般都会安装到手机上去运行,了解应用是如何安装到手机上的,可以更好的理解应用的本质,理解应用是如何运行的,在自己开发的应用遇到一些问题时,会从更深层次去分析,快速定位找到原因。...
  • android apk安装到模拟器 不显示

    千次阅读 2016-05-18 21:24:24
    问题android开发时,apk安装到模拟器,主菜单中不显示,但是通过search可以查询的到。 解决后来,我发现apk名字比较长是"this is firstactivity",改为"first activity"后,显示了。所以,推测是apk名字过长的缘故。
  • Android apk 安装路径及流程

    千次阅读 2012-09-20 13:34:13
    安装过程:复制APK安装包到data/app目录下,解压并扫描安装包,把dex文件(Dalvik字节码)保存到dalvik-cache目录,并data/data目录下创建对应的应用数据目录。 卸载过程:删除安装过程中在上述三个目录下创建的文件...
  • Android安装APK

    千次阅读 2019-05-07 14:35:03
    android安装APK android7.0内容提供者 android8.0权限
  • PX30 android8.1 APK 安装

    2019-11-21 19:37:18
    目录下: px30_android8.1\device\rockchip\rk3326 将APK放到目录下编译即可
  • Android apk安装失败的原因

    千次阅读 2018-06-14 22:09:57
    签名和已安装版本不一致 低版本去覆盖高版本 第三种是打包方式问题: 注意:如果只勾选V2打出来的包是不完整的,所以V1和V2都得勾选;只勾选V2在真机上是跑不起来的...
  • Android apk安装监听的几个广播

    千次阅读 2015-09-22 16:39:38
    <receiver android:name=".MyBroadcast" android:enabled="true" > <action android:name="android.intent.action.PACKAGE_ADDED"> <action android:name="android.intent.action.PACKAGE_CHANGED"> <action ...
  • Android 构建系统编译应用资源和源代码,然后将它们打包成可测试、部署、签署和分发的 APK。一般使用 Android Studio开发的时候使用Gradle构建工具包来自动执行和管理构建流程,同时也可以灵活地自定义构建配置。 ...
  • android apk安装签名冲突错误解决

    千次阅读 2016-06-08 13:45:23
    一.error: INSTALL_FAILED_UPDATE_INCOMPATIBLE 实际未完全卸载应用。几个方法: 1:adb uninstall 包名完成卸载 2.手动卸载  adb shell($1:应用名称) ... rm -rf /data/dalvik-cache/data@app@$1*.apk
  • 遇到这个问题 一般都是一头雾水 不知从何下手 解决办法: adb 进入系统 执行 pm install xxx.apk 就会报具体错误
  • Android apk安装过程

    2014-11-05 16:46:11
    Android apk安装过程   Android应用安装有如下四种方式 1.系统应用安装――开机时完成,没有安装界面 2.网络下载应用安装――通过market应用完成,没有安装界面 3.ADB工具安装――没有...
  • android 安装本地apk

    2015-05-16 15:51:29
    用于android程序安装指定目录下的apk

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 592,451
精华内容 236,980
关键字:

安卓apk安装目录