-
activity启动过程:
- 无论通过Launcher来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activity,都通过Binder进程间通信进入到ActivityManagerService进程中,并且调用ActivityManagerService.startActivity接口
- ActivityManagerService调用ActivityStack.startActivityMayWait来做准备要启动的Activity的相关信息。
- ActivityStack通知ApplicationThread要进行Activity启动调度了,这里的ApplicationThread代表的是调用ActivityManagerService.startActivity接口的进程,对于通过点击应用程序图标的情形来说,这个进程就是Launcher。而对于通过在Activity内部调用startActivity的情形来说,这个进程就是这个Activity所在的进程了。
- ApplicationThread不执行真正的启动操作,它通过调用ActivityManagerService.activityPaused接口进入到ActivityManagerService进程中,看啊可能是否需要创建新的进程来启动Activity。
- 对于通过点击应用程序图标来启动Activity的情景来说,ActivityManagerService在这一步中,会调用startProcessLocked来创建一个新的进程。而对于通过在Activity内部调用startActivity来启动新的Activity来说,这一步是不需要执行的,因为新的Activity就在原来的Activity所在的进程中进行启动。
- ActivityManagerServic调用ApplicationThread.scheduleLaunchActivity接口,通知相应的进程执行启动Activity的操作;
- ApplicationThread把这个启动Activity的操作转发给ActivityThread,ActivityThread通过ClassLoader导入相应的Activity类,然后把它启动起来。
- 无论通过Launcher来启动Activity,还是通过Activity内部调用startActivity接口来启动新的Activity,都通过Binder进程间通信进入到ActivityManagerService进程中,并且调用ActivityManagerService.startActivity接口
-
Android开机过程
- BootLoder引导,然后加载Linux内核.
- 0号进程init启动.加载init.rc配置文件,配置文件有个命令启动了zygote进程 zygote开始fork出SystemServer进程
- SystemServer加载各种JNI库,然后init1,init2方法,init2方法中开启了新线程 ServerThread.
- 在SystemServer中会创建一个socket客户端,后续AMS(ActivityManagerService)会通过此客户端和zygote通信
- ServerThread的run方法中开启了AMS,还孵化新进程ServiceManager,加载注册了一溜的服务,最后一句话进入loop 死循环
- run方法的SystemReady调用resumeTopActivityLocked打开锁屏界面
- BootLoder引导,然后加载Linux内核.
-
上图就可以很好的说明App启动的过程 ActivityManagerService组织回退栈时以ActivityRecord为基本单位,所有的ActivityRecord放在同一个ArrayList里,可以将mHistory看作一个栈对象,索引0所指的对象位于栈底,索引mHistory.size()-1所指的对象位于栈顶 Zygote进程孵化出新的应用进程后,会执行ActivityThread类的main方法.在该方法里会先准备好Looper和消息队列,然后调用attach方法将应用进程绑定到ActivityManagerService,然后进入loop循环,不断地读取消息队列里的消息,并分发消息。 ActivityThread的main方法执行后,应用进程接下来通知ActivityManagerService应用进程已启动,ActivityManagerService保存应用进程的一个代理对象,这样ActivityManagerService可以通过这个代理对象控制应用进程,然后ActivityManagerService通知应用进程创建入口Activity的实例,并执行它的生命周期方法
- android进程间通信(IPC):Binder机制
Binder作为一种进程间通信机制,负责提供远程调用的功能(RPC),它的系统组件主要包括四种:Client, Server, ServiceManager, Binder Driver.
- Service与IntentService的使用比较 Service运行在主线程,操作耗时操作会阻塞,intentService运行在
一个单独的worked Thread里处理,不会阻塞主线程。当多次启动时IntentService会处理完成一个之后再处理第二个
-
dalvik和ART的区别
dalvik是执行的时候编译+运行,安装比较快,开启应用比较慢,应用占用空间小 ART是安装的时候就编译好了,执行的时候直接就可以运行的,安装慢,开启应用快,占用空间大、
- Lrucache的实现
- APK瘦身的办法
- AIDL实现;
- fresco picasso 区别
- Android新特性有哪些(5.0 6.0 7.0)
-
什么是Dalvik虚拟机?
- Dalvik虚拟机是Android平台的核心。它可以支持.dex格式的程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,可以减少整体文件尺寸,提高I/O操作的速度,适合内存和处理器速度有限的系统。
- Dalvik虚拟机的作用是什么? Dalvik虚拟机主要是完成对象生命周期管理,内存回收,堆栈管理,线程管理,安全和异常管理等等重要功能。
- Dalvik虚拟机与JVM有什么区别: Dalvik 基于寄存器,而 JVM 基于栈。基于寄存器的虚拟机对于更大的程序来说,在它们编译的时候,花费的时间更短。Dalvik执行.dex格式的字节码,而JVM执行.class格式的字节码。
- 每个应用程序对应多少个Dalvik虚拟机:
每一个Android应用在底层都会对应一个独立的Dalvik虚拟机实例,其代码在虚拟机的解释下得以执行
,而所有的Android应用的线程都对应一个Linux线程
- Dalvik虚拟机是Android平台的核心。它可以支持.dex格式的程序的运行,.dex格式是专为Dalvik设计的一种压缩格式,可以减少整体文件尺寸,提高I/O操作的速度,适合内存和处理器速度有限的系统。
-
应用常驻后台,避免被第三方杀掉的方法,讲讲你用过的奇淫巧技?
- Service设置成START_STICKY kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样
- 通过 startForeground将进程设置为前台进程,
做前台服务,优先级和前台应用一个级别,除非在系统内存非常缺,否则此进程不会被 kill
- 双进程Service:
让2个进程互相保护**,其中一个Service被清理后,另外没被清理的进程可以立即重启进程
- QQ黑科技: 在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死
- 在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应用 Android4.0系列的一个漏洞,已经确认可行
- 用C编写守护进程(即子进程) : Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。鉴于目前提到的在Android->- Service层做双守护都会失败,我们可以fork出c进程,多进程守护。死循环在那检查是否还存在,具体的思路如下(Android5.0以上的版本不可行)
- 用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。
- 在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。
- 联系厂商,加入白名单
- Service设置成START_STICKY kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样
-
JNI系列问题
-
如何使用JNI
- JAVA中声明native 方法如private native String printJNI(String inputStr);
- 使用javah工具生成.h头文件这时候头文件中就会自动生成对应的函数JNIEXPORT jstring JNICALL Java_com_wenming_HelloWorld_printJNI
- 实现JNI原生函数源文件,新建HelloWorld.c文件,对刚才自动生成的函数进行具体的逻辑书写,例如返回一个java叫做HelloWorld的字符串等
- 编译生成动态链接so文件**
- Java中调用Sysytem.load方法把刚才的so库加载进来,就可以调用native方法了
- JAVA中声明native 方法如private native String printJNI(String inputStr);
- 如何通过JNI传递String对象 Java的String和C++的string是不能对等起来的,所以当我们拿到.h文件下面的jstring对象,会做一次转换我们把jstring转换为C下面的char*类型,
获取值
-
constchar* str;
-
str = env->GetStringUTFChars(prompt,false);
-
赋予值
-
char* tmpstr =”return string succeeded”;
-
jstring rtstr = env->NewStringUTF(tmpstr);
-
- binder原理,server,cilent,servicemanager,binder
评论列表
文章目录