2

安卓手机如何打开.do文件,安卓手机如何打开do文件视频讲解(搞懂Android应用启动过程)

关于【安卓手机如何打开.do文件】,安卓手机如何打开do文件视频讲解,今天涌涌小编给您分享一下,如果对您有所帮助别忘了关注本站哦。

  • 内容导航:
  • 1、安卓手机如何打开.do文件
  • 2、搞懂Android应用启动过程,再也不怕面试官了

1、安卓手机如何打开.do文件

安卓手机要打开这种类型的文件,必须安装这种类型文件的服务程序,安装——右键点击——选择默认程序——再单击——点击确定,就打开了。

.do文件并不是我们日常常用的文件格式,是一种网页后台的程序,是编程人员为了网站编程或者各种组件中自发使用的,.do文件不能直接打开,也不能用记事本等编辑器打开,安卓手机要打开这种类型的文件,必须安装这种类型文件的服务程序,这种程序专用程序才能够打开,安装好后进行右键点击,选择默认程序,再单击,点击确定,就打开了。

具体操作如下:

1、工具自行百度下载安装。

2、安装好AdobeReaderXI软件后对“.do”文件进行右键点击,从打开方式中单击选择默认程序。

3、在打开的对话框中寻找到AdobeReaderXI并进行单击选择,点击确定。

4、没有特殊情况“.do”文件就打开了。

2、搞懂Android应用启动过程,再也不怕面试官了

安卓手机如何打开.do文件,安卓手机如何打开do文件视频讲解(搞懂Android应用启动过程)

然后看下系统服务的启动,不管是由init进程启动的独立进程的系统服务如SurfaceFlinger,还是由SystemServer进程启动的非独立进程的系统服务如AMS,都是在ServiceManager进程中完成注册和获取的,在跨进程通信上使用了Android的binder机制。

安卓手机如何打开.do文件,安卓手机如何打开do文件视频讲解(搞懂Android应用启动过程)

ServiceManager进程本身也是一个系统服务,经过启动进程、启动binder机制、发布自己和等待请求4个步骤,就可以处理其他系统服务的获取和注册需求了。

AMS发送socket请求

Android应用进程的启动是被动式的,在Launcher桌面点击图标启动一个应用的组件如Activity时,如果Activity所在的进程不存在,就会创建并启动进程。

点击App图标后经过层层调用会来到ActivityStackSupervisor的startSpecificActivityLocked方法。

//ActivityStackSupervisor.javafinal ActivityManagerService mService;void startSpecificActivityLocked(...) { //查找Activity所在的进程,ProcessRecord是用来封装进程信息的数据结构 ProcessRecord app = mService.getProcessRecordLocked(...); //如果进程已启动,并且binder句柄IApplicationThread也拿到了,那就直接启动Activity if (app != null && app.thread != null) { realStartActivityLocked(r, app, andResume, checkConfig); return; } //否则,让AMS启动进程 mService.startProcessLocked(...);}

app.thread并不是线程,而是一个binder句柄。应用进程使用AMS需要拿到AMS的句柄IActivityManager,而系统需要通知应用和管理应用的生命周期,所以也需要持有应用进程的binder句柄IApplicationThread。

也就是说,他们互相持有彼此的binder句柄,来实现双向通信。

安卓手机如何打开.do文件,安卓手机如何打开do文件视频讲解(搞懂Android应用启动过程)

那IApplicationThread句柄是怎么传给AMS的呢?Zygote进程收到socket请求后会处理请求参数,执行ActivityThread的入口函数main。

//ActivityThread.javapublic static void main(String[] args) { //创建主线程的looper Looper.prepareMainLooper(); //ActivityThread并不是线程,只是普通的java对象 ActivityThread thread = new ActivityThread(); //告诉AMS,应用已经启动好了 thread.attach(false); //运行looper,启动消息循环 Looper.loop();}private void attach(boolean system) { //获取AMS的binder句柄IActivityManager final IActivityManager mgr = ActivityManager.getService(); //告诉AMS应用进程已经启动,并传入应用进程自己的binder句柄IApplicationThread mgr.attachApplication(mAppThread);}

所以对于AMS来说:

1.AMS向Zygote发起启动应用的socket请求,Zygote收到请求fork出进程,返回进程的pid给AMS;

2.应用进程启动好后,执行入口main函数,通过attachApplication方法告诉AMS已经启动,同时传入应用进程的binder句柄IApplicationThread。

完成这两步,应用进程的启动过程才算完成。

下面看AMS的startProcessLocked启动应用进程时都做了些什么。

//ActivityManagerService.javafinal ProcessRecord startProcessLocked(...){ ProcessRecord app = getProcessRecordLocked(processName, info.uid, keepIfLarge); //如果进程信息不为空,并且已经拿到了Zygote进程返回的应用进程pid //说明AMS已经请求过了,并且Zygote已经响应请求然后fork出进程了 if (app != null && app.pid > 0) { //但是app.thread还是空,说明应用进程还没来得及注册自己的binder句柄给AMS //即此时进程正在启动,那就直接返回,避免重复创建 if (app.thread == null) { return app; } } //调用重载方法 startProcessLocked(...);}

之所以要判断app.thread,是为了避免当应用进程正在启动的时候,假如又有另一个组件需要启动,导致重复拉起(创建)应用进程。

继续看重载方法startProcessLocked:

//ActivityManagerService.javaprivate final void startProcessLocked(...){ //应用进程的主线程的类名 if (entryPoint == null) entryPoint = "android.app.ActivityThread"; ProcessStartResult startResult = Process.start(entryPoint, ...);}//Process.javapublic static final ProcessStartResult start(...){ return zygoteProcess.start(...);}

来到ZygoteProcess。

//ZygoteProcess.javapublic final Process.ProcessStartResult start(...){ return startViaZygote(...);}private Process.ProcessStartResult startViaZygote(...){ ArrayList<String> argsForZygote = new ArrayList<String>(); //...处理各种参数 return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi), argsForZygote);}

其中:

  1. openZygoteSocketIfNeeded打开本地socket
  2. zygoteSendArgsAndGetResult发送请求参数,其中带上了ActivityThread类名
  3. return返回的数据结构ProcessStartResult中会有pid字段

梳理一下:

安卓手机如何打开.do文件,安卓手机如何打开do文件视频讲解(搞懂Android应用启动过程)

注意:Zygote进程启动时已经创建好了虚拟机实例,所以由他fork出的应用进程可以直接继承过来用而无需创建。

下面来看Zygote是如何处理socket请求的。

Zygote处理socket请求

从 图解Android系统的启动 一文可知,在ZygoteInit的main函数中,会创建服务端socket。

//ZygoteInit.javapublic static void main(String argv[]) { //Server类,封装了socket ZygoteServer zygoteServer = new ZygoteServer(); //创建服务端socket,名字为socketName即zygote zygoteServer.registerServerSocket(socketName); //进入死循环,等待AMS发请求过来 zygoteServer.runSelectLoop(abiList);}

看到ZygoteServer。

//ZygoteServer.javavoid registerServerSocket(String socketName) { int fileDesc; //socket真正的名字被加了个前缀,即 "ANDROID_SOCKET_" + "zygote" final String fullSocketName = ANDROID_SOCKET_PREFIX + socketName; String env = System.getenv(fullSocketName); fileDesc = Integer.parseInt(env); //创建文件描述符fd FileDescriptor fd = new FileDescriptor(); fd.setInt$(fileDesc); //创建LocalServerSocket对象 mServerSocket = new LocalServerSocket(fd);}void runSelectLoop(String abiList){ //进入死循环 while (true) { for (int i = pollFds.length - 1; i >= 0; --i) { if (i == 0) { //... } else { //得到一个连接对象ZygoteConnection,调用他的runOnce boolean done = peers.get(i).runOnce(this); } } }}

来到ZygoteConnection的runOnce。

