1)Android App的生命周期是什么;
>前台 后台 关闭 激活 未激活的状态等

2)四大组件很熟悉了吧,ContentProvider的生命周期是什么;
>ContentProvider通过工具ContentResolver激活,使用者自行管理cursor的生命周期.

3)Android设备开机的启动过程; http://blog.jobbole.com/67931/
》Boot ROM ->Boot Loader ->Kernel ->init ->Daemon Zygote Runtime Dalvik Vm ->System Servers  Service Manager Managers
>>当电源按下,引导芯片代码开始从预定义的地方(固化在ROM)开始执行。加载引导程序到RAM,然后执行。 >>引导程序是在Android操作系统开始运行前的一个小程序。引导程序是运行的第一个程序,因此它是针对特定的主板与芯片的。设备制造商要么使用很受欢迎的引导程序比如redboot、uboot、qi bootloader或者开发自己的引导程序,它不是Android操作系统的一部分。引导程序是OEM厂商或者运营商加锁和限制的地方。>>Android内核与桌面linux内核启动的方式差不多。内核启动时,设置缓存、被保护存储器、计划列表,加载驱动。当内核完成系统设置,它首先在系统文件中寻找”init”文件,然后启动root进程或者系统的第一个进程。>>init是第一个进程,我们可以说它是root进程或者说有进程的父进程。init进程有两个责任,一是挂载目录,比如/sys、/dev、/proc,二是运行init.rc脚本。>>Zygote让Dalvik虚拟机共享代码、低内存占用以及最小的启动时间成为可能。Zygote是一个虚拟器进程,正如我们在前一个步骤所说的在系统引导的时候启动。Zygote预加载以及初始化核心库类。通常,这些核心类一般是只读的,也是Android SDK或者核心框架的一部分。在Java虚拟机中,每一个实例都有它自己的核心库类文件和堆对象的拷贝。>>Zygote创建新的进程去启动系统服务。系统服务或服务.>>一旦系统服务在内存中跑起来了,Android就完成了引导过程。在这个时候“ACTION_BOOT_COMPLETED”开机启动广播就会发出去。
第一部分:Bootloader启动
一、Bootloader的定义和种类
二、Arm特定平台的Bootloader
三、U-boot启动流程分析
       第二部分:Linux启动
一、zImage是怎样炼成的?
二、linux的c启动阶段
       第三部分:Android启动
一、init进程
二、init启动的各种服务
三、android启动图示

4)Activity的视图层次是什么?打开一个对话框的时候,这个对话框是如何加入到视图上去的?
>每一个Activity组件的UI内容和布局都是通过与其所关联的一个Window对象的内部的一个View对象来实现的。
getWindow().getDecorView()就是根视图了,当然用Activity.getWindow.getDecorView()
Activity的对话框管理机制。

5)Dialog、PopupWindow、WindowManager加载视图的区别;
>如PhoneStatusBar,ActivityThread,PhoneWindow,PopupWindow,Activity,Toast,Dialog 等等。那这里感觉就比较明显了,这些熟悉的控件和类,就是通过windowmanager ,来把自己的view和界面加到系统中了。
应用层面的界面都是通过windowmanager 加入到framework 中的,ViewRootImpl 是framework对view 的抽象, 界面管理的根节点。
Window是一块电子屏,PhoneWindow是一块手机电子屏,DecorView就是电子屏要显示的内容,Activity就是手机电子屏安装位置。

6)Service与Thread的区别;
> Thread:Thread 是程序执行的最小单元,它是分配CPU的基本单位。可以用 Thread 来执行一些异步的操作。
 Service:Service 是android的一种机制,当它运行的时候如果是Local Service,那么对应的  Service 是运行在主进程的 main 线程上的。如:onCreate,onStart 这些函数在被系统调用的时候都是在主进程的 main 线程上运行的。如果是Remote Service,那么对应的 Service 则是运行在独立进程的 main 线程上。
 Thread 的运行是独立于 Activity 的,也就是说当一个 Activity 被 finish 之后,如果你没有主动停止 Thread 或者 Thread 里的 run 方法没有执行完毕的话,Thread 也会一直执行。因此这里会出现一个问题:当 Activity 被 finish 之后,你不再持有该 Thread 的引用,也就是你下次启动的时候,无法控制之前创建的线程,而service则可以。另一方面,你没有办法在不同的 Activity 中对同一 Thread 进行控制。你也可以在 Service 里注册 BroadcastReceiver,在其他地方通过发送 broadcast 来控制它,这些是 Thread 做不到的。
  根据进程优先级,Thread在后台运行(Activty stop)的优先级低于后台运行的Service,如果执行系统资源紧张,会优先杀死前一种,后台运行的Service一般情况下不会被杀死,如果被杀死,系统空闲时会重新启动service.
一.在应用中,如果是长时间的在后台运行,而且不需要交互的情况下,使用服务。
同样是在后台运行,不需要交互的情况下,如果只是完成某个任务,之后就不需要运行,而且可能是多个任务,需需要长时间运行的情况下使用线程。
二.如果任务占用CPU时间多,资源大的情况下,要使用线程。

7)ServiceManager、ActivityManager、XXXManager是干什么的?
》C/S框架及代理 框架IOC

8)为什么一定要在UI线程更新视图,为什么要这么设计;
>UI线程及Android的单线程模型原则当应用启动,系统会创建一个主线程(main thread)。这个主线程负责向UI组件分发事件(包括绘制事件),也是在这个主线程里,应用和Android的UI组件(components from the Android UI toolkit (components from the android.widget and android.view packages))发生交互。
google这样设计的原因就在于让UI线程做的事情更纯粹一些,都是界面方面的事情,如果在ui线程执行耗时的操作,在做UI操作的时候会有卡顿的感觉。即从更新View的角度来说,最好是UI线程,非UI线程也不是不能更新UI。
 Android的单线程模型有两条原则:
