android launcher全面剖析,Android Launcher全面剖析 (3)

这个函数很简单,只是调用了system_init函数来进一步执行操作。

Step

3. libsystem_server.system_init

函数system_init实现在libsystem_server库中,源代码位于frameworks/base/cmds/system_server/library/system_init.cpp文件中:

extern"C"status_t system_init()

{

LOGI("Entered system_init()");

sp proc(ProcessState::self());

sp sm = defaultServiceManager();

LOGI("ServiceManager: %p\n", sm.get());

sp grim =newGrimReaper();

sm->asBinder()->linkToDeath(grim, grim.get(), 0);

charpropBuf[PROPERTY_VALUE_MAX];

property_get("system_init.startsurfaceflinger", propBuf,"1");

if(strcmp(propBuf,"1") == 0) {

// Start the SurfaceFlinger

SurfaceFlinger::instantiate();

}

// Start the sensor service

SensorService::instantiate();

// On the simulator, audioflinger et al don't get started the

// same way as on the device, and we need to start them here

if(!proc->supportsProcesses()) {

// Start the AudioFlinger

AudioFlinger::instantiate();

// Start the media playback service

MediaPlayerService::instantiate();

// Start the camera service

CameraService::instantiate();

// Start the audio policy service

AudioPolicyService::instantiate();

}

// And now start the Android runtime. We have to do this bit

// of nastiness because the Android runtime initialization requires

// some of the core system services to already be started.

// All other servers should just start the Android runtime at

// the beginning of their processes's main(), before calling

// the init function.

LOGI("System server: starting Android runtime.\n");

AndroidRuntime* runtime = AndroidRuntime::getRuntime();

LOGI("System server: starting Android services.\n");

runtime->callStatic("com/android/server/SystemServer","init2");

// If running in our own process, just go into the thread

// pool. Otherwise, call the initialization finished

// func to let this process continue its initilization.

if(proc->supportsProcesses()) {

LOGI("System server: entering thread pool.\n");

ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();

LOGI("System server: exiting thread pool.\n");

}

returnNO_ERROR;

}

extern "C" status_t system_init()

{

LOGI("Entered system_init()");

sp proc(ProcessState::self());

sp sm = defaultServiceManager();

LOGI("ServiceManager: %p\n", sm.get());

sp grim = new GrimReaper();

sm->asBinder()->linkToDeath(grim, grim.get(), 0);

char propBuf[PROPERTY_VALUE_MAX];

property_get("system_init.startsurfaceflinger", propBuf, "1");

if (strcmp(propBuf, "1") == 0) {

// Start the SurfaceFlinger

SurfaceFlinger::instantiate();

}

// Start the sensor service

SensorService::instantiate();

// On the simulator, audioflinger et al don't get started the

// same way as on the device, and we need to start them here

if (!proc->supportsProcesses()) {

// Start the AudioFlinger

AudioFlinger::instantiate();

// Start the media playback service

MediaPlayerService::instantiate();

// Start the camera service

CameraService::instantiate();

// Start the audio policy service

AudioPolicyService::instantiate();

}

// And now start the Android runtime. We have to do this bit

// of nastiness because the Android runtime initialization requires

// some of the core system services to already be started.

// All other servers should just start the Android runtime at

// the beginning of their processes's main(), before calling

// the init function.

LOGI("System server: starting Android runtime.\n");

AndroidRuntime* runtime = AndroidRuntime::getRuntime();

LOGI("System server: starting Android services.\n");

runtime->callStatic("com/android/server/SystemServer", "init2");

// If running in our own process, just go into the thread

// pool. Otherwise, call the initialization finished

// func to let this process continue its initilization.

if (proc->supportsProcesses()) {

LOGI("System server: entering thread pool.\n");

ProcessState::self()->startThreadPool();

IPCThreadState::self()->joinThreadPool();

LOGI("System server: exiting thread pool.\n");

}

return NO_ERROR;

}

这个函数首先会初始化SurfaceFlinger、SensorService、AudioFlinger、MediaPlayerService、

CameraService和AudioPolicyService这几个服务,然后就通过系统全局唯一的AndroidRuntime实例变量

runtime的callStatic来调用SystemServer的init2函数了。关于这个AndroidRuntime实例变量runtime

的相关资料,可能参考前面一篇文章Android应用程序进程启动过程的源代码分析一文。

