apk,task,进程区别

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

apk,task,进程区别                

 

apk一般占一个dalvik,一个进程,一个task。通过设置也可以多个进程,占多个task。

task是一个activity的栈,其中"可能"含有来自多个App的activity

默认情况下,同一个应用程序中的所有组件运行在同一个进程中,而且绝大多数的应用程序也都是这样的。但是,如果我们想要控制让某个特定的组件属于某个进程,我们可以在manifest文件中进行配置。 
在 每种组件元素(activity、service、receiver、provider)的manifest条目中,都支持一个 “android:process”的属性,通过这个属性,我们可以指定某个组件运行的进程。我们可以通过设置这个属性,让每个组件运行在它自己的进程 中,也可以只让某些组件共享一个进程。我们要可以通过设置“android:process”属性,让不同应用程序中的组件运行在相同的进程中,这些应用 程序共享相同的Linux用户ID,拥有相同的证书。 
<application>元素也有一个“android:process”属性,可以设置一个应用于全部组件的默认值。 
    当可用内存数量低,而一些与用户即时交互的进程又需要内存时,Android随时可能会终止某个进程。运行在被终止的进程中的组件会因此被销毁,但是,当再次需要这些组件工作时,就会再启动一个进程。 
    在决定要终止哪个进程时,Android系统会权衡它们对于用户的重要性。例如,相较于运行可见activities的进程,终止一个运行不可见activities的进程会更加合理。是否终止一个进程,依赖于运行在这个进程中的组件的状态。 
如果不能将两个activity放入同一个application中的话,可以通过在各自的manifest中设置以下属性,让这两个activity强制运行在同一个进程中,从而可以充分利用进程内共享的资源,减少内存占用: 

Java代码  收藏代码

  1. (1)设置相同的User Id:  

  2. <manifest android:sharedUserId="aaa.bbb"  

  3. (2)被调用的activity设置以下属性:  

  4. <activity android:multiprocess="true"  

  5. 或者  

  6. <activity android:process="com.cienet.test"  



对于3D OpenGL程序,修改以上属性后,被调用的activity的内存占用会明显减少,比如:30MB -> 2MB。 

可以做如下测试如何共享一个进程 