1.不要阻塞UI线程。
2.不要在UI线程之外访问Android UI toolkit(主要是这两个包中的组件:android.widget and android.view)。

9)能不能直接New一个Activity并启动它;打包APK的过程干了什么;
》singleTop,singleTask启动模式会调用onNewIntent(Intent intent)

10)安装APK的过程干了什么;
>Android应用安装有如下四种方式

11)启动APK的过程干了什么;
>Java进程的启动比较特殊,Java进程是zygote启动的,zygote在folk进程之后,并没有执行execve指令,因此是共享了zygote的代码段和数据段。其它的java进程,可以看做都是zygote的克隆,克隆之后的进程,各自根再据自己的需求(java代码),解释java语言。

12)怎么玩DexLoader(动态升级);
>Android 插件化 —— 指将一个程序划分为不同的部分,比如一般 App 的皮肤样式就可以看成一个插件 
Android 组件化 —— 这个概念实际跟上面相差不那么明显,组件和插件较大的区别就是:组件是指通用及复用性较高的构件,比如图片缓存就可以看成一个组件被多个 App 共用 
Android 动态加载 —— 这个实际是更高层次的概念,也有叫法是热加载或 Android 动态部署,指容器(App)在运?状态下动态加载某个模块,从而新增功能或改变某?部分行为

13)MVP模式是啥;
> MVC (Model-View-Controller):M是指逻辑模型,V是指视图模型,C则是控制器。一个逻辑模型可以对于多种视图模型,比如一批统计数据你可以分别用柱状图、饼图来表示。一种视图模型也可以对于多种逻辑模型。使用MVC的目的是将M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式,而C存在的目的则是确保M和V的同步,一旦M改变,V应该同步更新,
1) 视图层(View):一般采用XML文件进行界面的描述,使用的时候可以非常方便的引入。当然,如何你对Android了解的比较的多了话,就一定可以想到在Android中也可以使用JavaScript+HTML等的方式作为View层,当然这里需要进行Java和JavaScript之间的通信,幸运的是,Android提供了它们之间非常方便的通信实现。     
  2) 控制层(Controller):Android的控制层的重任通常落在了众多的Acitvity的肩上,这句话也就暗含了不要在Acitivity中写代码,要通过Activity交割Model业务逻辑层处理,这样做的另外一个原因是Android中的Acitivity的响应时间是5s,如果耗时的操作放在这里,程序就很容易被回收掉。
  3) 模型层(Model):对数据库的操作、对网络等的操作都应该在Model里面处理,当然对业务计算等操作也是必须放在的该层的。就是应用程序中二进制的数据。

14)View的生命周期是啥;
>android view有以下14个周期:
1、onFinishInflate() 当View中所有的子控件均被映射成xml后触发 。
2、onMeasure( int , int ) 确定所有子元素的大小 。
3、onLayout( boolean , int , int , int , int ) 当View分配所有的子元素的大小和位置时触发 。
4、onSizeChanged( int , int , int , int ) 当view的大小发生变化时触发 。
5、onDraw(Canvas) view渲染内容的细节。 
6、onKeyDown( int , KeyEvent) 有按键按下后触发 。
7、onKeyUp( int , KeyEvent) 有按键按下后弹起时触发 。
8、onTrackballEvent(MotionEvent) 轨迹球事件 。 
9、onTouchEvent(MotionEvent) 触屏事件 。
10、onFocusChanged( boolean , int , Rect) 当View获取或失去焦点时触发 。
11、onWindowFocusChanged( boolean ) 当窗口包含的view获取或失去焦点时触发 。
12、onAttachedToWindow() 当view被附着到一个窗口时触发 。
13、onDetachedFromWindow() 当view离开附着的窗口时触发,Android123提示该方法和 onAttachedToWindow() 是相反的。 
14、onWindowVisibilityChanged( int ) 当窗口中包含的可见的view发生变化时触发。

15)TWEEN动画跟熟悉动画在View的绘制过程是怎么作用的;
> 视图动画注意事项:特别特别注意:补间动画执行之后并未改变View的真实布局属性值。切记这一点,譬如我们在Activity中有一个Button在屏幕上方,我们设置了平移动画移动到屏幕下方然后保持动画最后执行状态呆在屏幕下方,这时如果点击屏幕下方动画执行之后的Button是没有任何反应的,而点击原来屏幕上方没有Button的地方却响应的是点击Button的事件。

16)自定义动画玩过吗,里面的Matrix怎么控制。res里面的XML资源最终都要转化成JavaCode,怎么完全脱离   res,用纯代码的方式实现res资源的功能,怎么缩放一张点九图;
> Matrix类:Translate—平移变换;Scale—缩放变换;Rotate—旋转变换;Skew————错切变换
Matrix提供了一些方法来控制图片变换:
setTranslate(float dx,float dy):控制Matrix进行位移。
setSkew(float kx,float ky):控制Matrix进行倾斜,kx、ky为X、Y方向上的比例。
setSkew(float kx,float ky,float px,float py):控制Matrix以px、py为轴心进行倾斜,kx、ky为X、Y方向上的倾斜比例。
setRotate(float degrees):控制Matrix进行depress角度的旋转,轴心为(0,0)。
setRotate(float degrees,float px,float py):控制Matrix进行depress角度的旋转,轴心为(px,py)。
setScale(float sx,float sy):设置Matrix进行缩放,sx、sy为X、Y方向上的缩放比例。
setScale(float sx,float sy,float px,float py):设置Matrix以(px,py)为轴心进行缩放,sx、sy为X、Y方向上的缩放比例。

