首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >“Android应用程序怎么样”(Facebook等)安装在android手机上?

“Android应用程序怎么样”(Facebook等)安装在android手机上?
EN

Stack Overflow用户
提问于 2015-05-20 11:26:00
回答 1查看 2.7K关注 0票数 8

我知道如何将应用程序安装到Android设备上,例如从Play-Store或通过.apk文件。但我想了解安装的实际过程。

例如在Windows上:

  • 序列号等被放置在注册表中
  • 对软件运行很重要的文件被放置在Program文件夹(主.exe等)中。

到目前为止,我对Android应用程序安装过程的了解是:

  • 在执行android应用程序之后(安装后),新下载的数据被放置在诸如: Android/data或Android/obb等位置。
  • 如果由Android开发人员具体表示,文件也可以放在其他地方,例如在二级存储(存储卡、云存储等)上。

但除此之外,我对Android安装过程的了解非常有限,例如:

  • 我不知道与Android程序的执行相关的重要文件放在哪里(在Windows、.exe、相关媒体、库等方面)。
  • 同样,我也不知道这些文件是如何在Android设备(安装后)上构建的,例如,这些文件是否在诸如java、res、菜单、布局等文件夹中结构化,就像在像Android这样的开发环境中那样?
  • 我也不知道在安装后(从android安装文件或apk解压缩后)用户的设备上存储了哪些应用程序文件类型,例如,在开发过程中,它们被存储为.java和或.xml文件。

希望有人能填补空白,谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-21 19:06:43

入门

PackageInstaller调用InstallAppProgress活动来接收用户的指令。InstallAppProgress将要求PackageManager服务通过分期付款方式安装软件包。源代码可在<Android Source>/packages/apps/PackageInstaller上获得。

当我们安装APK文件时,Package解析软件包(APK)文件并显示确认,当用户按OK按钮时,Package调用方法名为installPackage,其中包含uriinstallFlags、观察者、installPackageName四个参数。启动一个名为" Package“的服务,现在所有模糊的事情都发生在这个服务中。您可以在PackageInstallerActivity.java源代码中检查PackageInstaller和InstallAppProgress.java。在system_service进程中运行的和作为本机进程运行的守护进程( Package )都是在系统启动时启动的。

APK 文件存储在 Android 中的

  1. 预装(即照相机、日历、浏览器等)存储在/system/app/中的APK
  2. 用户安装(ApiDemo、Any.do等)存储在/data/app/中的APK
  3. Package创建数据目录/data/data/<package name>/以存储数据库、共享首选项、本机库和缓存数据

您可能会看到apk文件和*.odex文件用于相同的APKODEX文件是完全不同的讨论和目的。

详细说明了什么是APK安装过程?

Package Manager Service中执行以下进程。

  • 等待
  • 将包添加到安装过程的队列中
  • 确定包安装的适当位置。
  • 确定安装/更新新
  • apk文件到给定目录的副本。
  • 确定应用程序的UID
  • 请求分批to守护进程
  • 创建应用程序目录并设置权限
  • 将dex代码提取到缓存目录
  • 以反映和packages.list /system/data/packages.xml的最新状态
  • 广播到系统,以及安装效果的名称是完整的包Intent.ACTION_PACKAGE_ADDED:如果是新的( Intent.ACTION_PACKAGE_REPLACED):一个更新的情况。

包管理器如何存储数据?

Package将应用程序信息存储在位于/data/system中的三个文件中。从Android 4 ICS仿真器图像中提取以下示例。

packages.xml:This文件包含权限和包/应用程序的列表。这个xml文件存储两个东西: 1、权限2、包(应用程序)、权限存储在<permissions>标记下。每个权限有三个属性,即名称、包和保护。名称属性具有我们在AndroidManifest.xml中使用的权限名,package属性表示属于包的权限,在大多数情况下,"android“是值,因为<permission>标记包含默认权限,而保护指示安全级别。