Java代码  收藏代码

  1. 加入android:sharedUserId="aaa.bbb"没有  

  2. android:process="com.cienet.test"  

  3. 07-12 15:42:34.781: ERROR/Dean(7615): Binder.getCallingPid()7615  

  4. 07-12 15:42:34.785: ERROR/Dean(7615): runningappprocessinfo.pid:7615runningappprocessinfo.processNamecom.cienet.testa  

  5. 07-12 15:42:34.785: ERROR/Dean(7615): pkgname:7615:com.cienet.testa  

  6.   

  7.   

  8. 07-12 15:42:24.722: ERROR/Dean(7602): Binder.getCallingPid()7602  

  9. 07-12 15:42:24.726: ERROR/Dean(7602): runningappprocessinfo.pid:7602runningappprocessinfo.processNamecom.cienet.testb  

  10. 07-12 15:42:24.726: ERROR/Dean(7602): pkgname:7602:com.cienet.testb  

  11.   

  12. 加入android:process="com.cienet.test"到B  

  13.   

  14. 07-12 15:46:41.933: ERROR/Dean(7738): Binder.getCallingPid()7738  

  15. 07-12 15:46:41.937: ERROR/Dean(7738): runningappprocessinfo.pid:7738runningappprocessinfo.processNamecom.cienet.test  

  16. 07-12 15:46:41.937: ERROR/Dean(7738): pkgname:7738:com.cienet.testb  

  17.   

  18. 07-12 15:47:13.246: ERROR/Dean(7761): Binder.getCallingPid()7761  

  19. 07-12 15:47:13.246: ERROR/Dean(7761): runningappprocessinfo.pid:7761runningappprocessinfo.processNamecom.cienet.testa  

  20. 07-12 15:47:13.250: ERROR/Dean(7761): pkgname:7761:com.cienet.testa  

  21.   

  22. 同时加入android:process="com.cienet.test"到A  

  23.   

  24. 07-12 15:50:24.988: ERROR/Dean(7878): getApplicationInfo:publicSourceDir/data/app/com.cienet.testa-1.apk  

  25. 07-12 15:50:24.988: ERROR/Dean(7878): getApplicationInfo:descriptionRes0  

  26. 07-12 15:50:24.988: ERROR/Dean(7878): Binder.getCallingPid()7878  

  27. 07-12 15:50:24.992: ERROR/Dean(7878): runningappprocessinfo.pid:7878runningappprocessinfo.processNamecom.cienet.test  

  28. 07-12 15:50:24.992: ERROR/Dean(7878): pkgname:7878:com.cienet.testa  

  29.   

  30.   

  31. 07-12 15:50:46.964: ERROR/Dean(7878): getApplicationInfo:publicSourceDir/data/app/com.cienet.testb-1.apk  

  32. 07-12 15:50:46.964: ERROR/Dean(7878): getApplicationInfo:descriptionRes0  

  33. 07-12 15:50:46.964: ERROR/Dean(7878): Binder.getCallingPid()7878  

  34. 07-12 15:50:46.968: ERROR/Dean(7878): runningappprocessinfo.pid:7878runningappprocessinfo.processNamecom.cienet.test  

  35. 07-12 15:50:46.972: ERROR/Dean(7878): pkgname:7878:com.cienet.testa  

  36.   

  37.   

  38. 去掉android:sharedUserId="aaa.bbb"  

  39. 07-12 15:52:29.574: ERROR/Dean(7967): getApplicationInfo:publicSourceDir/data/app/com.cienet.testb-2.apk  

  40. 07-12 15:52:29.578: ERROR/Dean(7967): getApplicationInfo:descriptionRes0  

  41. 07-12 15:52:29.578: ERROR/Dean(7967): Binder.getCallingPid()7967  

  42. 07-12 15:52:29.578: ERROR/Dean(7967): runningappprocessinfo.pid:7967runningappprocessinfo.processNamecom.cienet.test  

  43. 07-12 15:52:29.578: ERROR/Dean(7967): pkgname:7967:com.cienet.testb  

  44.   

  45.   

  46. 07-12 15:53:06.730: ERROR/Dean(7990): getApplicationInfo:publicSourceDir/data/app/com.cienet.testa-2.apk  

  47. 07-12 15:53:06.730: ERROR/Dean(7990): getApplicationInfo:descriptionRes0  

  48. 07-12 15:53:06.730: ERROR/Dean(7990): Binder.getCallingPid()7990  

  49. 07-12 15:53:06.734: ERROR/Dean(7990): runningappprocessinfo.pid:7990runningappprocessinfo.processNamecom.cienet.test  

  50. 07-12 15:53:06.734: ERROR/Dean(7990): pkgname:7990:com.cienet.testa  



如上证明那个APK共享进程要两个条件(1)设置相同的User Id: 

(2)被调用的activity设置以下属性: 

Java代码  收藏代码

  1. <activity android:multiprocess="true"  

  2. 或者  

  3. <activity android:process="com.cienet.test"   

 

1. 同一Apk中的同一包中的多个Activity调用时进程状况验证

[1]创建Project: 

   project name: FirstProject 

   package     : com.demo 

   默认Activity : MainActivity 

[2]添加一个新的Activity: 

   name: SecondActivity 

[3]修改布局。在MainActivity布局中添加一个Button,当点击此Button时启动SecondActivity。在SecondActivity的布局中放置一个Textview,以证明SecondActivity已启动。 

[4]运行程序,查看此App进程情况: 

   USER:app_36  PID:8360  NAME:com.demo 

[5]点击按钮,启动SecondActivity,再次查看进程情况: 

   USER:app_36  PID:8360  NAME:com.demo

结论:进程列表没有变化,两个Activity运行在同一进程中

2. 同一Apk中的不同包的Activity调用时进程状况验证

[1]将SecondActivity挪到包com.demo.second中去,相应修改AndroidManifest.xml中的name为:com.demo.second.SecondActivity 

[2]运行程序,查看此时进程情况: 

   USER:app_36  PID:10593  NAME:com.demo 

[3]点击按钮启动SecondActivity,查看此时进程情况: 

   USER:app_36  PID:10593  NAME:com.demo 

结论:进程列表没有变化,两个Activity运行在同一进程中。即进程name只受AndroidManifest.xml中manifset结点的package属性影响。

3. 同一Apk中Activity process属性修改后进程状况验证