17)Binder原理是什么,除了Binder之外,还能怎么跟Service交互;
> Binder是Android系统进程间通信(IPC)方式之一。Linux已经拥有的进程间通信IPC手段包括(Internet Process Connection): 管道(Pipe)、信号(Signal)和跟踪(Trace)、插口(Socket)、报文队列(Message)、共享内存(Share Memory)和信号量(Semaphore)
Binder使用Client-Server通信方式.
Binder框架定义了四个角色:Server,Client,ServiceManager(以后简称SMgr)以及Binder驱动。其中Server,Client,SMgr运行于用户空间,驱动运行于内核空间。这四个角色的关系和互联网类似:Server是服务器,Client是客户终端,SMgr是域名服务器(DNS),驱动是路由器。
Binder使用Client-Server通信方式,接收缓存管理和线程池管理方式.
> AIDL

18)Touch事件的分发机制;
> 传递——dispatchTouchEvent()函数、拦截——onInterceptTouchEvent()函数、消费——onTouchEvent()函数和OnTouchListener(事件分发与消费)

19)能不能用代码模拟一组TOUCH事件(比如自动点击广告,自动滚动);TOUCH事件传递及分发
》final long downTime = SystemClock.uptimeMillis();
final MotionEvent downEvent = MotionEvent.obtain(
        downTime, downTime, MotionEvent.ACTION_DOWN, x, y, 0);
final MotionEvent upEvent = MotionEvent.obtain(
        downTime, SystemClock.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0);
mSeekBar.onTouchEvent(downEvent);
mSeekBar.onTouchEvent(upEvent);
downEvent.recycle();
upEvent.recycle();
。重点是需要知道两个点:一是你模拟点击的坐标,在这里就是x和y,二就是你需要设置响应这个点击事件的View,这里是一个SeekBar,

20)ROOT的原理是什么,系统是怎么管理APP的权限的;
》Android的内核就是Linux,在Linux下获取root权限的时候就是执行sudo或者su。

Linux下su以后输入密码就可以root了,但Android里的su和Linux里的su是不一样的,Android里的su不是靠验证密码的,而是看你原来的权限是什么。意思就是如果你是root,那你可以通过su切换到别的用户,比如说shell,wifi,audio什么的。

需要把一个所有者是root的su拷贝到Android手机上,并且把su的权限标志位置成-rwsr-xr-x。能把这个事情搞定你就成功root了一个手机。大概意思就是两行代码cp /data/tmp/su /system/bin/                   #copy su 到/system/分区chown root:root su                                 #su的所有者置成rootchmod 4775 /system/bin/su                   #把su置成-rwsr-xr-x
。已经有root权限的进程都是出厂时候就装到手机上的,代码写死了,你没法控制它执行你自己的代码啊。这个时候就需要你找漏洞了,比如用来破解Android2.3 root权限的zergRush漏洞就是利用一个拥有root权限的进程栈溢出漏洞。

》iphone的越狱其实和Android的root是一回事儿,都是越权操作。所以越狱的方式也都差不多,也是找IOS自带程序的漏洞,只不过IOS安全性强一点,所以也比较难找。如果你发现你的iphone的某个自带程序经过一些特定操作会出现系统崩溃重启的现象,并且是可以复现的,那就很有可能可以用来越狱了。
关于sudoandroid的工程里没有sudo这个东西。sudo是为了给普通用户临时分配root权限的,Android里建立了很多用户,比如wifi,shell等等,这些用户可以访问那个文件,不可以访问那个文件,代码里已经写死了,权限也分配的很分明。它们在运行的过程中不需要临时获得root权限。所以Android不需要sudo这个程序。Android系统里面没有su这个可执行的文件,提权就是利用Android系统漏洞把su装入系统。
其实就是linux系统里面的su命令,切换root用户,等于window系统的超级管理员。
安卓基于linux,su命令的效果一样。
root就是在你的安卓系统里面添加一个su二进制文件,当app需要使用root权限时(一般都是涉及系统文件),就通过执行su文件获取一个root的权限。
而我们需要一个管理app获取root权限的管理软件,这个就是平时用到的超级用户等app。只有安装了这个管理软件之后,我们才可以限制app的root权限,不然的话,如果系统本身不识别你安装的su文件,app就可以直接使用root权限。
1,Root 是什么?
2,Android 手机Root 的原理?
3,什么是SuperUser ?
4,su.c 的作用?
5,setUid() 和setGid() 的左右?
su 源代码 下载地址:http://download.csdn.net/detail/jinzhu117/4821630
SuperUser 源代码下载地址:http://download.csdn.net/detail/jinzhu117/4821569

21)Material Desgin这么好看,为什么不出兼容包,让5.0以下的系统也能要动画效果
>使用support library或者使用开源控件。google官方,以及一些大牛,给我们提供了一些程序,让我们在低版本上面可以实现Material风格的程序,V4、V7、V13等。