Step 4.

AndroidRuntime.callStatic

这个函数定义在frameworks/base/core/jni/AndroidRuntime.cpp文件中:

status_t AndroidRuntime::callStatic(constchar* className,constchar* methodName)

{

JNIEnv* env;

jclass clazz;

jmethodID methodId;

env = getJNIEnv();

if(env == NULL)

returnUNKNOWN_ERROR;

clazz = findClass(env, className);

if(clazz == NULL) {

LOGE("ERROR: could not find class '%s'\n", className);

returnUNKNOWN_ERROR;

}

methodId = env->GetStaticMethodID(clazz, methodName,"()V");

if(methodId == NULL) {

LOGE("ERROR: could not find method %s.%s\n", className, methodName);

returnUNKNOWN_ERROR;

}

env->CallStaticVoidMethod(clazz, methodId);

returnNO_ERROR;

}

status_t AndroidRuntime::callStatic(const char* className, const char* methodName)

{

JNIEnv* env;

jclass clazz;

jmethodID methodId;

env = getJNIEnv();

if (env == NULL)

return UNKNOWN_ERROR;

clazz = findClass(env, className);

if (clazz == NULL) {

LOGE("ERROR: could not find class '%s'\n", className);

return UNKNOWN_ERROR;

}

methodId = env->GetStaticMethodID(clazz, methodName, "()V");

if (methodId == NULL) {

LOGE("ERROR: could not find method %s.%s\n", className, methodName);

return UNKNOWN_ERROR;

}

env->CallStaticVoidMethod(clazz, methodId);

return NO_ERROR;

}

这个函数调用由参数className指定的java类的静态成员函数,这个静态成员函数是由参数methodName指定的。上面传进来的参数

className的值为"com/android/server/SystemServer",而参数methodName的值为"init2",因

此,接下来就会调用SystemServer类的init2函数了。

Step

5. SystemServer.init2

这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中:

publicclassSystemServer

{

......

publicstaticfinalvoidinit2() {

Slog.i(TAG,"Entered the Android system server!");

Thread thr =newServerThread();

thr.setName("android.server.ServerThread");

thr.start();

}

}

public class SystemServer

{

......

public static final void init2() {

Slog.i(TAG, "Entered the Android system server!");

Thread thr = new ServerThread();

thr.setName("android.server.ServerThread");

thr.start();

}

}

这个函数创建了一个ServerThread线程,PackageManagerService服务就是这个线程中启动的了。这里调用了ServerThread实例thr的start函数之后,下面就会执行这个实例的run函数了。

Step

6. ServerThread.run

这个函数定义在frameworks/base/services/java/com/android/server/SystemServer.java文件中:

classServerThreadextendsThread {

......

@Override

publicvoidrun() {

......

IPackageManager pm =null;

......

// Critical services...

try{

......

Slog.i(TAG,"Package Manager");

pm = PackageManagerService.main(context,

factoryTest != SystemServer.FACTORY_TEST_OFF);

......

}catch(RuntimeException e) {

Slog.e("System","Failure starting core service", e);

}

......

}

......

}

class ServerThread extends Thread {

......

@Override

public void run() {

......

IPackageManager pm = null;

......

// Critical services...

try {

......

Slog.i(TAG, "Package Manager");

pm = PackageManagerService.main(context,

factoryTest != SystemServer.FACTORY_TEST_OFF);

......

} catch (RuntimeException e) {

Slog.e("System", "Failure starting core service", e);

}

......

}

......

}

这个函数除了启动PackageManagerService服务之外,还启动了其它很多的服务,例如在前面学习Activity和Service的几篇文章中经常看到的ActivityManagerService服务,有兴趣的读者可以自己研究一下。

Step 7. ActivityManagerService.main

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:

publicfinalclassActivityManagerServiceextendsActivityManagerNative

implementsWatchdog.Monitor, BatteryStatsImpl.BatteryCallback {

......

publicstaticfinalContext main(intfactoryTest) {

AThread thr =newAThread();

thr.start();

synchronized(thr) {

while(thr.mService ==null) {

try{

thr.wait();

}catch(InterruptedException e) {

}

}

}

ActivityManagerService m = thr.mService;

mSelf = m;

ActivityThread at = ActivityThread.systemMain();

mSystemThread = at;

Context context = at.getSystemContext();

m.mContext = context;

m.mFactoryTest = factoryTest;

m.mMainStack =newActivityStack(m, context,true);

m.mBatteryStatsService.publish(context);

m.mUsageStatsService.publish(context);

synchronized(thr) {

thr.mReady =true;

thr.notifyAll();

}

m.startRunning(null,null,null,null);

returncontext;

}

......

}

