android 通过包名如何判断应用前台运行_点击安卓应用图标背后的故事

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 17:22   2859   0

前言

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

正文

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

5f2f85b2a8629640937b3e4912c18703.png

## 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[])`

d4cee0e0dac9c4b6fbeedf19cc8d9406.png

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

## ActivityThread

进入`ActivityThread.main`可以看到

4c78fc8b4d6638fa617d58379020935b.png

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

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

### loop,dispatchMessage,handleMessage,access,handleBinApplication

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

称为*Binder*的特殊驱动程序允许进行有效的进程间通信(IPC),其中允许在进程之间传递对对象的引用。实际对象存储在共享内存中。这样,由于必须传输的数据较少,因此可以优化进程之间的通信。 Android不像其他Linux系统那样提供交换空间,因此可用内存范围仅限于设备上的内存。

### makeApplication,newApplication

1400a75b2cd597073fc03a9d12244b86.png

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

ae775eea479d3ddf11dcdbc7c8a70782.png

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

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

## Application类

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

c8bff41ab746892b3cb34b121e7ee491.png

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

db839742fd30f12b884101003c84dcd2.png

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

## Activity类

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

0f65f0a22fca4db05758b7b44aff813f.png

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

e7212bd8b2e596f0fae97fef49bbb7d8.png

总结

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

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

80a80e00cd09d00274a487087b278d50.png

参考链接

https://www.vogella.com/tutorials/AndroidInternals/article.htmlwww.vogella.com
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP