不擅长 长篇大论,直接以问题作为切入点来进行源码分析。
1.Java层的入口是main(),那么Android有没有main()?里面在做什么操作?
2.Android是如何启动的,Activity的生命周期是如何调用的?
3.setContentView究竟是在干什么?
4.view的绘制流程究竟是怎样的?
5.Zygote,Binder,Launcher,各种Manager等等都是些什么玩意… 参考链接
6.面试为什么总问这些问题?即便是懂了,之后也会忘,而且对应用层开发有什么实际性的帮助?
7.热修复,组件化,插件化等热门技术都要怎么搞?
1和2的答案:
Android应用程启动入口 ActivityThread的main()方法
Looper.prepareMainLooper();//handler机制,
ActivityThread thread = new ActivityThread();//实例化ResourcesManager
thread.attach(false);//****核心源码***** 最初的初始化
Looper.loop();
attach方法()核心源码分析
ViewRootImpl,Binder,暂时不分析,从ActivityManager开始
private void attach(boolean system) {
final IActivityManager mgr = ActivityManager.getService();
try {
mgr.attachApplication(mAppThread);
} catch (RemoteException ex) {
throw ex.rethrowFromSystemServer();
}
getService()源码分析
主要是用到单例,所有的类进入都会变成单例,这种设计模式暂时不分析,只需要知道,他是通过跨进程的方式来调用。
attachApplication在这里的作用其实实际上是将ActivityThread和ApplciationThread将其关联,把activity相关信息存储在applciationThread里面,apllicationThread的类为activity的各种状态做了相对应的准备工作
public static IActivityManager getService() {
return IActivityManagerSingleton.get();
}
private static final Singleton<IActivityManager> IActivityManagerSingleton =
new Singleton<IActivityManager>() {
@Override
protected IActivityManager create() {
final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
final IActivityManager am = IActivityManager.Stub.asInterface(b);
return am;
}
};
ActivityManager(app进程)和ActivityManagerService(系统进程),通过binder机制,由系统来调用,不是自身来new Manager,而是系统来管理。实际上ActivityManager是有系统服务所调用管理,并且通过在binder接口当中进行调用,这也是可以解释为什么Activity是跨进程访问
那么为什么系统管理,而不是单独给他们配置呢??
attachApplication(ApplicationThread)源码分析
这里是一个接口,内部的Proxy中实现这个方法
public interface IActivityManager extends IInterface {
void attachApplication(IApplicationThread var1) throws RemoteException;
//内部的Proxy实现了IActivityManager
private static class Proxy implements IActivityManager
public void attachApplication(IApplicationThread app) throws RemoteException {
Parcel _data = Parcel.obtain();
Parcel _reply = Parcel.obtain();
try {
_data.writeInterfaceToken("android.app.IActivityManager");
_data.writeStrongBinder(app != null?app.asBinder():null);
this.mRemote.transact(11, _data, _reply, 0);
_reply.readException();
} finally {
_reply.recycle();
_data.recycle();
}
}
private class ApplicationThread extends IApplicationThread.Stub
ApplicationThread是继承了Stub,内部scheduleXXXActivity()函数,也就是说是在调用activity的生命周期。
以最为典型的就是scheduleLaunchActivity() 启动activity
// we use token to identify this activity without having to send the
// activity itself back to the activity manager. (matters more with ipc)
@Override
public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
int procState, Bundle state, PersistableBundle persistentState,
List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
boolean notResumed, boolean isForward, ProfilerInfo profilerInfo)
//实际上就是在这里创建的activity
ActivityClientRecord r = new ActivityClientRecord();
r.activityInfo = info;
//一大堆配置文件,省略
//H实际上就是一个handler
sendMessage(H.LAUNCH_ACTIVITY, r);
}
//这里实际上就是用handler机制传递数据,那么就可以直接开始找handleMessage,看接收数据
private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {
if (DEBUG_MESSAGES) Slog.v(
TAG, "SCHEDULE " + what + " " + mH.codeToString(what)
+ ": " + arg1 + " / " + obj);
Message msg = Message.obtain();
msg.what = what;
msg.obj = obj;
msg.arg1 = arg1;
msg.arg2 = arg2;
if (async) {
msg.setAsynchronous(true);
}
mH.sendMessage(msg);
}
//这里暂时只分析activity部分,其他省略,很明显看的出来是在调用activity的生命周期。
//我们只需要关注LAUNCH_ACTIVITY部分在做什么操作
public void handleMessage(Message msg) {
switch (msg.what) {
case LAUNCH_ACTIVITY: {
final ActivityClientRecord r = (ActivityClientRecord) msg.obj;
handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");
break;
case RELAUNCH_ACTIVITY: {
ActivityClientRecord r = (ActivityClientRecord)msg.obj;
handleRelaunchActivity(r);
break;
}
case PAUSE_ACTIVITY: {
handlePauseActivity();
}
break;
case PAUSE_ACTIVITY_FINISHING: {
handlePauseActivity();
}
break;
//略
//handleLaunchActivity源码分析
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {
//开启activity
Activity a = performLaunchActivity(r, customIntent);
handleResumeActivity(r.token, false, r.isForward,
!r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);
}
if (a != null) {
r.createdConfig = new Configuration(mConfiguration);
reportSizeConfigurations(r);
Bundle oldState = r.state;
//resume方法
handleResumeActivity(r.token, false, r.isForward,
!r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);
if (!r.activity.mFinished && r.startsNotResumed) {
//pause方法
performPauseActivityIfNeeded(r, reason);
private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
ActivityInfo aInfo = r.activityInfo;
Activity activity = null;
try {
// 反射构建了一个activity
java.lang.ClassLoader cl = appContext.getClassLoader();
activity = mInstrumentation.newActivity(
cl, component.getClassName(), r.intent);
//调用了activity的attach();
activity.attach();
//activity设置theme
activity.setTheme(theme);
if (r.isPersistable()) {
// 调用activity的onCreate()方法
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,
r.persistentState);
mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);
return activity;
}
问题1和2的总结就是:当点击APP的时候,是由系统服务通过binder来调用,
通过各种scheduXXXXXActivity()内部调用sendMessage,然后通过handler进行传递,根据不同的状态来进行调用不同的生命周期
抄一波别人的图
6的答案:组件化,插件化那些 就是模仿framework来的,热修复也是,都是模仿源码,从里面找灵感。
架构师很多的设计思想都是通过源码中来的,当年的MVP是模仿Java GUI来的,所以 研究底层,就是为了做知识储备,发酵酝酿,就等你开窍,搞出个新东西出来,造福百姓。
毕竟只会用三方库,写傻代码的猿肯定迟早会被淘汰的。获取别人的思想,当别人出现这样的业务场景时,Android底层是如何处理的
核心还是binder和handler
下一篇文章将回答问题3,4,5,之后有时间会依次整理热修复 组件化和插件化源码分析。