安卓应用启动底层执行逻辑
前言
新的加固方案,需要替换底层中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库,然后初始化界面。