boolean runOnce(ZygoteServer zygoteServer){ //读取socket请求的参数列表 String args[] = readArgumentList(); //创建应用进程 int pid = Zygote.forkAndSpecialize(...); if (pid == 0) { //如果是应用进程(Zygote fork出来的子进程),处理请求参数 handleChildProc(parsedArgs, descriptors, childPipeFd, newStderr); return true; } else { return handleParentProc(pid, descriptors, serverPipeFd, parsedArgs); }}

handleChildProc方法调用了ZygoteInit的zygoteInit方法,里边主要做了3件事:

  1. 启动binder线程池(后面分析)
  2. 读取请求参数拿到ActivityThread类并执行他的main函数,执行thread.attach告知AMS并回传自己的binder句柄
  3. 执行Looper.loop()启动消息循环(代码前面有)

这样应用进程就启动起来了。梳理一下:

安卓手机如何打开.do文件,安卓手机如何打开do文件视频讲解(搞懂Android应用启动过程)

下面看下binder线程池是怎么启动的。

启动binder线程池

Zygote的跨进程通信没有使用binder,而是socket,所以应用进程的binder机制不是继承而来,而是进程创建后自己启动的。

前边可知,Zygote收到socket请求后会得到一个ZygoteConnection,他的runOnce会调用handleChildProc。

//ZygoteConnection.javaprivate void handleChildProc(...){ ZygoteInit.zygoteInit(...);}//ZygoteInit.javapublic static final void zygoteInit(...){ RuntimeInit.commonInit(); //进入native层 ZygoteInit.nativeZygoteInit(); RuntimeInit.applicationInit(targetSdkVersion, argv, classLoader);}

来到AndroidRuntime.cpp:

//AndroidRuntime.cppstatic void com_android_internal_os_ZygoteInit_nativeZygoteInit(JNIEnv* env, jobject clazz){ gCurRuntime->onZygoteInit();}

来到app_main.cpp:

//app_main.cppvirtual void>

  • 打开binder驱动
  • 映射内存,分配缓冲区
  • 运行binder线程,进入死循环,等待指令
  • 总结

    综上,Android应用进程的启动可以总结成以下步骤:

    1. 点击Launcher桌面的App图标
    2. AMS发起socket请求
    3. Zygote进程接收请求并处理参数
    4. Zygote进程fork出应用进程,应用进程继承得到虚拟机实例
    5. 应用进程启动binder线程池、运行ActivityThread类的main函数、启动Looper循环

    完整流程图:

    安卓手机如何打开.do文件,安卓手机如何打开do文件视频讲解(搞懂Android应用启动过程)

    面试前的知识梳理,储备提升

    自己的知识准备得怎么样,这直接决定了你能否顺利通过一面和二面,所以在面试前来一个知识梳理,看需不需要提升自己的知识储备是很有必要的。

    关于知识梳理,这里再分享一下我面试这段时间的复习路线:(以下体系的复习资料是我从各路大佬收集整理好的)

    • 架构师筑基必备技能:深入Java泛型+注解深入浅出+并发编程+数据传输与序列化+Java虚拟机原理+反射与类加载+动态代理+高效IO
    • Android高级UI与FrameWork源码:高级UI晋升+Framework内核解析+Android组件内核+数据持久化
    • 360°全方面性能调优:设计思想与代码质量优化+程序性能优化+开发效率优化
    • 解读开源框架设计思想:热修复设计+插件化框架解读+组件化框架设计+图片加载框架+网络访问框架设计+RXJava响应式编程框架设计+IOC架构设计+Android架构组件Jetpack
    • NDK模块开发:NDK基础知识体系+底层图片处理+音视频开发
    • 微信小程序:小程序介绍+UI开发+API操作+微信对接
    • Hybrid 开发与Flutter:Html5项目实战+Flutter进阶

    安卓手机如何打开.do文件,安卓手机如何打开do文件视频讲解(搞懂Android应用启动过程)

    知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。

    安卓手机如何打开.do文件,安卓手机如何打开do文件视频讲解(搞懂Android应用启动过程)

    《507页Android开发相关源码解析》

    安卓手机如何打开.do文件,安卓手机如何打开do文件视频讲解(搞懂Android应用启动过程)

    《379页Android开发面试宝典》

    3.项目复盘

    实际上,面试的一二轮所问到的技术问题,很多都是围绕着你的项目展开,因此在面试前最后要做好的一件事情就是项目复盘。关于项目复盘,我个人的思路如下,可供参考:

    • 你在这个项目中承担了什么样的角色?
    • 这个项目的背景是什么,如果是技术项目,为什么要做?
    • 有哪些技术难点,是怎么解决的,是否还有更好的方案?
    • 你认为项目中是否有可以改进的点?
    • 这个项目解决了什么问题,最好用数据说话,这个数据又是怎么得出来的?

    提前把思路捋一捋,上面这些问题好好思考或准备一下,做到心中有谱以后,自然能够面试官聊得融洽,保持一个好的心态,通过的几率就会更大一些。

    本文关键词:安卓手机如何打开.dot文件,do文件怎么用手机打开,安卓手机怎么打开do文件,安卓如何打开exe文件,安卓手机如何打开do文件视频讲解。这就是关于《安卓手机如何打开.do文件,安卓手机如何打开do文件视频讲解(搞懂Android应用启动过程)》的所有内容,希望对您能有所帮助!

    本文来自网络,不代表本站立场。转载请注明出处: https://tj.jiuquan.cc/a-2051349/
    1
    上一篇 世界十大名表排名,世界十大名表排名及价格(全球手表品牌档次排名前50)
    下一篇 偶蹄类为什么比奇蹄类更有竞争力,什么是奇蹄动物什么是偶蹄动物(古脊椎所在内蒙古二连盆地偶蹄类化石研究中获进展)

    为您推荐

    联系我们

    联系我们

    在线咨询: QQ交谈

    邮箱: alzn66@foxmail.com

    关注微信

    微信扫一扫关注我们

    返回顶部