packages.list:它是一个简单的文本文件,包含包名、用户id、标志和数据目录,我找不到任何完美的描述,但我假设packages.list文件只保留重要的信息,可以更快地查找已安装的包。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
com.android.launcher 10013 0 /data/data/com.android.launcher
com.android.quicksearchbox 10033 0 /data/data/com.android.quicksearchbox
com.android.contacts 10001 0 /data/data/com.android.contacts
com.android.inputmethod.latin 10006 0 /data/data/com.android.inputmethod.latin

packages-stoped.xml:此文件包含已停止状态的包列表,存储声明的应用程序无法接收任何广播。

,在这里我可以找到Package和Package ?的源代码

包管理器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
frameworks/base/services/java/com/android/server/pm/Settings.java
frameworks/base/services/java/com/android/server/pm/PackageManagerService.java
frameworks/base/services/java/com/android/server/pm/IPackageManager.aidl
frameworks/base/services/java/com/android/server/pm/PackageSignatures.java
frameworks/base/services/java/com/android/server/pm/PreferredActivity.java
frameworks/services/java/com/android/server/PreferredComponent.java
frameworks/core/java/android/content/IntentFilter.java
frameworks/base/core/java/android/content/pm/PackageParser.java
frameworks/base/services/java/com/android/server/pm/Installer.java
frameworks/base/core/java/com/android/internal/app/IMediaContainerService.aidl
frameworks/base/packages/DefaultContainerService/src/com/android/defcontainer/DefaultContainerService.java

包安装程序

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageInstallerActivity.java
packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageUtil.java
packages/apps/PackageInstaller/src/com/android/packageinstaller/InstallAppProgress.java.

链接指向:链接1链接2

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30358687

复制
相关文章
MySQL实现统计数据并插入数据的存储过程
统计存储过程,这里是将统计的结果插入一个表中,后台可以有定时任务来调此存储过程。以下业务是统计仓库中商品流转情况,包括:日期、商品总数、入库数量、出库数量。
用户8983410
2021/11/01
1.2K0
MySQL - MySQL不同存储引擎下索引的实现
MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,我们这里主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。
小小工匠
2021/08/17
1K0
java中==、equals的不同AND在js中==、===的不同
       1.==操作符:首先,对于非基本数据类型的对象比较,相同内存中存储的变量的值是否相等,注意是相同内存地址的才可,并且数值相同(当然地址相同,值也一定相同)才会返回true.     但是,对于基本数据类型的比较(比如:int flot double等),值相同,"=="比较便会返回true.(这是编译的规则,当进行基本数据类型的比较时,会编译生成if_icmpne指令不会进行比较地址。而进行对象比较时,会生成if_icmpne指令,会比较地址。生成的指令都是不同的)。
