北京高端网站建设有限公司,WordPress大前端设置背景,天河区门户网站招生考试,杭州seo网站排名开发Android已经有一段时间了#xff0c;今天接触到底层的东西#xff0c;所以对于进程#xff0c;用户的id以及Android中的Task,Apk之间的关系#xff0c;要做一个研究#xff0c;下面就是研究结果: apk一般占一个dalvik,一个进程,一个task。当然通过通过设置也可以多个进… 开发Android已经有一段时间了今天接触到底层的东西所以对于进程用户的id以及Android中的Task,Apk之间的关系要做一个研究下面就是研究结果: 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设置相同的User Id manifest android:sharedUserIdaaa.bbb 2被调用的activity设置以下属性 activity android:multiprocesstrue 或者 activity android:processcom.cienet.test 对于3D OpenGL程序修改以上属性后被调用的activity的内存占用会明显减少比如30MB - 2MB。 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进程情况 USERapp_36 PID8360 NAMEcom.demo [5]点击按钮启动SecondActivity再次查看进程情况 USERapp_36 PID8360 NAMEcom.demo 结论进程列表没有变化两个Activity运行在同一进程中。 2. 同一Apk中的不同包的Activity调用时进程状况验证 [1]将SecondActivity挪到包com.demo.second中去相应修改AndroidManifest.xml中的name为com.demo.second.SecondActivity [2]运行程序查看此时进程情况 USERapp_36 PID10593 NAMEcom.demo [3]点击按钮启动SecondActivity查看此时进程情况 USERapp_36 PID10593 NAMEcom.demo 结论进程列表没有变化两个Activity运行在同一进程中。即进程name只受AndroidManifest.xml中manifset结点的package属性影响。 3. 同一Apk中Activity process属性修改后进程状况验证 [1]为SecondActivity添加process属性其值为:abc也可以随便是其他的:开头的字符串常见的名字是:remote activity android:namecom.demo.second.SecondActivity android:process:abc /activity [2]运行程序查看进程情况 USERapp_36 PID12137 NAMEcom.demo [3]点击按钮启动SecondActivity查看进程情况 USERapp_36 PID12137 NAMEcom.demo USERapp_36 PID12303 NAMEcom.demo:abc 结论进程表多了一项。两个Activity各自有一个进程SecondActivity的进程名称为 包名后缀。 4. 不同Apk中不同包名的Activity进程状况验证 [1]运行FirstProject USERapp_36 PID12137 NAMEcom.demo [2]创建SecondProject project name: SecondProject package:com.demo2 默认Activity:MainActivity [3]运行SecondProject USERapp_37 PID14191 NAMEcom.demo2 结论进程表多了一项。两个Activity各自有一个进程同时其进程用户id、包名也不同互不影响。 5. 不同Apk签名相同、包名相同的Activity进程状况验证 [1]修改SecondProject的包也为com.demo相应要修改AndroidManifest.xml内容。 [2]运行SecondProject查看进程情况 USERapp_36 PID14944 NAMEcom.demo 结论进程表只有一项但是实际上FirstProject此时已经被覆盖了系统中只存在SecondProject了因为模拟器调试时apk使用的签名key都是一样的系统看到key一样包名一样认为这个包就是FirstProject所以覆盖掉了。 可以通过DDMS复制/data/system/packages.xml查看一下内容: package namecom.demo codePath/data/app/com.demo.apk systemfalse ts1279955425000version1 userId10036 这个文件里面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.不同ApkShare User Id相同包名不同时进程情况分析 [1]修改firstproject、secondproject的AndroidManifest.xml的manifset结点增加属性 android:sharedUserIdcom.demouser [2]修改secondproject的包为com.demo2不然其会覆盖firsetproject。 [3]运行firsetproject、secondproject查看进程列表 USERapp_35 PID19993 NAMEcom.demo2 USERapp_35 PID20045 NAMEcom.demo2 结论: 仍然存在两个进程。但是进程的用户名一样说明shareUserId确实有效了进程pid不相同。 再次导出/data/system/packages.xml查看其内容可以看到两个项目的UserId都是10035确实是一样的 package namecom.demo codePath/data/app/com.demo.apk systemfalse ts1279957484000version1 sharedUserId10035 package namecom.demo2 codePath/data/app/com.demo2.apksystemfalse ts1279957473000 version1 sharedUserId10035 8.不同ApkShare User Id相同包名不同、指定Activity的process属性进程情况分析 [1]修改SecondProject的MainActivity的process属性指定绑定到进程名为com.demo的进程上 activity android:name.MainActivity android:labelstring/app_name android:processcom.demo [2]运行firstProject、SecondProject查看进程情况 USERapp_35 PID21387 NAMEcom.demo 结论两个Activity运行于同一个进程。 9.不同ApkShare User Id相同包名不同、签名key不同 经实验安装第二个apk时会提示INSTALL_FAILED_UPDATE_INCOMPATIBLE错误安装失败。 总结 UserId不同时 包名不同 未设定process属性时各自的Activity在各自的进程。即使process指定了包名也不会和另一个用户的同名包共享进程。 包名相同 签名相同覆盖旧的同包名apk。签名不同新的apk会安装失败。【签名key一般都是不同的】 UserId相同时 包名不同 未设定process属性时各自的Activity在各自的进程。process属性指定则可以共享进程。 包名相同 签名相同覆盖旧的同包名apk。签名不同新的apk会安装失败。【签名key一般都是不同的】 转载于:https://www.cnblogs.com/roccheung/p/5797380.html