Android进程与线程详解

本文深入探讨Android进程的创建、资源、等级和进程间通信,尤其是通过Zygote fork出进程的过程。此外,还详细讲解了线程的使用,包括子线程更新UI、Message Queue和AsyncTask的应用,帮助开发者理解Android应用的多线程模型。
摘要由CSDN通过智能技术生成

        相信很多人读过Google Android 推广工程师的《Who lives and who dies? Process priorities on Android》,该篇仅仅详细介绍了进程级别,但是没有对android的进程进行详细的介绍,而且其他很多文章也都将重点放在了四大组件、UI等方面。因此,本文将先从进程的角度,将进程相关的知识点进行一个串烧,再从主线程入手,对线程进行详解。


1、进程

       每个App在启动前必须先创建一个进程,该进程是由Zygote fork出来的,进程具有独立的资源空间,用于承载App上运行的各种Activity/Service等组件。大多数情况一个App就运行在一个进程中,除非在AndroidManifest.xml中配置Android:process属性,或通过native代码fork进程。


1.1 进程的创建

        不论是startActivity(),还是startService()等接口启动的进程,最终都是调用了ActivityManagerService 的 startProcessLocked() 方法,进而调用 Process.start() 方法。在该方法中,主要做了两件事:

public final class ActivityManagerService extends ActivityManagerNative  
                            implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {  
  
    private final void startProcessLocked(ProcessRecord app,  
                String hostingType, String hostingNameStr) {  
  
        try {  
            int pid = Process.start("android.app.ActivityThread",  
                            mSimpleProcessManagement ? app.processName : null, uid, uid,  
                            gids, debugFlags, null);  
  
            if (pid == 0 || pid == MY_PID) {  
        
  
            } else if (pid > 0) {  
                app.pid = pid;  
                app.removed = false;  
                synchronized (mPidsSelfLocked) {  
                    this.mPidsSelfLocked.put(pid, app);  
                    ......  
                }  
            } else {  
                ......  
            }  
        } catch (RuntimeException e) {  
            ......  
        }  
    }  
    ......  
  
}  

(1)新建一个进程;

startViaZygote

      zygoteSendArgsAndGetResult

       这个方法的主要功能是通过socket通道向Zygote进程发送一个参数列表,然后进入阻塞等待状态,直到远端的socket服务端发送回来新创建的进程pid才返回。既然system_server进程通过socket向Zygote进程发送消息,这是便会唤醒Zygote进程,来响应socket客户端的请求(即system_server端),接下来的操作便是在Zygote进程中执行。

       先执行 runSelectLoop。

public static void main(String argv[]) {
    try {
        runSelectLoop(abiList);
        ....
    } catch (MethodAndArgsCaller caller) {
        caller.run(); 
    } catch (RuntimeException ex) {
        closeServerSocket();
        throw ex;
    }
}

private static void runSelectLoop(String abiList) throws MethodAndArgsCaller {
    ...

    ArrayList<ZygoteConnection> peers = new ArrayLis
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值