洋仔聊编程
2019/01/15
4K0
mysql—mysql中如何存储日期数据
1,特点 1)以YYYY-MM-DD HH:MM:SS[.fraction]格式存储日期时间,在mysql5.6前可以只能存储到秒,在5.6后能存储到微秒 2)datetime类型与时区无关,占用8个字节的存储空间 3)时间范围公元1000-01-01 00:00:00到9999-12-31 23:59:59,存储的时间范围非常广
全栈程序员站长
2021/04/07
5K0
MySQL---数据库从入门走向大神系列(八)-在java中执行MySQL的存储过程
http://blog.csdn.net/qq_26525215/article/details/52143733
谙忆
2021/01/21
1.1K0
MySQL---数据库从入门走向大神系列(八)-在java中执行MySQL的存储过程
MySQL统计数据库所有表的数据量
场景:mysql统计一个数据库里所有表的数据量,最近在做统计想查找一个数据库里基本所有的表数据量,数据量少的通过select count再加起来也是可以的,不过表的数据有点多,不可能一个一个地查
SmileNicky
2021/12/14
6.9K0
MySQL统计数据库所有表的数据量
在 git 中如何配置用户信息
最近买了台新的笔记本,重新装了一些软件,这次就说说怎么在 git 中配置用户信息吧。
前端西瓜哥
2022/12/21
1K0
在Linux中如何禁止用户登录
默认情况下,创建用户时,将按照/etc/default/useradd文件中定义的为用户分配shell。
用户9104802
2021/11/22
6.7K0
SpringBoot中@Transaction在不同MySQL引擎下的差异性
在springboot进行事务测试的时候,发现事务没有生效,在方法上添加了@Transactional注解并让方法先执行插入操作,接着再抛出个异常,触发事务回滚,代码如下:
是Vzn呀
2022/07/14
1K0
SpringBoot中@Transaction在不同MySQL引擎下的差异性
MySQL中的存储引擎
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
changxin7
2019/09/10
1.8K0
MySQL存储过程,视图,用户管理
一张虚拟表,就是将一个经常被使用的查询作为一个虚拟表,开发者查询的时候不需要再次书写SQL,而是直接调用对应的视图就可,调用视图以后MySQL会执行这个查询SQL。
石的三次方
2021/01/05
9380
在 Kubernetes 中,如何动态配置本地存储?
Kubernetes 中使用节点的本地存储资源有 emptyDir、hostPath、Local PV 等几种方式。这之中,emptyDir 无法持久化数据,hostPath 方式需要手动管理卷的生命周期,运维压力大。因此在某些场景下,如果用户出于性能和运维成本考虑需要使用本地存储,Local PV 似乎是唯一选择。
CNCF
2019/12/05
3.4K0
在 Kubernetes 中,如何动态配置本地存储?
mysql中的数据库对用户权限做限制
mysql中限定用户对数据库的权限 默认的MySQL安装之后根用户是没有密码的 先用根用户进入: # mysql -u root 执行: mysql> GRANT ALL PRIVILEGES ON *.* TO root@localhost IDENTIFIED BY “123456”; 用的是123456做为root用户的密码,我这里是做个例子,要是用123456做密码 那还不象不设置密码了:)
全栈程序员站长
2021/07/23
4K0
在python中操作MySQL数据库
本篇主要介绍如何使用pymysql操作数据库,下面直接进入正文 1.查询数据 # coding: utf-8 # author: hmk import pymysql.cursors # 连接数据库 conn = pymysql.connect(host='localhost', # 数据库地址 port=3306, #端口默认是3306,不写这个也可以,如果不是3306则需要在此声明 user='root',
冰霜
2022/03/15
4.5K0
在 Kubernetes 中,如何动态配置本地存储?
Kubernetes 中使用节点的本地存储资源有 emptyDir、hostPath、Local PV 等几种方式。这之中,emptyDir 无法持久化数据,hostPath 方式需要手动管理卷的生命周期,运维压力大。因此在某些场景下,如果用户出于性能和运维成本考虑需要使用本地存储,Local PV 似乎是唯一选择。
kubernetes中文社区
2019/08/27
3.1K0
在 Kubernetes 中,如何动态配置本地存储?
审计对存储在MySQL 8.0中的分类数据的更改
使用敏感信息时您需要拥有审计日志。通常,此类数据将包含一个分类级别作为行的一部分,定义如何处理、审计等策略。在之前的博客中,我讨论了如何审计分类数据查询。本篇将介绍如何审计对机密数据所做的数据更改。
MySQLSE
2020/11/25
4.7K0
tcpdump在mySQL数据库中的应用实践
tcpdump在我们平时运维中充当了很重要的角色,对复杂问题的排查、分析起到了至关重要的作用,确实为运维中的一大利器。
MySQL数据库技术栈
2020/08/05
5.2K0
tcpdump在mySQL数据库中的应用实践
点击加载更多

相似问题

没有在Ruby线程中执行的代码

23

主线程的执行上下文

32

线程没有执行

21

用于的输出通道的并发(线程执行器)

11

如何使用主动通道对话在通道中启动新线程?

16
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文