22)ART模式与Dalvik有什么不同;
》Dalvik 经过优化,允许在有限的内存中同时运行多个虚拟机的实例,并且每一个Dalvik 应用作为一个独立的Linux 进程执行。独立的进程可以防止在虚拟机崩溃的时候所有程序都被关闭。
》安卓4.4的升级颠覆了手机运行速度和运行方式,安卓4.2以前的系统使用的是传统Dalvik模式,
测试了电量,分别对Nexus 5的两种模式进行了续航测试,在4小时的中等强度测试下发现ART模式下要略比Dalvik模式省电一些,打开省电%5到%8左右的。
ART模式与Dalvik究竟有什么本质的不同?比如Dalvik模式像一台折叠自行车,每次骑之前都要组装后才能上路,ART(Android runtime)模式就是一个已经装好的自行车,直接就能骑走了。
所以说适配ART模式,是目前最新的一种系统体验!也是安卓系统解决吃硬件的最好解决方法!
Android4.4采用ART取代Dalvik,简单理解就是Android程序运行的根本机制改变了,程序会启动地更快,而且会更省资源。表现在用户体验上,就是Android更流畅了,同时续航能力显著增加。
ART模式与Dalvik模式最大的不同在于,在启用ART模式后,系统在安装应用的时候会进行一次预编译,在安装应用程序时会先将代码转换为机器语言存储在本地,这样在运行程序时就不会每次都进行一次编译了,执行效率也大大提升。
》ART模式和Dalvik模式,相比较而言ART模式就很好的解决了这个问题,通过在安装应用程序时,自动对程序进行代码预读取编译,让程序直接编译成机器语言,免去了Dalvik模式要时时转换代码,实现高效率、省电、占用更低的系统内存、手机运行流畅。但凡事总有正反两面,ART在解决了该问题的同时,同时也有如:会占用略高一些的存储空间、安装程序时要相比普通Dalvik模式要长一些时间来实现预编译
》Android操作系统已经成熟,Google的Android团队开始将注意力转向一些底层组件,其中之一是负责应用程序运行的Dalvik运行时。Google开发者已经花了两年时间开发更快执行效率更高更省电的替代ART运行时。 ART代表Android Runtime,其处理应用程序执行的方式完全不同于Dalvik,Dalvik是依靠一个Just-In-Time (JIT)编译器去解释字节码。开发者编译后的应用代码需要通过一个解释器在用户的设备上运行,这一机制并不高效,但让应用能更容易在不同硬件和架构上运 行。ART则完全改变了这套做法,在应用安装时就预编译字节码到机器语言,这一机制叫Ahead-Of-Time (AOT)编译。在移除解释代码这一过程后,应用程序执行将更有效率,启动更快。

ART优点:
1、系统性能的显著提升。
2、应用启动更快、运行更快、体验更流畅、触感反馈更及时。
3、更长的电池续航能力。
4、支持更低的硬件。

ART缺点:
1、更大的存储空间占用,可能会增加10%-20%。
2、更长的应用安装时间。

23)Render Thread是怎么工作的;以及视图绘制
》在硬件加速渲染环境中,Android应用程序窗口的UI渲染是分两步进行的。第一步是构建Display List,发生在应用程序进程的Main Thread中;第二步是渲染Display List,发生在应用程序进程的Render Thread中。Display List的渲染不是简单地执行绘制命令,而是包含了一系列优化操作,例如绘制命令的合并执行。
Android系统--视图绘制主要由以下几部分组成:
     1) Canvas(画布)
         提供画图所需要的所有工具,即各种draw函数;当前可用的画布对象有:具有硬件加速的GLES20Canvas和GLES20RecordingCanvas,不使用硬件加速的CompatibleCanvas)。
     2) View(视图)
         在具体画布对象上完成各种绘制图形的操作,可根据需要选择以上三种画布中的一种。
     3)  Gl20Renderer(把图直接绘制到屏幕上)
   它是硬件加速视图绘制的引擎,负责整个与硬件加速相关的视图绘制过程,具体功能如下:
           (1) 创建以下实例对象
             ? GLES20Canvas           (Canvas)
             ? GLES20DisplayList      (DisplayList)
             ? GLES20TextureLayer  (HardwareLayer)
             ? GLES20RenderLayer  (HardwareLayer)
             ? SurfaceTexture
             ? Gl20Renderer              (HardwareRenderer)
           (2) 在GlRenderer.draw中调用View.getDisplayList()完成DisplayList命令的录制,并返回DisplayList
                 注:只有View被attach到硬件加速,才能创建DisplayList;
            真正的命令录制工作在View.getDisplayList(DisplayList displayList, boolean isLayer)中完成。
          (3) 在GlRenderer.draw中调用GLES20Canvas.drawDisplayList,把DisplayList中录制的命令回放在画布上。
           (4) Gl20Renderer对象对应的画布为GLES20Canvas,Gl20Renderer对象在画布上的绘制实际上是绘制在OPENGL绘制上下文对应的主缓冲区。
     4) GLES20DisplayList(把录制命令录制到Native的DiplayList中)
         GLES20DisplayList对象创建具体的DisplayList对象及绘制用的画布(GLES20RecordingCanvas画布),完成视图绘制操作的DisplayList命令录制等工作。
     5) GLES20RenderLayer(绘制到FOB Layer中,当作纹理)
         负责创建硬件Layer层(GLES20Canvas.nCreateLayer)和绘制用到的画布(GLES20Canvas,使用Layer实例化GLES20Canvas(layer, trans))等工作。
         为了有效支持视图的多层绘制,视图对象可以创建一个HardwareLayer层完成视图的图形在硬件纹理上的绘制操作或者其它特效操作,这就是GLES20RenderLayer对象的作用,创建独立的层并返回相应的画布供视图绘制使用。
  1.1 View.draw(Canvas canvas)六步曲
    此函数将把View自身及其所有的子子孙孙绘制到给定的画布上。其画图过程主要分为以下六步:
      1) 画背景
      2) 如果需要,保存画布的层为未来的淡入淡出做好准备
      3) 画View本身的内容
      4) 画它的孩子
      5) 如果需要,画淡入淡出的边缘并恢复层
      6) 画装饰部分(如:滚动条)