public final class ActivityManagerService extends ActivityManagerNative

implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {

......

public static final Context main(int factoryTest) {

AThread thr = new AThread();

thr.start();

synchronized (thr) {

while (thr.mService == null) {

try {

thr.wait();

} catch (InterruptedException e) {

}

}

}

ActivityManagerService m = thr.mService;

mSelf = m;

ActivityThread at = ActivityThread.systemMain();

mSystemThread = at;

Context context = at.getSystemContext();

m.mContext = context;

m.mFactoryTest = factoryTest;

m.mMainStack = new ActivityStack(m, context, true);

m.mBatteryStatsService.publish(context);

m.mUsageStatsService.publish(context);

synchronized (thr) {

thr.mReady = true;

thr.notifyAll();

}

m.startRunning(null, null, null, null);

return context;

}

......

}

这个函数首先通过AThread线程对象来内部创建了一个ActivityManagerService实例,然后将这个实例保存其成员变量

mService中,接着又把这个ActivityManagerService实例保存在ActivityManagerService类的静态成员变

量mSelf中,最后初始化其它成员变量,就结束了。

Step

8. PackageManagerService.main

这个函数定义在frameworks/base/services/java/com/android/server/PackageManagerService.java文件中:

classPackageManagerService extends IPackageManager.Stub {

......

publicstaticfinal IPackageManager main(Context context, boolean factoryTest) {

PackageManagerService m = newPackageManagerService(context, factoryTest);

ServiceManager.addService("package", m);

returnm;

}

......

}

class PackageManagerService extends IPackageManager.Stub {

......

public static final IPackageManager main(Context context, boolean factoryTest) {

PackageManagerService m = new PackageManagerService(context, factoryTest);

ServiceManager.addService("package", m);

return m;

}

......

}

这个函数创建了一个PackageManagerService服务实例,然后把这个服务添加到ServiceManager中

去,ServiceManager是Android系统Binder进程间通信机制的守护进程,负责管理系统中的Binder对象,在创建这个

PackageManagerService服务实例时,会在PackageManagerService类的构造函数中开始执行安装应用程序的过程:

classPackageManagerServiceextendsIPackageManager.Stub {

......

publicPackageManagerService(Context context,booleanfactoryTest) {

......

synchronized(mInstallLock) {

synchronized(mPackages) {

......

File dataDir = Environment.getDataDirectory();

mAppDataDir = newFile(dataDir,"data");

mSecureAppDataDir = newFile(dataDir,"secure/data");

mDrmAppPrivateInstallDir= newFile(dataDir,"app-private");

......

mFrameworkDir = newFile(Environment.getRootDirectory(),"framework");

mDalvikCacheDir = newFile(dataDir,"dalvik-cache");

......

// Find base frameworks (resource packages without code).

mFrameworkInstallObserver = newAppDirObserver(

mFrameworkDir.getPath(), OBSERVER_EVENTS, true);

mFrameworkInstallObserver.startWatching();

scanDirLI(mFrameworkDir, PackageParser.PARSE_IS_SYSTEM

| PackageParser.PARSE_IS_SYSTEM_DIR,

scanMode | SCAN_NO_DEX, 0);

// Collect all system packages.

mSystemAppDir = newFile(Environment.getRootDirectory(),"app");

mSystemInstallObserver = newAppDirObserver(

mSystemAppDir.getPath(), OBSERVER_EVENTS, true);

mSystemInstallObserver.startWatching();

scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM

| PackageParser.PARSE_IS_SYSTEM_DIR, scanMode, 0);

// Collect all vendor packages.

mVendorAppDir = newFile("/vendor/app");

mVendorInstallObserver = newAppDirObserver(

mVendorAppDir.getPath(), OBSERVER_EVENTS, true);

mVendorInstallObserver.startWatching();

scanDirLI(mVendorAppDir, PackageParser.PARSE_IS_SYSTEM

| PackageParser.PARSE_IS_SYSTEM_DIR, scanMode, 0);

mAppInstallObserver = newAppDirObserver(

mAppInstallDir.getPath(), OBSERVER_EVENTS, false);

mAppInstallObserver.startWatching();

scanDirLI(mAppInstallDir, 0, scanMode,0);

mDrmAppInstallObserver = newAppDirObserver(

mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS, false);

mDrmAppInstallObserver.startWatching();

scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK,

scanMode, 0);

......

}

}

}

