安卓逆向_5 --- Android 学习

 

Android 之 四大组件、六大布局、五大存储:https://blog.csdn.net/freeking101/article/details/105377197

 

安卓(Android)动态创建多个按钮并添加监听事件:https://www.jb51.net/article/88036.htm
安卓按钮添加监听的三种方法:https://www.cnblogs.com/linfenghp/p/5373754.html

 

 

Android系统框架简介

 

哔哩哔哩:https://www.bilibili.com/video/BV1UE411A7rW?p=21

 

 

Android开发入门教程:7天玩转安卓APP开发

 

http://c.biancheng.net/android/

 

 

Android 教程

 

https://www.runoob.com/android/android-tutorial.html

 

https://www.runoob.com/w3cnote/android-tutorial-intro.html

 

 

黑马程序员

 

http://yun.itheima.com/course/c57.html

 

 

慕课

 

https://www.imooc.com/search/?type=course&words=Android

 

 

1.Dex加载流程:(安卓源代码)
Davlivk虚拟机加载dex文件
Java层 Dex 加载流程:BootClassLoader ---> PathClassLoader ----> DexClassLoader
Native层 Dex 加载流程:libdvm.so (重编译 system.img)---> OpenDexFileNative

 

 

Android Application 启动流程分析( 点击图标,APP加载流程

 

From:https://www.jianshu.com/p/a5532ecc8377

译者注:
原文分成两个部分, 链接如下:
http://multi-core-dump.blogspot.com/2010/04/android-application-launch.html
http://multi-core-dump.blogspot.com/2010/04/android-application-launch-part-2.html
本文合二为一, 章节标题由译者加注.

 

 

1、App 基础理论

 

要想优化 App 启动时间,第一步就是了解 App 启动进程的工作原理。 有几个基础理论:

Android Application 与其他移动平台有两个重大不同点:

  1. 每个Android App 都在一个独立空间里,意味着其运行在一个单独的进程中,拥有自己的VM,被系统分配一个唯一的 user ID。
  2. Android App 由很多不同组件组成,这些组件还可以启动其他 App 的组件。因此,Android App 并没有一个类似程序入口的 main() 方法。

Android Application组件包括:

  • Activities: 前台界面, 直接面向User, 提供UI和操作.
  • Services: 后台任务.
  • Broadcast Receivers: 广播接收者.
  • Contexnt Providers: 数据提供者.

Android进程与Linux进程一样。默认情况下,每个 apk 运行在自己的 Linux 进程中。 另外,默认一个进程里面只有一个线程---主线程。这个主线程中有一个 Looper 实例,通过调用 Looper.loop() 从 Message队列里面取出 Message 来做相应的处理。

那么,这个进程何时启动的呢?

简单的说,进程在其需要的时候被启动。任意时候,当用户或者其他组件调取你的 apk 中的任意组件时,如果你的 apk 没有运行,系统会为其创建一个新的进程并启动。通常,这个进程会持续运行直到被系统杀死。关键是:进程是在被需要的时候才创建的。

举个例子,如果你点击 email 中的超链接,会在浏览器里面打开一个网页。Email App 和 浏览器App 是两个不同的App,运行在不同的进程中。这次点击事件促使 Android 系统去创建了一个新的进程来实例化浏览器的组件。

首先, 让我们快速看下Android启动流程. 与众多基于Linux内核的系统类似, 启动系统时, bootloader启动内核和init进程. init进程分裂出更多名为"daemons(守护进程)"的底层的Linux进程, 诸如android debug deamon, USB deamon等. 这些守护进程处理底层硬件相关的接口.

随后, init进程会启动一个非常有意思的进程---"Zygote". 顾名思义, 这是一个Android平台的非常基础的进程. 这个进程初始化了第一个VM, 并且预加载了framework和众多App所需要的通用资源. 然后它开启一个Socket接口来监听请求, 根据请求孵化出新的VM来管理新的App进程. 一旦收到新的请求, Zygote会基于自身预先加载的VM来孵化出一个新的VM创建一个新的进程.

启动Zygote之后, init进程会启动runtime进程. Zygote会孵化出一个超级管理进程---System Server. SystemServer会启动所有系统核心服务, 例如Activity Manager Service, 硬件相关的Service等. 到此, 系统准备好启动它的第一个App进程---Home进程了.


 

2、启动App流程

 

一个 APK 只有一个 Application。每个 Apk 运行时都需要有一个 Application对象,Application对象执行 onCreate方法时APP就开始运行

用户点击 Home 上的一个 App 图标,启动一个应用时:

Click事件会调用startActivity(Intent), 会通过Binder IPC机制, 最终调用到ActivityManagerService. 该Service会执行如下操作:

  • 第一步通过PackageManager的resolveIntent()收集这个intent对象的指向信息.
  • 指向信息被存储在一个intent对象中.
  • 下面重要的一步是通过grantUriPermissionLocked()方法来验证用户是否有足够的权限去调用该intent对象指向的Activity.
  • 如果有权限, ActivityManagerService会检查并在新的task中启动目标activity.
  • 现在, 是时候检查这个进程的ProcessRecord是否存在了.

如果ProcessRecord是null, ActivityManagerService会创建新的进程来实例化目标activity.

 

2.1 创建进程

ActivityManagerService调用startProcessLocked()方法来创建新的进程, 该方法会通过前面讲到的socket通道传递参数给Zygote进程. Zygote孵化自身, 并调用ZygoteInit.main()方法来实例化ActivityThread对象并最终返回新进程的pid.

ActivityThread随后依次调用Looper.prepareLoop()和Looper.loop()来开启消息循环.

流程图如下:

 

2.2 绑定Application

接下来要做的就是将进程和指定的Application绑定起来. 这个是通过上节的ActivityThread对象中调用bindApplication()方法完成的. 该方法发送一个BIND_APPLICATION的消息到消息队列中, 最终通过handleBindApplication()方法处理该消息. 然后调用makeApplication()方法来加载App的classes到内存中.

流程如下:

 

2.3 启动Activity

经过前两个步骤之后, 系统已经拥有了该application的进程. 后面的调用顺序就是普通的从一个已经存在的进程中启动一个新进程的activity了.

实际调用方法是realStartActivity(), 它会调用application线程对象中的sheduleLaunchActivity()发送一个LAUNCH_ACTIVITY消息到消息队列中, 通过 handleLaunchActivity()来处理该消息.

假设点击的是一个视频浏览的App, 其流程如下:

 

 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/495480.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华为公布车联网进展:年内将覆盖10万网联车

来源:车云摘要:实际上,华为进军汽车业的“野心”在于,提供车联网的相关解决方案。近年来,华为一直有向其他领域扩充的计划与布局,此前,其将与汽车厂商合作造车的传闻也一直不绝于耳。对此&#…

NDoc 用户指南

NDoc 用户指南 http://www.uml.org.cn/net/200702271.asp#811转载于:https://www.cnblogs.com/stalwart/archive/2011/05/31/2065177.html

杨强:人工智能在企业的落地是一门大学问

来源:图灵人工智能摘要:人工智能到现在已经 60 多年,几起几落,它的兴衰也是围绕着 “AI是不是可以落地” 进行的。杨强香港科技大学计算机和工程学系主任国际人工智能联合会IJCAI理事长第四范式首席科学家杨强:一个AI&…

淘宝灵活的圆角框--通过一个圆形图片形成圆角原理

具体实现方案就是通过隐藏/显示一个圆形的不同部分来实现圆角效果&#xff0c;具体分析见注释&#xff01;&#xff01; <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&…

安卓逆向_6 --- Dalvik 字节码、Smali 详解

CTF Wiki smali&#xff1a;https://ctf-wiki.org/android/basic_operating_mechanism/java_layer/smali/smali/ 深入理解 Dalvik 字节码指令及 Smali 文件&#xff1a;https://blog.csdn.net/dd864140130/article/details/52076515 安卓逆向入门教程&#xff08;二&#xff09…

Optional源码级详解

认识Optional Opitonal类就是Java提供的为了解决大家平时判断对象是否为空用&#xff0c;通常会用 null!obj 这样的方式存在的判断&#xff0c;从而令人头疼导致空指针异常&#xff0c;同Optional的存在可以让代码更加简单&#xff0c;可读性跟高&#xff0c;代码写起来更高效…

NASA宣布在火星上发现了3种有机分子

图来自美国国家航空航天局来源&#xff1a;海外网摘要&#xff1a;美国国家航空航天局&#xff08;NASA&#xff09;召开新闻发布会&#xff0c;公开了火星新发现——好奇号火星探测器在火星上发现了有机分子。当地时间周四&#xff08;7日&#xff09;&#xff0c;美国国家航空…

POJ 2255/递归:前序中序求后序

Sample Input DBACEGF ABCDEFG 已知二叉树的前序遍历与后序遍历求后序遍历 算法&#xff1a;前序遍历时&#xff0c;第一位为根&#xff1a;D&#xff1b;找到中序中的D&#xff0c;则前面的ABC在左子树&#xff0c;右边的EFG在右子树&#xff0c;则后序为为左子树右子树根:sol…

Chrome 爬虫插件 Web Scraper

Web Scraper 官网&#xff1a;https://webscraper.io/ 有关webscraper的问题&#xff0c;看这个就够了&#xff08;建议收藏&#xff09;&#xff1a; https://zhuanlan.zhihu.com/p/34104808https://blog.csdn.net/biggbang/article/details/86251526 web scraper 入门到精通…

AI新方向: 科学家们暂停模仿“人脑”,公布了新路线图

来源&#xff1a;华尔街新闻摘要&#xff1a;科学家们一直致力于创造一种像人类一样思考的机器&#xff0c;但经过一段时间的探索&#xff0c;这一进程遇到了阻碍&#xff0c;他们基本上已经暂停了模仿“人脑”&#xff0c;转而研究已有发现的应用。科学家们一直致力于创造一种…

C++ primer 4th 第10章《关联容器》总结

表10-1 关联容器类型 map 关联数组&#xff1a;元素通过键来存储和读取 set 大小可变的集合&#xff0c;支持通过键实现的快速读取 multimap 支持同一个键多次出现的map类型 multimap 支持同一个键多次出现的set类型 表10-2 pair类型提供的操作 pair<T1,T2> p1;…

强势~迷惑法应对

1、承认事实&#xff1b; 2、承认可能性&#xff1b; 3、原则上同意。 1、承认事实&#xff1b; 母亲&#xff1a;莎莉&#xff0c;你有很晚才回家。昨晚我到12点半&#xff0c;还给你打过电话呢。莎莉&#xff1a;是的&#xff0c;妈妈&#xff0c;昨晚我又回来得很晚。 2…

Hack.Chat 在浏览器里快速建立简单、随用即丢线上聊天室,无须下载安装软体

From&#xff1a;http://www.luoxiao123.cn/1554-6.html 有时候想跟其他使用者线上文字对话&#xff0c;但又不想把自己的联络资料&#xff08;例如 Facebook 或即时通讯帐号&#xff09;泄漏给对方&#xff0c;有些人可能会选择申请一个临时使用的帐号&#xff0c;但这未免也太…

CCAI2018 | 韩家炜:大规模文本数据挖掘的新方向

来源&#xff1a;中国人工智能学会现实中的大数据常常表示为一种非结构化&#xff0c;交叉和动态变化的文本数据。如何从大规模文本数据中抽取结构化知识是一个非常值得研究的任务。很多研究工作依赖于劳动密集型的数据标注&#xff0c;用有监督的方法去抽取知识。但是&#xf…

关于面试宝典中的各个问题(一)

1、关于浮点数1.0f在内存中的表示&#xff1a;是3f800000. 各个类型所占的字节数&#xff08;byte&#xff09;&#xff0c;1byte8bit char 1 short 2 bool 1 int 4 long 4 float 4 double 8 long double 8 char * 4 int * 4 float * 4 以上是对于我的电脑&#xff0c;在典型…

安卓手机 Python 自动化( uiautomation、uiautomation2、weditor )

其他自动化工具或者框架&#xff1a; Airtest&#xff1a;https://airtest.readthedocs.io/zh_CN/latest/autojs&#xff1a;Auto.js快速入门实战教程&#xff1a;https://zhuanlan.zhihu.com/p/90065914appium&#xff1a;https://blog.csdn.net/freeking101/article/details…

强势~否定决断法

否定决断法套路 对方&#xff1a;“你在......上做得不是很好”&#xff08;批评&#xff09;你&#xff1a;“你说得对。我在处理那个的时候不太机灵&#xff0c;对吗”&#xff08;否定决断法&#xff09; 示例一&#xff1a; 同事&#xff1a;“上周答应给的那份参考文档…

C++/C宏定义中## 连接符与# 符的含义

http://blog.163.com/wshyao126/blog/static/1070451420081018103237836/ ## 连接符与# 符 ## 连接符号由两个井号组成&#xff0c;其功能是在带参数的宏定义中将两个子串(token)联接起来&#xff0c;从而形成一个新的子串。但它不可以是第一个或者最后一个子串。所谓的子串(t…

揭秘|多伦多大学反人脸识别,身份欺骗成功率达99.5%

来源 &#xff1a;机器人大讲堂摘要&#xff1a;在一些社交媒体平台&#xff0c;每次你上传照片或视频时&#xff0c;它的人脸识别系统会试图从这些照片和视频中得到更多信息。比如&#xff0c;这些算法会提取关于你是谁、你的位置以及你认识的其他人的数据&#xff0c;并且&am…

安卓逆向_8 --- Android 调试工具 DDMS 和 Monitor ( 去掉 车来了 app 的广告 )

From&#xff1a;https://www.e-learn.cn/topic/3527658 Android SDK 中的 ddms 使用详解&#xff1a;https://blog.csdn.net/x83853684/article/details/80643131 ADB、Android Monitor、DDMS、HierarchyViewer、MAT、SysTrace、TraceView 性能分析工具使用大全&#xff1a;…