24)不把功能都用H5实现然后把需求都扔给前段的人去做;
》用h5开发出的web app体验上并不比原生app差太多,但其跨平台的特性大大减低了开发成本,而且可以快速迭代。

25)ServiceManager、ActivityManager、packageManager 、*****Manager 都弄懂了?
  >在Android系统中用到最多的通信机制就是Binder,Binder主要由Client、Server、ServiceManager和Binder驱动程序组成。其中Client、Service和ServiceManager运行在用户空间,而Binder驱动程序运行在内核空间。核心组件就是Binder驱动程序了,而ServiceManager提供辅助管理的功能,无论是Client还是Service进行通信前首先要和ServiceManager取得联系。而ServiceManager是一个守护进程,负责管理Server并向Client提供查询Server的功能。
  >Service Manager存在的意义
1.Service Manager能集中管理系统内的所有服务,它能被施加权限控制,并不是任何进程都能注册服务的。
2.Service Manager支持通过字符串名称来查找对应的Service。
3.由于各种原因的影响,Server进程可能生死无常。如果有了Service Manager做统一的管理,那么Client只要向Service Manager做查询,就能得到Server的最新信息。
  >Service Manager进程的主要工作如下:
    1.初始化binder,打开/dev/binder设备;在内存中为binder映射128K字节空间;
    2.指定SM对应的代理binder的handle为0,当client尝试与SM通信时,需要创建一个handle为0的代理binder,这里的代理binder其实就是第一节中描述的那个代理接口;
3.通知binder driver(BD)使SM成为BD的context manager;
4.维护一个死循环,在这个死循环中,不停地去读内核中binder driver,查看是否有可读的内容;即是否有对service的操作要求, 如果有,则调用svcmgr_handler回调来处理请求的操作。
5.SM维护了一个svclist列表来存储service的信息。

26)Binder 也搞清楚了?
  >Android系统进程间通信机制Binder的总体架构由Client、Server、ServiceManager和驱动程序Binder四个组件构成.
 >binder通信是一种client-server的通信结构,
    1.从表面上来看,是client通过获得一个server的代理接口,对server进行直接调用;
    2.实际上,代理接口中定义的方法与server中定义的方法是一一对应的;
    3.client调用某个代理接口中的方法时,代理接口的方法会将client传递的参数打包成为Parcel对象;
    4.代理接口将该Parcel发送给内核中的binder driver.
    5.server会读取binder driver中的请求数据,如果是发送给自己的,解包Parcel对象,处理并将结果返回;
    6.整个的调用过程是一个同步过程,在server处理的时候,client会block住。

27)IPC 也弄明白了?
> 第一种方式就是Intent,Intent可以非常方便的通讯,但是它是非实时的,无法进行实时的像函数调用那样的实时的通讯。
  但是IPC的根本目的还是为了实现函数的调用,即使是传递数据也是要通过函数调用的方式,为什么呢?因为程序运行总是要知道状态,要有逻辑上的行为,因此必须通讯函数才能体现出行为
  IPC的机制除了进程,或者说不同的应用程序之间进行通讯,同时也能够让不同的组件之间进行像普通对象那样进行实时的调用。因为Android的组件都是由系统框架统一的进行构建和销毁,所以你就无法创建对象,因此,就没有办法像普通的对象那样进行组合或者聚合,从而也就没有办法进行直接调用。但是IPC的方式就可以让Activity/Service获取另外一个Service对象的引用,从而直接调用其上的方法。
  还有,就是这些IPC方法总是产生客户/服务端模式的调用,也即是客户端组件(Activity/Service)持有服务端Service的组件,只能是客户端主动调用服务端的方法,服务端无法反过来调用客户端的方法,因为IPC的另一端Service无法获取客户端的对象。
  >有三种方式可以进行IPC通讯:
1. 直接使用Binder对象,
  缺点是这种方式不能进行跨进程,跨应用程序的函数调用。只能实现在同一个进程之中,同一个应用程序之中的不同的组件之间通讯。优点就是这种方式使用起来特别简单,对于公开出来的方法没有任何的限制,可以传递任何的对象,甚至是回调等等。总体上来讲如果不需要跨进程,这是最好的实现方式,可以完全实现像普通对象之间的组合和聚合。但是这里,最好不要像Android文档中的示例那样,直接返回Service对象,因为Service对象会有很多Public的方法,如果直接返回【Service】对象会导致公开很多不必须的方法,一旦Client端调用这些方法,将导致奇怪的现象和Bug,一个方法就是用Proxy对Service对象进行封装,只公开需要的接口。
2. 使用Messenger对象,
  这是利用了消息循环队列来进行通讯的,也就是说服务端封装成了一个Handler,客户端向这个Handler发送Message,服务端再处理这个Message从而实现通讯。优点,最突出的优点就是它可以保证线程上的安全,或者说时序上的安全。因为客户端是向Handler发送消息,而不是直接的函数调用,所以呢?Message都是按先后的顺序放到服务端的消息队列当中,然后再由服务端Service决定如何处理这些Message。因为直接的函数调用会导致被调用的函数也会出现在调用者的线程之中,也就是说被调用到的函数也会继续存在于调用者的调用栈中,因此有可能产生线程的问题。而Messenger方式,并不是直接的函数调用,而是仅向Service的Handler发送一个Message,然后调用者就此返回,其调用栈也就此停止,Service可以选择如何处理这一个Message。Messenger方式即可以在同一个进程之中,也可以跨进程实现真正的IPC。但是它的缺点也是相当的明显的,就是它是发送一个Message对象,而不是直接的函数调用,所以非常的不直观,另外,Message对象也无法方便的携带过多的参数,如果超过一个对象,只能封装打包成一个对象然后再放到Message.obj中。需要注意的是,如果是在同一个进程之中,Message可以携带任何对象,但如果是跨进程,则Message.obj中存放的必须是实现了Parcelable接口的对象,否则无法实现IPC,会有Exception。还有一个缺点,就是Message对象的标识(Message.what)必须是Client端和Service端都定义一致,否则就无法通讯,这在调试的时候必须注意,因为这不会有编译或者运行时错误,但就是无法正常工作,是比较隐蔽的Bug。
