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类的静态接口。