[1]为SecondActivity添加process属性,其值为":abc",也可以随便是其他的":"开头的字符串,常见的名字是":remote":

<activity android:name="com.demo.second.SecondActivity" android:process=":abc"> </activity>

[2]运行程序,查看进程情况: 

   USER:app_36  PID:12137  NAME:com.demo 

[3]点击按钮,启动SecondActivity,查看进程情况: 

   USER:app_36  PID:12137  NAME:com.demo 

   USER:app_36  PID:12303  NAME:com.demo:abc

结论:进程表多了一项。两个Activity各自有一个进程,SecondActivity的进程名称为 包名+后缀

 

 

 

 

 

4. 不同Apk中不同包名的Activity进程状况验证 

[1]运行FirstProject:

   USER:app_36  PID:12137  NAME:com.demo

[2]创建SecondProject:

   project name: SecondProject 

   package:com.demo2 

   默认Activity:MainActivity

[3]运行SecondProject: 

   USER:app_37  PID:14191  NAME:com.demo2 

结论:进程表多了一项。两个Activity各自有一个进程,同时其进程用户id、包名也不同,互不影响

 

5. 不同Apk,签名相同、包名相同的Activity进程状况验证 

[1]修改SecondProject的包也为com.demo,相应要修改AndroidManifest.xml内容。 

[2]运行SecondProject,查看进程情况: 

   USER:app_36  PID:14944  NAME:com.demo 

结论:进程表只有一项,但是实际上FirstProject此时已经被覆盖了,系统中只存在SecondProject了,因为模拟器调试时apk使用的签名key都是一样的,系统看到key一样,包名一样认为这个包就是FirstProject所以覆盖掉了。 

可以通过DDMS复制/data/system/packages.xml查看一下内容:

<package name="com.demo" codePath="/data/app/com.demo.apk" system="false" ts="1279955425000" version="1" userId="10036">


这个文件里面,package name都是唯一的,同时可以看到用户名是通过userId来决定的。

6.不同Apk,签名不相同,包名相同的Activity进程状况验证

[1]在Eclipse的Package Explorer导航树中选中FirstProject,点右键。 

[2]Android tools-->Export Signed Application Package,按照向导创建一个用指定key签名的apk包。 

[3]同样导出Second Project。 

[4]切换窗口到模拟器,按Home键-->按Menu键-->设置-->应用程序-->管理应用程序-->SecondProject-->卸载。这是为了用命令行安装做准备。 

[5]启动一个命令行窗口,执行adb install firstproject.apk,会提示成功安装。 

[6]执行adb install secondproject.apk,提示安装失败。 

结论:

1> 默认的Apk其安装时会分配新的UserId,即此时FirstProject以及SecondProject的UserId可以认为是不同的。 

2> 包名不同,则签名key是否相同无所谓,两个apk都可以安装。【第4个实验】 

3> 包名相同时,签名key相同则会覆盖【第5个实验】;签名不同则第二个apk安装会失败。【第6个实验】

 

7.不同Apk,Share User Id相同,包名不同时进程情况分析

[1]修改firstproject、secondproject的AndroidManifest.xml的manifset结点,增加属性

android:sharedUserId="com.demouser"

 

[2]修改secondproject的包为com.demo2,不然其会覆盖firsetproject。 

[3]运行firsetproject、secondproject,查看进程列表: 

   USER:app_35  PID:19993  NAME:com.demo2 

   USER:app_35  PID:20045  NAME:com.demo2 

结论:

仍然存在两个进程。但是进程的用户名一样,说明shareUserId确实有效了,进程pid不相同。 

再次导出/data/system/packages.xml,查看其内容,可以看到两个项目的UserId都是10035,确实是一样的:

<package name="com.demo" codePath="/data/app/com.demo.apk" system="false" ts="1279957484000" version="1" sharedUserId="10035"> <package name="com.demo2" codePath="/data/app/com.demo2.apk" system="false" ts="1279957473000" version="1" sharedUserId="10035">

 

8.不同Apk,Share User Id相同,包名不同、指定Activity的process属性进程情况分析

[1]修改SecondProject的MainActivity的process属性,指定绑定到进程名为com.demo的进程上:

<activity android:name=".MainActivity" android:label="@string/app_name" android:process="com.demo">