......

}

class PackageManagerService extends IPackageManager.Stub {

......

public PackageManagerService(Context context, boolean factoryTest) {

......

synchronized (mInstallLock) {

synchronized (mPackages) {

......

File dataDir = Environment.getDataDirectory();

mAppDataDir = new File(dataDir, "data");

mSecureAppDataDir = new File(dataDir, "secure/data");

mDrmAppPrivateInstallDir= new File(dataDir, "app-private");

......

mFrameworkDir = new File(Environment.getRootDirectory(), "framework");

mDalvikCacheDir = new File(dataDir, "dalvik-cache");

......

// Find base frameworks (resource packages without code).

mFrameworkInstallObserver = new AppDirObserver(

mFrameworkDir.getPath(), OBSERVER_EVENTS, true);

mFrameworkInstallObserver.startWatching();

scanDirLI(mFrameworkDir, PackageParser.PARSE_IS_SYSTEM

| PackageParser.PARSE_IS_SYSTEM_DIR,

scanMode | SCAN_NO_DEX, 0);

// Collect all system packages.

mSystemAppDir = new File(Environment.getRootDirectory(), "app");

mSystemInstallObserver = new AppDirObserver(

mSystemAppDir.getPath(), OBSERVER_EVENTS, true);

mSystemInstallObserver.startWatching();

scanDirLI(mSystemAppDir, PackageParser.PARSE_IS_SYSTEM

| PackageParser.PARSE_IS_SYSTEM_DIR, scanMode, 0);

// Collect all vendor packages.

mVendorAppDir = new File("/vendor/app");

mVendorInstallObserver = new AppDirObserver(

mVendorAppDir.getPath(), OBSERVER_EVENTS, true);

mVendorInstallObserver.startWatching();

scanDirLI(mVendorAppDir, PackageParser.PARSE_IS_SYSTEM

| PackageParser.PARSE_IS_SYSTEM_DIR, scanMode, 0);

mAppInstallObserver = new AppDirObserver(

mAppInstallDir.getPath(), OBSERVER_EVENTS, false);

mAppInstallObserver.startWatching();

scanDirLI(mAppInstallDir, 0, scanMode, 0);

mDrmAppInstallObserver = new AppDirObserver(

mDrmAppPrivateInstallDir.getPath(), OBSERVER_EVENTS, false);

mDrmAppInstallObserver.startWatching();

scanDirLI(mDrmAppPrivateInstallDir, PackageParser.PARSE_FORWARD_LOCK,

scanMode, 0);

......

}

}

}

......

}

这里会调用scanDirLI函数来扫描移动设备上的下面这五个目录中的Apk文件:

/system/framework

/system/app

/vendor/app

/data/app

/data/app-private

Step

9. ActivityManagerService.setSystemProcess

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:

publicfinalclassActivityManagerServiceextendsActivityManagerNative

implementsWatchdog.Monitor, BatteryStatsImpl.BatteryCallback {

......

publicstaticvoidsetSystemProcess() {

try{

ActivityManagerService m = mSelf;

ServiceManager.addService("activity", m);

ServiceManager.addService("meminfo",newMemBinder(m));

if(MONITOR_CPU_USAGE) {

ServiceManager.addService("cpuinfo",newCpuBinder(m));

}

ServiceManager.addService("permission",newPermissionController(m));

ApplicationInfo info =

mSelf.mContext.getPackageManager().getApplicationInfo(

"android", STOCK_PM_FLAGS);

mSystemThread.installSystemApplicationInfo(info);

synchronized(mSelf) {

ProcessRecord app = mSelf.newProcessRecordLocked(

mSystemThread.getApplicationThread(), info,

info.processName);

app.persistent = true;

app.pid = MY_PID;

app.maxAdj = SYSTEM_ADJ;

mSelf.mProcessNames.put(app.processName, app.info.uid, app);

synchronized(mSelf.mPidsSelfLocked) {

mSelf.mPidsSelfLocked.put(app.pid, app);

}

mSelf.updateLruProcessLocked(app, true,true);

}

} catch(PackageManager.NameNotFoundException e) {

thrownewRuntimeException(

"Unable to find android system package", e);

}

}

......

}