3. 使用AIDL进程通讯
  这是最正统的IPC方式,实际上Messenger的跨进程通讯的底层也是通过AIDL来实现的。它的优点就是完全是为跨进程而设计的,接口由AIDL文件指定,Client端和Service端都通过AIDL所描述的接口来进行调用和实现,不容易出错。需要注意的是接口中的所有的对象都必须实现了Parcelable接口,即使仅仅是在同一个进程之中。它的缺点就是必须要在每一个想要通讯的地方定义一个完全一样的AIDL文件,否则IPC不会成功,而且它是严格的按照IPC的机制来的,所以即使是在同一进程之内,所有的接口的参数和返回值的对象必须是实现了Parcelable接口的,但Binder对象和Messenger就无此限制。需要一点:定义AIDL会严格按照IPC的方式进程即使是在同一个进程之中。所以,除非是真的要跨进程通讯,否则不要使用AIDL。

28)FrameWork 层的每个类都折腾了?
> 在写android代码时,我们基本不会出现new MyActivity(), new MyService()等等这样的代码,要知道android app的编写语言是java,java的特点是什么:“一切皆对象”。那么问题来了,我们写的activity,service等什么时候被new出来了的呢,它们是怎样被new出来的,带着这个问题我们继续看下去。
  android framework层架构采用了ioc方式,程序员实现的activity,service等式在android的框架层new出来的,程序猿在完成一个activity后都需要在mainfest注册。然后android framework层利用反射的方式动态的创建其对象。所以android采用这样的方式将控制权全部掌握在框架层,客户端程序员只需要按照其方式实现就行。
  但是紧接着新的问题又会出现,既然我们客户端程序员不需要new 组件对象,也就是说我们的各个组件间是相互独立的。然后新的问题产生各组件之间的交互该如何处理呢,android framework为我们想到了这个问题,所以Intent信使产生了,android设计者通过Intent信使实现各个组件间的交互,不得不说框架的设计确实很好,这里膜拜大神。
  android的框架层牢牢掌控住客户端的,包括对象的创建调用等。其中运用的很多好的设计模式以及方法值得我们学习。
  关于framework,更多是做的应用层之下的系统层面的东西。比如电源管理、消息队列、包管理等等,还包括对硬件的支持及系统提供给上层的硬件功能调用接口。framework的学习必然离不开不断编译rom和刷机。这就要求有耐心有时间有兴趣。而且由于framework层多数模块都是以JNI方式被调用的,因此你需要有比较扎实的C语言基础,之少能看懂程序结构。除此之外,对你想要详细研读的模块在应用层的应用需要有必要的理解。我刚开始看源码的时候是从电源管理模块开始看的,就是因为当时对android系统自带的电源提醒方式以及电量通知不太满意,想重新定义更多层级的提醒。刚开始也是一头雾水,但还是硬着头皮一点点啃。这个过程中,为了防止忘记之前看过什么,所以又不断对看过的源码做注释并做阅读笔记。大概两三个月,虽然了解的也比较浅显,但是我的目的达到了。源码之路漫漫,看个三五年都不一定敢说能够整体吃透。虽如此,但只要有钻研的方向和基本的能力,相信工作中遇到的framework层的改动应当还是能够负担得住的。

29)Hook 会玩了?
  >如果要拦截恶意软件对电话、短信等API的调用,在Java或者Dalvik层面是不好进行的,因为这些层面都没有提供Hook的手段,而在Native层面,我认为可行的方案是对电话、短信的运行库so进行Hook(比如系统运行库\system\lib\libreference-ril.so或\system\lib\libril.so),如果注入自己的so到上述进程后,并通过dlopen()和dlsym()获取原有API地址,替换原有API地址为自己so中的API地址就可以达到Hook的目的。Hook的前提是进程注入,而Linux下最便捷的进程注入手段——ptrace.一种方案:代码主要功能是注入子进程的地址空间,Hook住子进程执行系统调用时的参数,并反转其参数,从而逆序输出ls命令的结果。
  Intel官网上下载了Intel处理器开发手册《64-ia-32-architectures-software-developer-vol-1-manual.pdf》方才解答我的问题,寻址方式涉及两个寄存器,DS和RSI,参考手册的说法,DS表示数据段的selector,其实这个selector就是index索引的意思,由于x64下字长64bit,即8个字节,索引乘以8即得数据段在内存中的基址,RSI表示数据段内偏移地址,与基址相加即可得出数据的绝对地址,使用此地址直接访问内存就可以取出数据。

30)各种 SystemService 也知道怎么运行的了?

31)View 的渲染你明白是怎么回事了?
》父View与子View
》》消息队列有如下几个好处,这大都是由其系统解耦和消息缓存两点扩展而来的:
提升系统可靠性:
冗余:Process_B崩溃之后,数据并不会丢失,因为MQ多采用put-get-delete模式,即,仅当确认message被完成处理之后,才从MQ中移除message;
可恢复:MQ实现解耦,部分进程崩溃,不会拖累整个系统瘫痪,例,Process_B崩溃之后,Process_A仍可向MQ中添加message,并等待Process_B恢复;
可伸缩:有较强的峰值处理能力,通常应用会有突发的访问流量上升情况,使用足够的硬件资源时刻待命,空闲时刻较长,资源浪费,而消息队列却能够平滑峰值流量,缓解系统组件的峰值压力;
提升系统可扩展性:
调整模块:由于实现解耦,可以很容易调整,消息入队速率、消息处理速率、增加新的Process;
其他:
单次送达:保证MQ中一个message被处理一次,并且只被处理一次。本质:get获取一个message后,这一message即被预定,同一进程不会再次获取这一message;当且仅当进程处理完这一message后,MQ中会delete这个message。否则,过一段时间后,这一message自动解除被预订状态,进程能够重新预定这个message;
排序保证:即,满足队列的FIFO,先入先出策略;
异步通信:很多场景下,不会立即处理消息,这是,可以在MQ中存储message,并在某一时刻再进行处理;
数据流的阶段性能定位:获取用户某一操作的各个阶段(通过message来标识),捕获不同阶段的耗时,可用于定位系统瓶颈。

32)Intent 是如何实现 Activity、Service等之间的解耦合的?
》Intent与Android组件之间的关系

33)单元测试会写了?
》Eclipse与Android Studio的环境配置。

34)Monkey 能跑多长时间?

35)性能测试通过了?

36)ClassLoader 和 DexLoader 会玩了?

40)Android翻页效果原理实现之引来折线??

37)Context 是个啥你也知道了?
>Context字面意思上下文,或者叫做场景,也就是用户与操作系统操作的一个过程,比如你打电话,场景包括电话程序对应的界面,以及隐藏在背后的数据.Activity、Service、Application都是Context的子类;Android系统的角度来理解:Context是一个场景,代表与操作系统的交互的一种过程。从程序的角度上来理解:Context是个抽象类,而Activity、Service、Application等都是该类的一个实现。在其内部引用了一个Activity作为Context,也就是说,我们的这个Activity只要我们的项目活着,就没有办法进行内存回收。而我们的Activity的生命周期肯定没这么长,所以造成了内存泄漏。
>因此应用程序App共有的Context数目公式为:
总Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)
>避免context相关的内存泄露,记住以下几点:
1. 不要让生命周期长的对象引用activity context,即保证引用activity的对象要与activity本身生命周期是一样的
2. 对于生命周期长的对象,可以使用application context
3. 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化

38)权限机制也弄清楚了?
>Android 是一个权限分离的系统 。 这是利用 Linux 已有的权限管理机制,通过为每一个 Application 分配不同的 uid 和 gid , 从而使得不同的 Application 之间的私有数据和访问( native 以及 java 层通过这种 sandbox 机制,都可以)达到隔离的目的 。 与此 同时, Android 还 在此基础上进行扩展,提供了 permission 机制,它主要是用来对 Application 可以执行的某些具体操作进行权限细分和访问控制,同时提供了 per-URI permission 机制,用来提供对某些特定的数据块进行 ad-hoc 方式的访问。
>Android 的权限分离的基础是建立在 Linux 已有的 uid 、 gid 、 gids 基础上的 。
UID 。 Android 在 安装一个应用程序,就会为 它 分配一个 uid (参考 PackageManagerService 中的 newUserLP 实现)。其中普通 A ndroid 应用程序的 uid 是从 10000 开始分配 (参见 Process.FIRST_APPLICATION_UID ), 10000 以下是系统进程的 uid 。
GID 。对 于普通应用程序来说, gid 等于 uid 。由于每个应用程序的 uid 和 gid 都不相同, 因此不管是 native 层还是 java 层都能够达到保护私有数据的作用 。
GIDS 。 gids 是由框架在 Application 安装过程中生成,与 Application 申请的具体权限相关。 如果 Application 申请的相应的 permission 被 granted ,而且 中有对应的 gid s , 那么 这个 Application 的 gids 中将 包含这个 gid s 。
>一个权限主要包含三个方面的信息:权限的名称;属于的权限组;保护级别。一个权限组是指把权限按照功能分成的不同的集合。每一个权限组包含若干具体 权限,例如在 COST_MONEY 组中包含 android.permission.SEND_SMS , android.permission.CALL_PHONE 等和费用相关的权限。
每个权限通过 protectionLevel 来标识保护级别: normal , dangerous , signature , signatureorsystem 。不同的保护级别代表了程序要使用此权限时的认证方式。 normal 的权限只要申请了就可以使用; dangerous 的权限在安装时需要用户确认才可以使用; signature 和 signatureorsystem 的权限需要使用者的 app 和系统使用同一个数字证书。
Package 的权限信息主要 通过在 AndroidManifest.xml 中通过一些标签来指定。如 <permission> 标签, <permission-group> 标签 <permission-tree> 等标签。如果 package 需要申请使用某个权限,那么需要使用 <use-permission> 标签来指定。

39)触屏事件的分发呢?Handler 、Message 和 Looper 是怎么跑起来的?
>一个事件由down move up 三个动作组成,其中move动作可以有多个或者0个,但down 和up动作有且只有一个。这个三个动作中down是最先响应的,它是先驱,由它来决定move和up动作响应路线。
>Touch事件分发中只有两个主角:ViewGroup和View。Activity的Touch事件事实上是调用它内部的ViewGroup的Touch事件,可以直接当成ViewGroup处理。
View在ViewGroup内,ViewGroup也可以在其他ViewGroup内,这时候把内部的ViewGroup当成View来分析。
ViewGroup的相关事件有三个:onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent。View的相关事件只有两个:dispatchTouchEvent、onTouchEvent。
先分析ViewGroup的处理流程:首先得有个结构模型概念:ViewGroup和View组成了一棵树形结构,最顶层为Activity的ViewGroup,下面有若干的ViewGroup节点,每个节点之下又有若干的ViewGroup节点或者View节点
总:在Android方面,自己擅长什么?->业务逻辑控制稍微多点,有自己的一些模块的积累,对UI绘制稍微少点