[2]运行firstProject、SecondProject,查看进程情况: 

    USER:app_35  PID:21387  NAME:com.demo 

结论:两个Activity运行于同一个进程。

 

9.不同Apk,Share User Id相同,包名不同、签名key不同

经实验,安装第二个apk时会提示INSTALL_FAILED_UPDATE_INCOMPATIBLE错误,安装失败。 

总结:

UserId不同时: 

    包名不同:

        未设定process属性时,各自的Activity在各自的进程。即使process指定了包名,也不会和另一个用户的同名包共享进程。 

    包名相同: 

        签名相同:覆盖旧的同包名apk。签名不同:新的apk会安装失败。【签名key一般都是不同的】

UserId相同时: 

    包名不同:

        未设定process属性时,各自的Activity在各自的进程。process属性指定,则可以共享进程。 

    包名相同: 

        签名相同:覆盖旧的同包名apk。签名不同:新的apk会安装失败。【签名key一般都是不同的】


转载于:https://my.oschina.net/zhuzihasablog/blog/196218

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/401981.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 线程 —— 基础篇

一、操作系统中线程和进程的概念 现在的操作系统是多任务操作系统。多线程是实现多任务的一种方式。 进程是指一个内存中运行的应用程序&#xff0c;每个进程都有自己独立的一块内存空间&#xff0c;一个进程中可以启动多个线程。比如在Windows系统中&#xff0c;一个运行的exe…

【Java并发性和多线程】线程安全及不可变性

2019独角兽企业重金招聘Python工程师标准>>> 本文为转载学习 原文链接&#xff1a;http://tutorials.jenkov.com/java-concurrency/thread-safety-and-immutability.html 译文链接&#xff1a;http://ifeve.com/thread-safety-and-immutability/ 当多个线程同时访问…

Java 高级—— IO 基础

一、File 类 先看一下File 类的定义 [java] view plaincopy public class File extends Object implements Serizliable Comparable<File> 从定义看&#xff0c;File类是Object的直接子类&#xff0c;同时它继承了Comparable接口可以进行数组的排序。 File类的操作包括…

安装 SharePoint 2013 Foundation

一、Foundation版本的区别Foundation版本的区别见附件&#xff08;英文&#xff09;。官网下载地址 http://www.microsoft.com/zh-cn/download/details.aspx?id35488二、安装必备软件三、独立安装模式1. 启动安装向导2. 接受软件许可条款3. 选择服务器类型和数据位置4. 结束安…

Java 异常处理机制

异常处理是程序设计中一个非常重要的方面&#xff0c;也是程序设计的一大难点&#xff0c;从C开始&#xff0c;你也许已经知道如何用if...else...来控制异常了&#xff0c;也许是自发的&#xff0c;然而这种控制异常痛苦&#xff0c;同一个异常或者错误如果多个地方出现&#x…

架构师未来性的基础:简单性

作者&#xff1a;高焕堂&#xff0c;misoo.twqq.com 首页&#xff1a;Backee e架构师未来性的基础&#xff1a;简单性 Apple公司创始人乔布斯(Steve Jobs)曾说到&#xff1a;“简单比复杂更难&#xff0c;你必须努力让你的想法变得清晰…

Android 基础—— 对Context的理解与使用技巧

一、Context 基础概念 1、什么是Context 1) Context是一个抽象类&#xff0c;其通用实现在ContextImpl类中。 2) Context&#xff1a;是一个访问application环境全局信息的接口&#xff0c;通过它可以访问application的资源和相关的类&#xff0c;其主要功能如下&a…

Android 四大组件 —— 广播(广播机制解析)

在网络通信中&#xff0c;一个IP网络范围中最大的IP 地址是被保留作为广播地址来使用的。比如某个网络的IP 范围是192.168.0.XXX&#xff0c;子网掩码是255.255.255.0&#xff0c;那么这个网络的广播地址就是192.168.0.255。广播数据包会被发送到同一网络上的所有端口&#xff…

Android 基础 —— 活动的生存周期

一、返回栈 Android 中的活动是可以层叠的。我们每启动一个新的活动&#xff0c;就会覆盖在原活动之上&#xff0c;然后点击Back 键会销毁最上面的活动&#xff0c;下面的一个活动就会重新显示出来。 其实Android 是使用任务&#xff08;Task&#xff09;来管理活动的&#xff…