public final class ActivityManagerService extends ActivityManagerNative

implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {

......

public static void setSystemProcess() {

try {

ActivityManagerService m = mSelf;

ServiceManager.addService("activity", m);

ServiceManager.addService("meminfo", new MemBinder(m));

if (MONITOR_CPU_USAGE) {

ServiceManager.addService("cpuinfo", new CpuBinder(m));

}

ServiceManager.addService("permission", new PermissionController(m));

ApplicationInfo info =

mSelf.mContext.getPackageManager().getApplicationInfo(

"android", STOCK_PM_FLAGS);

mSystemThread.installSystemApplicationInfo(info);

synchronized (mSelf) {

ProcessRecord app = mSelf.newProcessRecordLocked(

mSystemThread.getApplicationThread(), info,

info.processName);

app.persistent = true;

app.pid = MY_PID;

app.maxAdj = SYSTEM_ADJ;

mSelf.mProcessNames.put(app.processName, app.info.uid, app);

synchronized (mSelf.mPidsSelfLocked) {

mSelf.mPidsSelfLocked.put(app.pid, app);

}

mSelf.updateLruProcessLocked(app, true, true);

}

} catch (PackageManager.NameNotFoundException e) {

throw new RuntimeException(

"Unable to find android system package", e);

}

}

......

}

这个函数首先是将这个ActivityManagerService实例添加到ServiceManager中去托管,这样其它地方就可以通过

ServiceManager.getService接口来访问这个全局唯一的ActivityManagerService实例了,接着又通过调用

mSystemThread.installSystemApplicationInfo函数来把应用程序框架层下面的android包加载进来

,这里的mSystemThread是一个ActivityThread类型的实例变量,它是在上面的Step

7中创建的,后面就是一些其它的初始化工作了。

Step 10.

ActivityManagerService.systemReady

这个函数是在上面的Step

6中的ServerThread.run函数在将系统中的一系列服务都初始化完毕之后才调用的,它定义在frameworks/base

/services/java/com/android/server/am/ActivityManagerServcie.java文件中:

publicfinalclassActivityManagerServiceextendsActivityManagerNative

implementsWatchdog.Monitor, BatteryStatsImpl.BatteryCallback {

......

publicvoidsystemReady(finalRunnable goingCallback) {

......

synchronized(this) {

......

mMainStack.resumeTopActivityLocked(null);

}

}

......

}

public final class ActivityManagerService extends ActivityManagerNative

implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {

......

public void systemReady(final Runnable goingCallback) {

......

synchronized (this) {

......

mMainStack.resumeTopActivityLocked(null);

}

}

......

}

这个函数的内容比较多,这里省去无关的部分,主要关心启动Home应用程序的逻辑,这里就是通过

mMainStack.resumeTopActivityLocked函数来启动Home应用程序的了,这里的mMainStack是一个

ActivityStack类型的实例变量。

Step 11.

ActivityStack.resumeTopActivityLocked

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中:

publicclassActivityStack {

......

finalbooleanresumeTopActivityLocked(ActivityRecord prev) {

// Find the first activity that is not finishing.

ActivityRecord next = topRunningActivityLocked(null);

......

if(next ==null) {

// There are no more activities! Let's just start up the

// Launcher...

if(mMainStack) {

returnmService.startHomeActivityLocked();

}

}

......

}

......

}

public class ActivityStack {

......

final boolean resumeTopActivityLocked(ActivityRecord prev) {

// Find the first activity that is not finishing.

ActivityRecord next = topRunningActivityLocked(null);

......

if (next == null) {

// There are no more activities! Let's just start up the

// Launcher...

if (mMainStack) {

return mService.startHomeActivityLocked();

}

}

......

}

......

}

这里调用函数topRunningActivityLocked返回的是当前系统Activity堆栈最顶端的Activity,由于此时还没有

Activity被启动过,因此,返回值为null,即next变量的值为null,于是就调用

mService.startHomeActivityLocked语句,这里的mService就是前面在Step

7中创建的ActivityManagerService实例了。

Step

12. ActivityManagerService.startHomeActivityLocked

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityManagerServcie.java文件中:

publicfinalclassActivityManagerServiceextendsActivityManagerNative

implementsWatchdog.Monitor, BatteryStatsImpl.BatteryCallback {

......

booleanstartHomeActivityLocked() {

......

Intent intent = newIntent(

mTopAction,

mTopData != null? Uri.parse(mTopData) :null);

intent.setComponent(mTopComponent);

if(mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {

intent.addCategory(Intent.CATEGORY_HOME);

}

ActivityInfo aInfo =

intent.resolveActivityInfo(mContext.getPackageManager(),

STOCK_PM_FLAGS);

if(aInfo !=null) {

intent.setComponent(newComponentName(

aInfo.applicationInfo.packageName, aInfo.name));

// Don't do this if the home app is currently being

// instrumented.

ProcessRecord app = getProcessRecordLocked(aInfo.processName,

aInfo.applicationInfo.uid);

if(app ==null|| app.instrumentationClass ==null) {

intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);

mMainStack.startActivityLocked(null, intent,null,null,0, aInfo,

null,null,0,0,0,false,false);

}

}

returntrue;

}

......

}

public final class ActivityManagerService extends ActivityManagerNative

implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {

......

boolean startHomeActivityLocked() {

......

Intent intent = new Intent(

mTopAction,

mTopData != null ? Uri.parse(mTopData) : null);

intent.setComponent(mTopComponent);

if (mFactoryTest != SystemServer.FACTORY_TEST_LOW_LEVEL) {

intent.addCategory(Intent.CATEGORY_HOME);

}

ActivityInfo aInfo =

intent.resolveActivityInfo(mContext.getPackageManager(),

STOCK_PM_FLAGS);

if (aInfo != null) {

intent.setComponent(new ComponentName(

aInfo.applicationInfo.packageName, aInfo.name));

// Don't do this if the home app is currently being

// instrumented.

ProcessRecord app = getProcessRecordLocked(aInfo.processName,

aInfo.applicationInfo.uid);

if (app == null || app.instrumentationClass == null) {

intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK);

mMainStack.startActivityLocked(null, intent, null, null, 0, aInfo,

null, null, 0, 0, 0, false, false);

}

}

return true;

}

......

}

函数首先创建一个CATEGORY_HOME类型的Intent,然后通过Intent.resolveActivityInfo函数向

PackageManagerService查询Category类型为HOME的Activity,这里我们假设只有系统自带的Launcher应用程

序注册了HOME类型的Activity(见packages/apps/Launcher2/AndroidManifest.xml文件):

xmlns:android="http://schemas.android.com/apk/res/android"

package="com.android.launcher"

android:sharedUserId="@string/sharedUserId"

>

......

android:name="com.android.launcher2.LauncherApplication"

android:process="@string/process"

android:label="@string/application_name"

android:icon="@drawable/ic_launcher_home">

android:name="com.android.launcher2.Launcher"

android:launchMode="singleTask"

android:clearTaskOnLaunch="true"

android:stateNotNeeded="true"

android:theme="@style/Theme"

android:screenOrientation="nosensor"

android:windowSoftInputMode="stateUnspecified|adjustPan">

......

xmlns:android="http://schemas.android.com/apk/res/android"

package="com.android.launcher"

android:sharedUserId="@string/sharedUserId"

>

......

android:name="com.android.launcher2.LauncherApplication"

android:process="@string/process"

android:label="@string/application_name"

android:icon="@drawable/ic_launcher_home">

android:name="com.android.launcher2.Launcher"

android:launchMode="singleTask"

android:clearTaskOnLaunch="true"

android:stateNotNeeded="true"

android:theme="@style/Theme"

android:screenOrientation="nosensor"

android:windowSoftInputMode="stateUnspecified|adjustPan">

......

因此,这里就返回com.android.launcher2.Launcher这个Activity了。由于是第一次启动这个Activity,接下

来调用函数getProcessRecordLocked返回来的ProcessRecord值为null,于是,就调用

mMainStack.startActivityLocked函数启动com.android.launcher2.Launcher这个

Activity了,这里的mMainStack是一个ActivityStack类型的成员变量。

Step 13.

ActivityStack.startActivityLocked

这个函数定义在frameworks/base/services/java/com/android/server/am/ActivityStack.java文件中

