• 安卓应用启动底层执行逻辑


    前言

    新的加固方案,需要替换底层中ActivityThread其中的一些参数,来执行我的壳程序,并能够让壳程序将原APP加载到classload中。

    正文

    通过对Application类的attachBaseContext()方法打断点就可以进入到安卓应用的启动逻辑,接下来会是大量的Debug。

    Zygote

    对于Zygote:

    在Android系统启动期间,Linux内核首先将进程称为“ init”。init读取文件“ /init.rc”和“ init.device.rc”。“ init.device.rc”是特定于设备的,在虚拟设备上,此文件称为“ init.goldfish.rc”。

    init.rc通过程序“ / system / bin / app_process”启动进程“ Zygote”。Zygote加载核心Java类并对其进行初始处理。这些类可被Android应用程序重用,因此,此步骤使它们可以更快地启动。Zygote的初始工作完成后,该进程将侦听套接字并等待请求。

    程序运行中Zygote会调用caller函数,caller函数会反射调用android.app.ActivityThread.main(String[])

    其中的mMethod是最重要的,他是整个安卓应用的出生点。也就是android.app.ActivityThread.main(String[])

    ActivityThread

    进入ActivityThread.main可以看到

    ActivityThread的参数已经完成了初始化

    安卓会根据这些参数来加载相关APP的application类、activity类。

    loop,dispatchMessage,handleMessage,access,handleBinApplication

    这个过程,安卓系统会将待创建的线程交给loop来创建,并且发送信息,作为内存交换。

    称为Binder的特殊驱动程序允许进行有效的进程间通信(IPC),其中允许在进程之间传递对对象的引用。实际对象存储在共享内存中。这样,由于必须传输的数据较少,因此可以优化进程之间的通信。

    Android不像其他Linux系统那样提供交换空间,因此可用内存范围仅限于设备上的内存。

    makeApplication,newApplication

    applClass就是AndroidManifest.xml中配置的android:name这个属性名。

    cl就是classload,会将application类加载到类加载器中。

    context就是一些包名、线程等一些信息。

    Application类

    将application类加载进来之后就会进入application类的attachBaseContext()方法中。

    然后就是执行onCreate()方法。

    会将加载的信息比如app的文件地址,lib库(主要是使用了什么ABI),包名之类的。

    Activity类

    这些跑完之后就是进入主Acitivity类的初始化过程。

    onCreate()方法执行完之后就是将界面加载出来。

    总结

    以上是安卓应用启动的全过程(略微短浅)。了解这个可以知道底层的一些东西,安卓应用点击图标背后都做了什么的故事。

    安卓应用通过Zygote将app初始化,再通过ActivityThread将整个app的信息和线程初始化好,将application类加入到类加载器中,并通过类加载器开始跑这个app。app真的开始运行的时候获取app信息,包名,apk文件,lib库,然后初始化界面。

  • 相关阅读:
    Hasura GraphQL schema 生成是如何工作的
    一张方便的graphql schema 语言手册
    使用lua graphql 模块让openresty 支持graphql api
    PostgREST docker-compose 试用
    subzero 基于postgrest && openresty && rabbitmq 的快速rest/graphql 开发平台
    使用blessed 开发丰富的cli 应用
    一个方便查看数据库转换rest/graphql api 的开源软件的github 项目
    treeql 基于rest 标准的接口开发协议
    graphql-modules 企业级别的graphql server 工具
    hangfire docker-compose 运行
  • 原文地址:https://www.cnblogs.com/Tu9oh0st/p/13627181.html
Copyright © 2020-2023  润新知