一个apk(就是一个包)一般占一个dalvik,一个进程。(可以设置一个apk占多个进程,多个apk占一个进程)
一个task可有占多个进程(相当于装了多个应用(一个应用跳转另一个应用Acitivity就是这种情况))。
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强制运行在同一个进程中,从而可以充分利用进程内共享的资源,减少内存占用:
(1)设置相同的User Id: <manifest android:sharedUserId="aaa.bbb" (2)被调用的activity设置以下属性: <activity android:multiprocess="true" 或者 <activity android:process="com.cienet.test"
原文链接http://mypyg.iteye.com/blog/720406
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]运行程序,查看此Ap进程情况:
USER:app_36 PID:8360 NAME:com.demo
点击按钮,启动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各自有一个进程,同时其进程用户名、包名也不同,互不影响。
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,提示安装失败。
默认的Apk其安装时会分配新的UserId,即此时FirstProject以及SecondProject的UserId可以认为是不同的。
包名不同,则签名key是否相同无所谓,两个apk都可以安装。【第4个实验】
包名相同时,签名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确实有效了,但是进程名字一个不一样。
再次导出/data/system/packages.xml,查看其内容:
- <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">
可以看到两个项目的UserId都是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一般都是不同的】
相关推荐
【XDA汉化组】kszxcvbnm_进程杀手_Advanced_Task_Killer_Pro_1.9.7B92汉化版.apk
KillApps是一个非常强大的Task Killer,可以杀死任务和进程并阻止它们自动重新启动。 速度 提升器 KillApps由于后台运行的应用程序众多,因此可以在手机运行缓慢时加快速度。 RAM 清理器KillApps通过释放RAM...
关于源码,如果你对Android编程感兴趣,你可以尝试分析AndTask_signed.apk的源代码,学习它是如何实现任务管理和进程监控的。这将帮助你理解Android系统的工作原理,特别是在处理多任务和资源管理方面的机制。通常,...
这里,`Intent.FLAG_ACTIVITY_NEW_TASK`用于在新的任务栈中启动安装进程,`Intent.FLAG_GRANT_READ_URI_PERMISSION`允许安装过程中访问APK文件,而`installIntent.putExtra("installSilent", true)`则是关键,它告诉...
在Android系统中,任务管理器(Task Manager)是至关重要的组件,它负责管理和调度应用程序的任务,确保系统的...最后,`AllendroidTaskManager.apk`可能是这个Task Manager应用的示例,可以下载安装以体验具体实现。
Task Paper,顾名思义。过程,点开.exe,会出现填写面板,键盘输入 提醒提示信息,点击确定,会在E盘taskpaper下生成以时间命名的壁纸 ,内容是刚刚输入的提醒信息,且自动设为壁纸。 为什么弄这个,是因为发现很多...
/system/app/LatinIME.apk k. Data(数据) /data/data/com.android.inputmethod.latin l. Activities(活动) LatinIMESettings/LatinIMEDebugSettings/InputLanguageSelection 例如:LatinIMESettings“android键盘...
一个自己写的进程管理器apk,可以进行进程的查看和杀死,也可查看service和task
在未安装APK的情况下,需要先将Service的类加载到当前进程,然后通过自定义的ClassLoader启动。 4. **安全与隐私问题**: - 这种方式可能导致安全风险,因为动态加载的代码可能绕过系统的安全检查,为恶意代码提供...
每当启动一个新的Activity,系统会将其压入一个全局的Task(任务)栈中。用户操作导致的回退或者系统行为会使Activity从栈顶弹出,但它们并未被销毁,除非明确调用了`finish()`方法。因此,要完全退出程序,需要确保...
3. **进程**(Process):进程是操作系统分配资源的基本单位,每个Android应用运行在自己的进程中,除非特别指定,否则默认一个.apk的所有组件(Activity、Service、BroadcastReceiver、ContentProvider)都在同一...
Hibernator是一个非常强大的Task Killer,可以杀死任务和进程并防止其自动重新启动。 速度提升器 Hibernator由于后台运行的应用程序众多,因此可以在手机运行缓慢时加快速度。 RAM CLEANER Hibernator通过...
2. 完成安装后双击 killtask.bat 关闭所有进程 3. 双击 setup.vbs (不是 setup.reg) 安装 4. 开启 BlueStacks 5. 双击 installAPK.bat 安装 apk 6. 打开 Android ID Changer ROOT, 按 Generate ID 产生一个新的 ID, ...
2. 完成安装后双击 killtask.bat 关闭所有进程 3. 双击 setup.vbs (不是 setup.reg) 安装 4. 开启 BlueStacks 5. 双击 installAPK.bat 安装 apk 6. 打开 Android ID Changer ROOT, 按 Generate ID 产生一个新的 ...
默认情况下,每个APK都会运行在自己独立的进程中,同时默认情况下每个进程也只有一条主线程。然而,所有的组件事件都会交织到这条主线程中,这保证了组件之间的同步和协调。 - 进程的生命周期从用户ID的角度来看,是...
Activity可以存在于不同的任务(task)中,任务是按用户操作顺序排列的一系列Activity。Affinity表示Activity与任务的关系,新任务的创建可以通过设置affinity属性来决定。加载模式如singleTop、singleTask和...
- `Intent`对象用于启动新的活动,`FLAG_ACTIVITY_CLEAR_TOP`清除栈顶的活动,`FLAG_ACTIVITY_NEW_TASK`则创建一个新的任务栈。 2. **C#与Java交互** - 在Unity的C#脚本中,我们需要使用`AndroidJavaClass`和`...
- **进程(Process)**:标准的Linux进程,每个APK默认运行在一个独立的进程中。 - **服务(Service)**:在后台执行长时间运行的操作,不提供用户界面。 - **内容提供者(Content Provider)**:用于访问应用数据,可以跨...
例如,"assemble" Task用于构建APK文件,"install" Task用于将构建产物安装到设备上,而"uploadArchives" Task则用于上传构建产物到依赖管理服务器。在执行"assemble" Task时,它会依赖其他许多Task,包括Java文件的...
- **特性**:在Android中,每个APK包里的所有组件都会在一个进程中运行。 - **内存管理**:当系统资源紧张时,系统可能会结束非活跃的进程以释放资源。 #### 4. Activity - **定义**:是Android中负责与用户交互的...