Step 14. Launcher.onCreate

这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/Launcher.java文件中:

publicfinalclassLauncherextendsActivity

implementsView.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, AllAppsView.Watcher {

......

@Override

protectedvoidonCreate(Bundle savedInstanceState) {

......

if(!mRestoring) {

mModel.startLoader(this,true);

}

......

}

......

}

public final class Launcher extends Activity

implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks, AllAppsView.Watcher {

......

@Override

protected void onCreate(Bundle savedInstanceState) {

......

if (!mRestoring) {

mModel.startLoader(this, true);

}

......

}

......

}

这里的mModel是一个LauncherModel类型的成员变量,这里通过调用它的startLoader成员函数来执行加应用程序的操作。

Step

15. LauncherModel.startLoader

这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:

publicclassLauncherModelextendsBroadcastReceiver {

......

publicvoidstartLoader(Context context,booleanisLaunching) {

......

synchronized(mLock) {

......

// Don't bother to start the thread if we know it's not going to do anything

if(mCallbacks !=null&& mCallbacks.get() !=null) {

// If there is already one running, tell it to stop.

LoaderTask oldTask = mLoaderTask;

if(oldTask !=null) {

if(oldTask.isLaunching()) {

// don't downgrade isLaunching if we're already running

isLaunching = true;

}

oldTask.stopLocked();

}

mLoaderTask = newLoaderTask(context, isLaunching);

sWorker.post(mLoaderTask);

}

}

}

......

}

public class LauncherModel extends BroadcastReceiver {

......

public void startLoader(Context context, boolean isLaunching) {

......

synchronized (mLock) {

......

// Don't bother to start the thread if we know it's not going to do anything

if (mCallbacks != null && mCallbacks.get() != null) {

// If there is already one running, tell it to stop.

LoaderTask oldTask = mLoaderTask;

if (oldTask != null) {

if (oldTask.isLaunching()) {

// don't downgrade isLaunching if we're already running

isLaunching = true;

}

oldTask.stopLocked();

}

mLoaderTask = new LoaderTask(context, isLaunching);

sWorker.post(mLoaderTask);

}

}

}

......

}

这里不是直接加载应用程序,而是把加载应用程序的操作作为一个消息来处理。这里的sWorker是一个Handler,通过它的post方式把一个消息

放在消息队列中去,然后系统就会调用传进去的参数mLoaderTask的run函数来处理这个消息,这个mLoaderTask是LoaderTask

类型的实例,于是,下面就会执行LoaderTask类的run函数了。

Step 16. LoaderTask.run

这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:

publicclassLauncherModelextendsBroadcastReceiver {

......

privateclassLoaderTaskimplementsRunnable {

......

publicvoidrun() {

......

keep_running: {

......

// second step

if(loadWorkspaceFirst) {

......

loadAndBindAllApps();

} else{

......

}

......

}

......

}

......

}

......

}

public class LauncherModel extends BroadcastReceiver {

......

private class LoaderTask implements Runnable {

......

public void run() {

......

keep_running: {

......

// second step

if (loadWorkspaceFirst) {

......

loadAndBindAllApps();

} else {

......

}

......

}

......

}

......

}

......

}

这里调用loadAndBindAllApps成员函数来进一步操作。

Step

17. LoaderTask.loadAndBindAllApps

这个函数定义在packages/apps/Launcher2/src/com/android/launcher2/LauncherModel.java文件中:

publicclassLauncherModelextendsBroadcastReceiver {

......

privateclassLoaderTaskimplementsRunnable {

......

privatevoidloadAndBindAllApps() {

......

if(!mAllAppsLoaded) {

loadAllAppsByBatch();

if(mStopped) {

return;

}

mAllAppsLoaded = true;

} else{

onlyBindAllApps();

}

}

......

}

......

}

public class LauncherModel extends BroadcastReceiver {

......

private class LoaderTask implements Runnable {

......

private void loadAndBindAllApps() {

......

if (!mAllAppsLoaded) {

loadAllAppsByBatch();

if (mStopped) {

return;

}

mAllAppsLoaded = true;

} else {

onlyBindAllApps();

}

}

......

}

......

}

由于还没有加载过应用程序,这里的mAllAppsLoaded为false,于是就继续调用loadAllAppsByBatch函数来进一步操作了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值