android_内核剖析总结




  android内核剖析总结:
  按Back键与程序中主动调用fininsh一样:在android.app包Activity类,public void onBackPressed(){ *** } 内部调用了finish函数。
  操作系统在调用我们,而不是我们在调用操作系统。
  Apk的入口类为ActivityThread,Activity类仅仅是被回调的类。
  新应用进程从ActivityThread.java的main()开始执行的。它是一个线程。ActivityThread会创建一个ViewRoot.W对象,同时创建一个ApplicationThread对象。
  ApplicationThread(Binder对象),负责远程接收Ams的IPC调用eg,start/pause/stop。  ViewRoot.W对象负责接收Wms的IPC调用,KeyQ类为WmS的内部类。
    ViewRootImpl.java的内部类W,static class W extends IWindow.Stub{ *** }    Original file: frameworks/base/core/java/android/view/IWindow.aidl;
  ActivityThread和ApplicationThread,主线程中会构造这两个类的对象。但是他们不是线程,你看看继承关系就可以知道ApplicationThread是binder, ActivityThread是一个final类也不是真正的线程。
  ActivityThread类:该类为应用程序的主线程类,所有的APK程序都有且仅有一个ActivityThread类,程序的入口为该类中的static main()函数。
  service的代码都是在主线程中执行的吗?不是,onBind/onServiceConnected是在主线程中执行的但是onTransact是在binder thread中执行的,你暴露出的接口调用都是在onTransact中调用的,所以他们都是在binder thread中执行的。
  在ActivityThread的初始化代码中会创建一个H(Handler)对象和一个ApplicationThread(Binder)对象。其中Binder负责接收远程AmS的IPC调用,接收到调用后,则通过Handler把消息发送到消息队列,UI主线程会异步地从消息队列中取出消息并执行相应操作,比如start、stop、pause等。
  对于linux而言,Java进程只是一个普通的进程,它与一个只有一行代码的HelloWorld可执行程序无本质区别。
    dalvikvm,创建一个虚拟机,并执行参数中指定的java类。eg.直接弄一个helloWorld的java类,编译成dalvik能够识别的,$adb shell dalvikvm -cm /data/app/foo.jar Foo
    dvz,从zygote进程中孵化出一个新进程。
  app_process本质是使用dalvik启动Zygoteinit.java,并加载Framework类和资源。
  手机上的进程数:2+x;  SurfaceFlinger+SystemService+应用程序。
  App的线程个数至少有三个:ActivityThread+ViewRoot.W对象+ApplicationThread对象。
  App的Context个数:Service个数+Activity个数+1;
  com.android.server.wm包,public class WindowManagerService extends IWindowManager.Stub implements Watchdog.Monitor, WindowManagerPolicy.WindowManagerFuncs,DisplayManagerService.WindowManagerFuncs, DisplayManager.DisplayListener{ *** }
  com.android.server.am包, public final class ActivityManagerService  extends ActivityManagerNative implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback{ *** }
  Dalvik虚拟机执行的第一个Java类是ZygoteInit.java,ZygoteInit.java类main开始执行。Zygote进程是所有APK应用进程的父进程。核酸为framework.jar,
  dalvik.system包,public class Zygote{ *** }
  com.android.internal.os包,public class ZygoteInit{ *** }
    public class RuntimeInit{  *** }
  SystemServer是zygote孵化出的第一个进程。在main函数中调用satartSystemServer()开始的。不是使用标准的forkAndSpecilize()函数。
  com.android.server包,SystemServer内部类class ServerThread extends Thread{ *** };  在ServerThread的run函数中,启动了各种服务线程,eg,WmS/AmS/PmS。
    调用context=ActivityManagerService.main(*)方法启动ActivityManagerService;内部启动线程,static class AThread extends Thread{ *** };
    调用pm=PackageManagerService.main(*)方法启动PackageManagerService。
  android.app包,public class Instrumentation{ *** }
  AmS启动新进程:final ProcessRecord startProcessLocked(三个参数){ *** };内部调用Process.start(*)方法,它内部将会从zygote进程中fork出一个新的应用进程。并且,新进程从ActivtiyThread类的main方法开始执行。
  android.app包下,LoadedApk类,makeApplicaiton创建应用Application对象;内部使用app=mActivityThread.mInstrumentation.newApplication(*);
  Provider的注册是在ActivityThread.java的handleBindApplication(*)中,在构造Application对象后;Provider的注册先于Activity运行。
  Provider需要AmS的参与,BroadcastReceiver需要AmS派发,Activity/Service不要AmS的参与。
  进程间数据传递:SharePreference/File/BroadcastReceiver/ContentProvider;Activity数据传递Intent/DataBase;
  frameworks/native/services/surfaceflinger下,SurfaceFlinger.cpp;
  衍生自RefBase类别的,都会用sp来取得对象指针.
  Android4.1中一个很大的改进是UI动画显得更平滑流畅。其中的关键技术就是vsync timing和triple buffer。
  截屏一般有三种方法:1.通过View的Cache; 2.ddmslib截屏,android的内置库,pc截屏使用的这种方式; 3.frameBuffer截屏,只有root设备使用.
  linux的/dev目录,各种各样的设备;这里不是放的外部设备的驱动程序,它实际上是一个访问这些外部设备的端口;linux沿袭Unix的风格,将所有的设备认成是一个文件.设备文件分为块设备文件b和字符设备文件c.
  android的framebuffer截屏是都去下的/dev/graphics/fb0信息.  
  CTS兼容性测试:UnitTests,FunctionalTests,RreferenceApplicaitonTests;  将来:RobustnessTests,PerformanceTests.  
  只有通过Cts测试,才能获得Android的商标和享受Android Market的权限。
  /libcore/luni/src/main/java/java/lang/路径,java.lang包下,public final class System{ *** }//静态方法,本身不能被实例化. //提供系统相关的信息和资源(包含标准输入输出).
  recovery模式,能够备份rom.
  自定义可托拽View控件:继承ViewGroup;Scroller计算位置;VelocityTracker计算手势滑动速度.
  root用户登陆unbutu电脑:设置root用户密码,sudo passwd root;修改文件,sudo gedit /etc/lightdm/lightdm.conf,末尾添加greeter-show-manual-login=true
  mount文件为img时,提示"文件系统类型",因为你的img镜像中有mbr,也就是有引导信息,以致于系统无法识别。
  android.os包下,public final class Looper{ *** };//Looper的构造函数是私有的. //成员变量static final ThreadLocal<Looper> sThreadLocal = new ThreadLocal<Looper>();
    静态方法Looper.prepareMainLooper();//Looper类内部有静态变量sMainLooper,确保只被调用一次.  
  java.lang包下,ThreadLocal,  //Implements a thread-local storage, that is, a variable for which each thread has its own value.
    每一个Thread内部,都有一个变量ThreadLocal.Values localValues;//一个线程可以拥有多个ThreadLoca类型变量.//但Looper只能有一个,由消息循环只能有一个决定.
  socket编程: Socket mSocket=mServerSocket.accept();//监听;
  java.util包下,public interface Map<K,V>{ *** } //A Map is a data structure consisting of a set of keys and values in which each key is mapped to a single value.
    mMap.containsValue(*); //Returns whether this mMap contains the specified value.
  canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
  Miracast是Wi-FiAlliance(WiFi联盟)于2012年9月19日宣布启动的Wi-Fi CERTIFIED Miracast™认证项目;4.2开始支持,SurfaceFlinger增加DisplayDevice的抽象层;Framework增加DisplayManagerService的服务;




  android动作注入:
  final IWindowManager windowManager = IWindowManager.Stub.asInterface(ServiceManager.getService("window")); //1.6以后是隐藏Api;
  windowManager.injectKeyEvent(*); //4.0以后无此函数;
  adbShell动作注入源码在frameworks/base/cmds/input/src/com/android/commands/input/Input.java;

  Thread:
  public class Thread implements Runnable{ *** }
     public static interface UncaughtExceptionHandler{ *** } //Thread类的静态接口。



发布了8 篇原创文章 · 获赞 7 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/liu31187/article/details/28859853