产品经理做市场调研和数据分析的方法

产品经理&#xff0c;你对用户的需求了解多少呢&#xff1f;你知道用户想要什么样的产品吗&#xff1f;你想知道用户将会如何看待你的产品吗&#xff1f;你想知道你设计的产品在用户中的口碑如何吗&#xff1f; 是 的。每一个产品经理都希望在产品开始立项设计前&#xff0c;得…

Android 基础 —— 活动的启动模式

活动的启动模式来说应该是个全新的概念&#xff0c;在实际项目中我们应该根据特定的需求为每个活动指定恰当的启动模式。启动模式一共有四种&#xff0c;分别是standard、singleTop、singleTask 和singleInstance &#xff0c; 可以在AndroidManifest.xml 中通过给<activity…

Android 四大组件 —— 服务

一、服务是什么 服务&#xff08;Service&#xff09;是Android 中实现程序后台运行的解决方案&#xff0c;它非常适合用于去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面&#xff0c;即使当程序被切换到后台&#xff0c;或者用户打开了…

Highlighting System

Highlighting System 法线贴图漫反射着色器 Unity论坛&#xff1a;http://forum.unity3d.com/threads/143043-Highlighting-System-Released 需要条件 Requires Unity 3.5.6 or higher.This package requires Unity Pro, as it uses post-processing!Now supports Unity iOS Pr…

Android 基础 —— 模拟实现拨打电话功能

前面已经学习活动的显示跳转及隐式跳转&#xff0c;也学习 TextView 及 Button 两个控件的使用&#xff0c;下面我们来学习 EditText的使用&#xff1a; EditText 是程序用于和用户进行交互的另一个重要控件&#xff0c;它允许用户在控件里输入和编辑内容&#xff0c;并可以在程…

Android 四大组件 —— 活动(活动的隐式跳转)

上一篇我们讨论了活动的显示跳转&#xff0c;现在来学习活动的隐式跳转 相比于显式Intent&#xff0c;隐式Intent 则含蓄了许多&#xff0c;它并不明确指出我们想要启动哪一个活动&#xff0c;而是指定了一系列更为抽象的action 和category 等信息&#xff0c;然后交由系统去分…

ALAssetsLibrary-代码操作iOS相册资源

2019独角兽企业重金招聘Python工程师标准>>> 在iOS中&#xff0c;我们调用摄像头和选择相册中的资源&#xff0c;我们可以使用&#xff1a;UIImagePickerController类来完成。 当然&#xff0c;我们也可以不使用UI的形式来访问iOS设备的相册资源。 那就是使用&#…

Android 四大组件 —— 活动(使用Intent 实现活动的显示跳转)

一、什么是Intent&#xff1f;Intent的中文意思是目的。在Android中也是“目的”的意思。就是我们要去哪里&#xff0c;从这个activity要前往另一个Activity就需要用到Intent。 下面是 Intent 两个最基本的函数&#xff1a; 1、定义一个Intent [java] view plaincopy Intent in…

Android 项目在Eclipse中的目录结构

Android工程目录 如果使用Eclipse插件ADT开发应用程序&#xff0c;必须要熟悉工程的目录结构&#xff0c;清楚各个目录下面放置的是什么东西。Android工程主要的目录有&#xff1a;src、bin、gen、res等。 不同的Android平台目录结构是不同的&#xff0c;下面以Android 2.3.…

Exynos4412 Uboot 编译工具 —— 交叉工具链 arm-linux-gcc 的安装

一、什么是交叉编译&#xff1f; 在开发主机运行编译器编译内核、应用程序。内核和程序在目标机上运行&#xff0c;这个编译过程被称为交叉编译。编译器运行在开发主机&#xff08;通常是X86体系的PC机&#xff09;上&#xff0c;编译出的的代码是目标机体系结构的&#xff0c;…

Linux学习之CentOS(一)--CentOS6.4环境搭建

一、前言作为一个想从事j2ee后台开发的程序猿&#xff0c;linux系统怎能不学呢&#xff1f;所以&#xff0c;这几天自己准备学习一下linux操作系统。废话不多说&#xff0c;直奔主题。要学linux开发&#xff0c;首先得要安装linux系统吧&#xff0c;这里我在选择之前也挺迷茫&a…