apk与应用进程

Android的一个进程首先是遵循linux的创建规则的,就是使用fork函数,然后fork返回0时代表已经进入子进程了,其实两个进程的区别就是pid不一样,物理空间上的内容不一样,是不同线程的。从一个进程中分出另外一个进程,就是创造这个样的条件。APK中包含的只是代码和资源,并不是一个进程。APK中的代码可以给所有进程使用(理论上,只要知道这些代码全类名,类中有哪些方法和变量。而实际是可能在这个代码中设了一些门槛,比如,需要这个进程属于哪个uid,申请并拥有某个权限,否则就不允许运行下去。)

而一个Android应用进程中,首先是system_server进程通过socket向zygote进程发出请求,zygote执行fork调用后,创造了一个新的进程环境,然后让ActivityThread#main()运行在这个子进程中,即ActivityThread#main是Android应用进程的入口。那么ActivityThread#main()创建一个IApplicationThread(Binder)传给AMS,然后创建一个Loop循环消息处理。那么该IApplicationThread就在AMS中代表了这个应用进程。然后AMS把这个应用进程对应的APK中的信息和进程pid,uid等信息传给ActivityThread,包括ApplicationInfo,List<ProviderInfo>,packageName,Configuration,Compatibility,boolean persistent,然后这个应用进程就该APK关联起来了。

那么该应用进程怎么知道自己使用哪个APK中的代码,其实他不用知道,应用进程就是循环处理系统发来的消息。而要创建哪些Provider实例,都在AMS传过来的List<ProviderInfo>中,启动哪个Application子类在AMS传过来的ApplicationInfo中,要启动哪个Activity,AMS成员--ActivityStackSupervisor会调用IApplicationThread#scheduleLauncherActivity(...)告知ActivityThread要启动的Activity的全路径和Activity在Manifest中写明的各个属性都包含在Intent和ActivityInfo中。

所以APK就是这样和应用进程联系在一起的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值