android底层原理相关的面试题

匿名网友 匿名网友 发布于: 2016-11-17 00:00:00
阅读 273 收藏 0 点赞 0 评论 0

  • 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的操作转发给ActivityThreadActivityThread通过ClassLoader导入相应的Activity类,然后把它启动起来。
  • Android开机过程
    • BootLoder引导,然后加载Linux内核.
    • 0号进程init启动.加载init.rc配置文件,配置文件有个命令启动了zygote进程 zygote开始forkSystemServer进程
    • SystemServer加载各种JNI,然后init1,init2方法,init2方法中开启了新线程 ServerThread.
    • SystemServer中会创建一个socket客户端,后续AMSActivityManagerService)会通过此客户端和zygote通信
    • ServerThreadrun方法中开启了AMS,还孵化新进程ServiceManager,加载注册了一溜的服务,最后一句话进入loop 死循环
    • run方法的SystemReady调用resumeTopActivityLocked打开锁屏界面
  • APP启动过程 

    上图就可以很好的说明App启动的过程 ActivityManagerService组织回退栈时以ActivityRecord为基本单位,所有的ActivityRecord放在同一个ArrayList里,可以将mHistory看作一个栈对象,索引0所指的对象位于栈底,索引mHistory.size()-1所指的对象位于栈顶 Zygote进程孵化出新的应用进程后,会执行ActivityThread类的main方法.在该方法里会先准备好Looper和消息队列,然后调用attach方法将应用进程绑定到ActivityManagerService,然后进入loop循环,不断地读取消息队列里的消息,并分发消息。 ActivityThreadmain方法执行后,应用进程接下来通知ActivityManagerService应用进程已启动,ActivityManagerService保存应用进程的一个代理对象,这样ActivityManagerService可以通过这个代理对象控制应用进程,然后ActivityManagerService通知应用进程创建入口Activity的实例,并执行它的生命周期方法

  • android进程间通信(IPC)Binder机制  Binder作为一种进程间通信机制,负责提供远程调用的功能(RPC),它的系统组件主要包括四种:Client, Server, ServiceManager, Binder Driver.
  • ServiceIntentService的使用比较 Service运行在主线程,操作耗时操作会阻塞,intentService运行在
    一个单独的worked Thread里处理,不会阻塞主线程。当多次启动时IntentService会处理完成一个之后再处理第二个
  • dalvikART的区别

    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线程
  • 应用常驻后台,避免被第三方杀掉的方法,讲讲你用过的奇淫巧技?
    • Service设置成START_STICKY kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样
    • 通过 startForeground将进程设置为前台进程,
      做前台服务,优先级和前台应用一个级别,除非在系统内存非常缺,否则此进程不会被 kill
    • 双进程Service
      2个进程互相保护**,其中一个Service被清理后,另外没被清理的进程可以立即重启进程
    • QQ黑科技: 在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死
    • 在已经root的设备下,修改相应的权限文件,App伪装成系统级的应用 Android4.0系列的一个漏洞,已经确认可行
    • C编写守护进程(即子进程) : Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。鉴于目前提到的在Android->- Service层做双守护都会失败,我们可以forkc进程,多进程守护。死循环在那检查是否还存在,具体的思路如下(Android5.0以上的版本不可行)
    • C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。
    • NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。
    • 联系厂商,加入白名单
  • 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方法了
    • 如何通过JNI传递String对象 JavaStringC++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

评论列表
文章目录