android夯实总结(设计、细节及思想)相关推荐

  1. 设计原则与思想:面向对象11讲

    文章目录 设计原则与思想:面向对象11讲 理论一:面向对象到底是什么 面向对象编程和面向对象编程语言? 如何判定某编程语言是否是面向对象编程语言? 什么是面向对象分析和面向对象设计? 理论二:封装.抽 ...

  2. Vue.js 官方团队成员霍春阳新作,深入解析 Vue.js 设计细节

    霍春阳(Hcy),Vue.js 官方团队成员.专注于 Web 研发领域,是 Vue.js 3 的核心贡献者之一,Vue.js 文档生成工具 Vuese 的作者,技术社区活跃者,曾撰写大量颇受好评的技术 ...

  3. android 类的设计,Android App的类响应式设计

    导言 根据google的官方显示Android 4.0以上的设备已经有34.2%,由于国内很多的手机都没机会用上google play市场,所以国内市场的情况,得看类似于友盟的季度报告才知道了.个人觉 ...

  4. android客户端框架,最新的一版,通用Android 客户端架构设计,只有你还没看过

    客户端架构设计 客户端设计 目的是整体设计客户端App,架构上打好铺垫. Android客户端架构设计 主要从以下几个方面进行设计:MVP设计风格.整体架构.日志系统.网络系统.本地存储.Test模块 ...

  5. android jsp界面设计,Android 4.0设计规范-UI博客精选

    在拜读和翻译了Android design设计指导后,对比Android 4.0与Android2.3及之前版本的app设计指导,总结了Android 4.0设计的10大改变: 1. 导航栏 (详见模 ...

  6. 【 C++ 技术】 C++ 高性能服务器网络框架设计细节

    作者:范蠡  原文:C++ 高性能服务器网络框架设计细节 前言 这篇文章我们将介绍服务器的开发,并从多个方面探究如何开发一款高性能高并发的服务器程序.需要注意的是一般大型服务器,其复杂程度在于其业务, ...

  7. Android: Kotlin 材料设计入门

    原文:Android: Kotlin 材料设计入门 作者:Joe Howard 译者:kmyhy 更新说明:本教程由 Joe Howard 升级为 Kotlin.原教程作者是 Megha Bambra ...

  8. 设计原则与思想:设计原则12讲

    文章目录 设计原则与思想:设计原则(12讲) 理论一:对于单一职责原则,如何判定某个类的职责是否够"单一"? 如何理解单一职责原则(SRP)? 如何判断类的职责是否足够单一? 类的 ...

  9. Java-单机版的书店管理系统(练习设计模块和思想_系列 六 )

    本系列前面博客的链接: Java-单机版的书店管理系统(练习设计模块和思想_系列 五 ) http://blog.csdn.net/qq_26525215/article/details/511368 ...

  10. 安卓APP设计规范和设计细节

    我们在进行安卓APP设计时,需要好好调整之前的设计规范和设计细节.根据目前流行的安卓手机的系统体验来完成我们的安卓APP设计规范.应该说这是整理出最全面的安卓app设计规范. 1.安卓app设计规范之 ...

最新文章

  1. android听书功能实现,基于Android的喜马拉雅听书的实现.docx
  2. js 日期对象 31 号 setMonth 的锅
  3. 进程环境之环境表【转】
  4. SQL笔记-检索出ID为Int或Long中不连续的第一个点
  5. 移动互联网APP测试流程及测试点(转载) (二)
  6. LINUX系统中动态链接库的创建和使用
  7. The Clean Architecture--一篇很不错的关于架构的文章
  8. 50兆 svg 文件超过_如何让 Flutter 应用更好地使用 SVG?
  9. java编译不报错但运行啥都没_java编译时与运行时概念与实例详解
  10. java中怎么创建栈_这个题如何用栈解呢?
  11. snipaste如何滚动截图_如何让windows10得心应手之工具篇2
  12. 计算机触摸板设置方法,解决办法:四种关闭笔记本电脑触摸板的方法[图形教程]...
  13. 关于 C# dll文件的反编译获取源码
  14. c语言编程的头文件是什么,C语言头文件到底是什么?
  15. 科学-建筑学:建筑学百科
  16. Echarts 实现环状半圆形饼图
  17. C#窗体设计中InitializeComponent的用法
  18. 数据结构和算法学习之路-----必要的数学知识
  19. RFID图书馆藏书防盗安全门门禁系统的应用分析
  20. hive 修改cluster by算法_疯狂Hive之DML操作(四)

热门文章

  1. 音频格式简介和PCM转换成WAV
  2. win10笔记本右键磁盘无响应,鼠标一直转圈圈,或卡死
  3. linux虚拟机按键不好用,虚拟机(vmware)linux中ctrl按键失灵 解决办法
  4. 登陆拦截页面报错:localhost 将您重定向的次数过多。 尝试清除 Cookie. ERR_TOO_MANY_REDIRECTS
  5. CentOS docker 部署 flask + uWSGI + Nginx + Supervisor错误
  6. OpenStack 归档 - 虚拟机临时存储与块存储
  7. leetCode_Patching Array
  8. 两个电阻的并联与串联
  9. 如何做擦能防止网站被劫持
  10. 加拿大计算机最好的学校排名2015年,九大院校!加拿大的计算机专业实力排名!...