作者:Android帥次
前言
作為多年的 Android 開發(fā),寫了不少應(yīng)用,但是一個(gè)App到底是怎么啟動(dòng)起來的?你要說桌面點(diǎn)一下就啟動(dòng)了,那也對(duì)。但是它的啟動(dòng)過程呢?帶著這樣的疑問,咱們來一步步學(xué)習(xí)。
Android 啟動(dòng)過程
一般在任何平臺(tái)上,都會(huì)逐步加載和執(zhí)行以下組件:
- Boot loader
- U-boot (optional)
- Kernel
- Android
Android進(jìn)程有以下順序:
- Init
- Zygote
- System Server
- Service Manager
- Other Daemons and processes
- Applications
具體情況如下圖,這兩幅圖結(jié)合起來比較有意思:
Boot ROM:當(dāng)電源按下時(shí),引導(dǎo)芯片代碼會(huì)從預(yù)定義的地方(固化在ROM)開始執(zhí)行,加載引導(dǎo)程序BootLoader到RAM,然后執(zhí)行。(這一步由"芯片廠商"負(fù)責(zé)設(shè)計(jì)和實(shí)現(xiàn))
Boot loader:Bootloader開始執(zhí)行,首先負(fù)責(zé)完成硬件的初始化,引導(dǎo)操作系統(tǒng)啟動(dòng)。(這一步由"設(shè)備廠商"負(fù)責(zé)設(shè)計(jì)和實(shí)現(xiàn))
Kernel:Linux 內(nèi)核是 Android 的核心,負(fù)責(zé)進(jìn)程創(chuàng)建、進(jìn)程間通信、設(shè)備驅(qū)動(dòng)程序、文件系統(tǒng)管理等。 Android 在主流內(nèi)核上應(yīng)用自定義補(bǔ)丁來支持 Android 運(yùn)行所需的某些功能,如喚醒鎖等。內(nèi)核可以作為未壓縮圖像或壓縮圖像加載。在加載時(shí),它掛載根文件系統(tǒng)(通常作為內(nèi)核命令行參數(shù)傳遞)并啟動(dòng)用戶空間中的第一個(gè)應(yīng)用程序。(這一步則是Android內(nèi)核開發(fā)過程中需要涉及的地方)
Android:Android系統(tǒng)以及各大Linux的發(fā)行版,他們的Linux內(nèi)核部分啟動(dòng)過程都是差不多的,他們之間最大的區(qū)別就在于init程序的不同,因?yàn)閕nit程序決定了系統(tǒng)在啟動(dòng)過程中,究竟會(huì)啟動(dòng)哪些守護(hù)進(jìn)程和服務(wù),以及呈現(xiàn)出怎樣的一個(gè)用戶UI界面。
因此,init程序是分析Android啟動(dòng)過程中最核心的程序。
init 和 init.rc:?jiǎn)?dòng)內(nèi)核時(shí)執(zhí)行的第一個(gè)用戶空間應(yīng)用程序是位于根文件夾中的 init 可執(zhí)行文件。該進(jìn)程解析稱為"init.rc"腳本的啟動(dòng)腳本。這是用一種專為 android 設(shè)計(jì)的語(yǔ)言編寫的,用于啟動(dòng)所有必要的進(jìn)程、守護(hù)程序和服務(wù),以便 android 正常運(yùn)行。它提供了各種類型的執(zhí)行時(shí)間,例如 early-init、on-boot、on-post-fs 等。(用戶空間的鼻祖)
Demons and Services:init 進(jìn)程創(chuàng)建了各種守護(hù)進(jìn)程和進(jìn)程,如 rild、vold、mediaserver、adb 等,每個(gè)進(jìn)程負(fù)責(zé)自己的功能。這些進(jìn)程的描述不在本文的范圍內(nèi)。相反,我們將更多地討論"Zygote"進(jìn)程。
Service Manager:Service Manager進(jìn)程 管理系統(tǒng)中運(yùn)行的所有Service。創(chuàng)建的每個(gè)服務(wù)都會(huì)在此進(jìn)程中注冊(cè)自己,并且此信息供其他進(jìn)程/應(yīng)用程序?qū)韰⒖肌?/p>
Zygote:Zygote 是啟動(dòng)時(shí)創(chuàng)建的第一個(gè) init 進(jìn)程之一。術(shù)語(yǔ)"合子"是基于生物學(xué)"形成的初始細(xì)胞分裂產(chǎn)生后代"。類似地,"zygote in android"初始化 Dalivik VM(ART) 和 fork 以創(chuàng)建多個(gè)實(shí)例來支持每個(gè) android 進(jìn)程。它有助于在 VM 實(shí)例之間使用共享代碼,從而減少內(nèi)存占用和加載時(shí)間,非常適合嵌入式系統(tǒng)。Zygote 除了在服務(wù)器套接字上安裝偵聽器外,還預(yù)加載了稍后在 Android 應(yīng)用程序中使用的類和資源。完成后,系統(tǒng)服務(wù)器啟動(dòng)。
System Server:SystemServer 進(jìn)程啟動(dòng) Android 中可用的所有服務(wù)。
本文咱們重點(diǎn)從 init 開始到應(yīng)用啟動(dòng)。
1、Zygote是什么
在Android系統(tǒng)里面,zygote是一個(gè)進(jìn)程的名字。Android是基于Linux System的,當(dāng)你的手機(jī)開機(jī)的時(shí)候,Linux的內(nèi)核加載完成之后就會(huì)啟動(dòng)一個(gè)叫"init"的進(jìn)程。在Linux System里面,所有的進(jìn)程都是由init進(jìn)程fork出來的,我們的zygote進(jìn)程也不例外。
Zygote是一個(gè)虛擬機(jī)進(jìn)程,同時(shí)也是一個(gè)虛擬機(jī)實(shí)例的孵化器,每當(dāng)系統(tǒng)要求執(zhí)行一個(gè)Android應(yīng)用程序,Zygote就會(huì)fork(分裂)出一個(gè)子進(jìn)程來執(zhí)行該應(yīng)用程序。
1.1 app_main.cpp
frameworks/base/cmds/app_process/app_main.cpp
在Zygote啟動(dòng)后就會(huì)執(zhí)行 app_main.cpp。不管是C/c++/java,他們的入口就是 main(),就跟看到 Activity 咱們直接找 onCreate() 方法一樣。
1.1.1 main()
int main(int argc, char* const argv[])
{
...
//注釋1:初始化AppRuntime(AndroidRunTime)
AppRuntime runtime(argv[0], computeArgBlockSize(argc, argv));
...
// Parse runtime arguments. Stop at first unrecognized option.
bool zygote = false;
bool startSystemServer = false;
bool application = false;
String8 niceName;
String8 className;
++i; // Skip unused "parent dir" argument.
while (i < argc) {
const char* arg = argv[i++];
//注釋2:設(shè)置zygote模式
if (strcmp(arg, "--zygote") == 0) {
zygote = true;
niceName = ZYGOTE_NICE_NAME;
}
...
}
Vector<String8> args;
if (!className.isEmpty()) {
...
} else {
// 我們處于 zygote 模式。
maybeCreateDalvikCache();
// 注釋3:在 zygote 模式下,將參數(shù)傳遞給 ZygoteInit.main() 方法。
if (startSystemServer) {
args.add(String8("start-system-server"));
}
//PROP_VALUE_MAX = 92;
char prop[PROP_VALUE_MAX];
...
String8 abiFlag("--abi-list=");
abiFlag.append(prop);
args.add(abiFlag);
for (; i < argc; ++i) {
args.add(String8(argv[i]));
}
}
if (zygote) {
//注釋4:調(diào)用 AndroidRuntime.start() 方法
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);
} else if (className) {
...
} else {
...
}
}
注釋1:初始化 AppRuntime ,其實(shí)就是 AndroidRuntime(ART)。
注釋2:設(shè)置zygote模式。
注釋3:將參數(shù)傳遞給 ZygoteInit.main() 方法。
注釋4:?jiǎn)?dòng) ZygoteInit 。這里的 ZygoteInit 就是 zygote 進(jìn)程的啟動(dòng)類。這個(gè)下面講到。咱們先看看AndroidRuntime 的 start() 方法。
1.2 AndroidRuntime.cpp
frameworks/base/core/jni/AndroidRuntime.cpp
Android 虛擬機(jī)
1.2.1 start()
/*
* Start the Android runtime. This involves starting the virtual machine and calling the "static void main(String[] args)" method in the class named by "className".
*
* Passes the main function two arguments, the class name and the specified
* options string.
*/
void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote)
{
...
JniInvocation jni_invocation;
jni_invocation.Init(NULL);
JNIEnv* env;
//注釋1:啟動(dòng)虛擬機(jī)
if (startVm(&mJavaVM, &env, zygote, primary_zygote) != 0) {
return;
}
onVmCreated(env);
//注釋2:注冊(cè)安卓功能(JNI)
if (startReg(env) < 0) {
ALOGE("Unable to register all android natives\n");
return;
}
...
strArray = env->NewObjectArray(options.size() + 1, stringClass, NULL);
...
/*
* 啟動(dòng)虛擬機(jī)。 該線程成為VM的主線程,直到VM退出才會(huì)返回。
*/
char* slashClassName = toSlashClassName(className != NULL ? className : "");
jclass startClass = env->FindClass(slashClassName);
if (startClass == NULL) {
...
} else {
...
jmethodID startMeth = env->GetStaticMethodID(startClass, "main",
"([Ljava/lang/String;)V");
if (startMeth == NULL) {
...
} else {
//注釋3
env->CallStaticVoidMethod(startClass, startMeth, strArray);
if (env->ExceptionCheck())
threadExitUncaughtException(env);
}
}
...
}
注釋1:?jiǎn)?dòng)VM(虛擬機(jī))
注釋2:注冊(cè)安卓功能(JNI)
注釋3:便用JNI調(diào)用 Zygotelnit 的 main() 方法。這里的 Zygotelnit 是class文件,也就是說從這里開始就進(jìn)入java領(lǐng)域嘍。
JNI:連接 native(C/C++) 層 和 java 層的橋梁。
1.3 ZygoteInit.java
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
/**
* zygote 進(jìn)程的啟動(dòng)類。
*/
public class ZygoteInit {
...
}
這是 Zygote 進(jìn)程的入口點(diǎn)。 它創(chuàng)建 Zygote 服務(wù),加載資源,并處理與準(zhǔn)備分叉到應(yīng)用程序的過程相關(guān)的其他任務(wù)。
1.3.1 main()
@UnsupportedAppUsage
public static void main(String[] argv) {
ZygoteServer zygoteServer = null;
try {
...
boolean startSystemServer = false;
//argv:用于指定 Zygote 配置的命令行參數(shù)。
...
if (!enableLazyPreload) {
//注釋1:預(yù)加載資源。
preload(bootTimingsTraceLog);
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
SystemClock.uptimeMillis());
bootTimingsTraceLog.traceEnd(); // ZygotePreload
}
...
//注釋2:創(chuàng)建Zygote 的 LocalServerSocket 。
zygoteServer = new ZygoteServer(isPrimaryZygote);
if (startSystemServer) {
//注釋3:開始fork我們的SystemServer進(jìn)程。
Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
...
}
...
// 注釋4:zygote 永久循環(huán)。
caller = zygoteServer.runSelectLoop(abiList);
} catch (Throwable ex) {
...
} finally {
if (zygoteServer != null) {
zygoteServer.closeServerSocket();
}
}
...
}
注釋1:預(yù)加載資源。
注釋2:創(chuàng)建Zygote 的 LocalServerSocket 。
注釋3:開始 fork 我們的 SystemServer 進(jìn)程。
注釋4:zygote 永久循環(huán)。
這里咱們看看 forkSystemServer() ;
1.3.2 forkSystemServer()
/**
* Prepare the arguments and forks for the system server process.
*
* @return A {@code Runnable} that provides an entrypoint into system_server code in the child
* process; {@code null} in the parent.
*/
private static Runnable forkSystemServer(String abiList, String socketName,
ZygoteServer zygoteServer) {
...
//命令行來啟動(dòng)SystemServer
//ZygoteInit.main(String argv[])里面的argv 跟這個(gè)類似
String[] args = {
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"
+ "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010,3011",
"--capabilities=" + capabilities + "," + capabilities,
"--nice-name=system_server",
"--runtime-args",
"--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
"com.android.server.SystemServer",
};
//處理與 zygote spawner 相關(guān)的 args 的參數(shù)解析。
ZygoteArguments parsedArgs;
int pid;
try {
ZygoteCommandBuffer commandBuffer = new ZygoteCommandBuffer(args);
try {
parsedArgs = ZygoteArguments.getInstance(commandBuffer);
} catch (EOFException e) {
throw new AssertionError("Unexpected argument error for forking system server", e);
}
commandBuffer.close();
...
//請(qǐng)求 fork 系統(tǒng)服務(wù)器進(jìn)程
/* Request to fork the system server process */
pid = Zygote.forkSystemServer(
parsedArgs.mUid, parsedArgs.mGid,
parsedArgs.mGids,
parsedArgs.mRuntimeFlags,
null,
parsedArgs.mPermittedCapabilities,
parsedArgs.mEffectiveCapabilities);
} catch (IllegalArgumentException ex) {
throw new RuntimeException(ex);
}
/* For child process */
if (pid == 0) {
if (hasSecondZygote(abiList)) {
waitForSecondaryZygote(socketName);
}
zygoteServer.closeServerSocket();
return handleSystemServerProcess(parsedArgs);
}
return null;
}
這里啟動(dòng)了一個(gè) system server 。下面咱們就看看他。
2、SystemServer
system server 也就是 SystemServer。SystemServer也是一個(gè)進(jìn)程,包括ActivityTaskManagerService、ActivityManagerService、PackageManagerService、WindowManagerService等92種服務(wù)。
Android Framework里面兩大非常重要的進(jìn)程:
SystemServer進(jìn)程。
Zygote進(jìn)程。
2.1 SystemServer.java
frameworks/base/services/java/com/android/server/SystemServer.java
public final class SystemServer {
...
}
2.1.1 main()
/**
* The main entry point from zygote.
*/
public static void main(String[] args) {
new SystemServer().run();
}
public SystemServer() {
// Check for factory test mode.
mFactoryTestMode = FactoryTest.getMode();
...
}
下面 咱們看看 run () 里面都用什么?
2.1.2 run()
private void run() {
try {
...
// 注釋1:加載動(dòng)態(tài)庫(kù)libandroid_service.so。
System.loadLibrary("android_servers");
// 注釋2:創(chuàng)建系統(tǒng)上下文。
createSystemContext();
// 調(diào)用每個(gè)進(jìn)程的主線模塊初始化。
ActivityThread.initializeMainlineModules();
// 注釋3:創(chuàng)建 SystemServiceManager。
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setStartInfo(mRuntimeRestart,
mRuntimeStartElapsedTime, mRuntimeStartUptime);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
// 為可并行化的 init 任務(wù)準(zhǔn)備線程池
SystemServerInitThreadPool.start();
...
} finally {
}
// 注釋4:Start services。
try {
//下面咱們看看這個(gè)三個(gè)方法啟動(dòng)什么服務(wù)
startBootstrapServices(t);
startCoreServices(t);
startOtherServices(t);
} catch (Throwable ex) {
...
} finally {
t.traceEnd(); // StartServices
}
...
// 注釋5:Loop 永久循環(huán)。
Looper.loop();
throw new RuntimeException("Main thread loop unexpectedly exited");
}
注釋1:加載動(dòng)態(tài)庫(kù)libandroid_service.so。
注釋2:創(chuàng)建系統(tǒng)上下文。
注釋3:創(chuàng)建 SystemServiceManager。
注釋4:?jiǎn)?dòng)服務(wù)(startBootstrapServices、startCoreServices、startOtherServices)
注釋5:Loop 永久循環(huán)。
2.1.3 createSystemContext()
private void createSystemContext() {
ActivityThread activityThread = ActivityThread.systemMain();
mSystemContext = activityThread.getSystemContext();
mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
final Context systemUiContext = activityThread.getSystemUiContext();
systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}
初始化系統(tǒng)上下文對(duì)象mSystemContext,并設(shè)置默認(rèn)的主題,mSystemContext實(shí)際上是一個(gè)Context(ContextImpl)對(duì)象。
調(diào)用ActivityThread.systemMain()的時(shí)候,會(huì)調(diào)用ActivityThread.attach(true),而在attach()里面,則創(chuàng)建了Application對(duì)象,并調(diào)用了Application.onCreate()。
2.1.4 startBootstrapServices()
/**
* 啟動(dòng)系統(tǒng)引導(dǎo)服務(wù),因?yàn)檫@些服務(wù)之間有復(fù)雜的相互依賴關(guān)系,所以都放在了這個(gè)方法里面。
*/
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
...
final String TAG_SYSTEM_CONFIG = "ReadingSystemConfig";
SystemServerInitThreadPool.submit(SystemConfig::getInstance, TAG_SYSTEM_CONFIG);
// PlatformCompat Service 由 ActivityManagerService, PackageManagerService 和 其他服務(wù)做使用
PlatformCompat platformCompat = new PlatformCompat(mSystemContext);
ServiceManager.addService(Context.PLATFORM_COMPAT_SERVICE, platformCompat);
ServiceManager.addService(Context.PLATFORM_COMPAT_NATIVE_SERVICE,
new PlatformCompatNative(platformCompat));
AppCompatCallbacks.install(new long[0]);
mSystemServiceManager.startService(FileIntegrityService.class);
Installer installer = mSystemServiceManager.startService(Installer.class);
mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);
mSystemServiceManager.startService(UriGrantsManagerService.Lifecycle.class);
startMemtrackProxyService();
// StartActivityManager
ActivityTaskManagerService atm = mSystemServiceManager.startService(
ActivityTaskManagerService.Lifecycle.class).getService();
//初始化 ActivityManagerService
mActivityManagerService = ActivityManagerService.Lifecycle.startService(
mSystemServiceManager, atm);
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
mWindowManagerGlobalLock = atm.getGlobalLock();
mDataLoaderManagerService = mSystemServiceManager.startService(
DataLoaderManagerService.class);
mIncrementalServiceHandle = startIncrementalService();
t.traceEnd();
//初始化PowerManagerService(電源服務(wù)),需要提前啟動(dòng),因?yàn)槠渌?wù)需要它。
mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
mSystemServiceManager.startService(ThermalManagerService.class);
// 電源管理已經(jīng)開啟,ActivityManagerService負(fù)責(zé)電源管理功能
mActivityManagerService.initPowerManagement();
mSystemServiceManager.startService(RecoverySystemService.Lifecycle.class);
...
mSystemServiceManager.startService(LightsService.class);
// Package manager isn't started yet; need to use SysProp not hardware feature
if (SystemProperties.getBoolean("config.enable_sidekick_graphics", false)) {
mSystemServiceManager.startService(WEAR_SIDEKICK_SERVICE_CLASS);
}
// 初始化DisplayManagerService(顯示管理器)
mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
mSystemServiceManager.startBootPhase(t, SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
// Start the package manager.
try {
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
} finally {
}
// 現(xiàn)在PackageManagerService已經(jīng)啟動(dòng),注冊(cè) dex 加載報(bào)告器來捕獲系統(tǒng)服務(wù)加載的任何 dex 文件。
// 這些 dex 文件將由 BackgroundDexOptService 優(yōu)化。
SystemServerDexLoadReporter.configureSystemServerDexReporter(mPackageManagerService);
mFirstBoot = mPackageManagerService.isFirstBoot();
mPackageManager = mSystemContext.getPackageManager();
...
//將AMS等添加到ServiceManager中
mActivityManagerService.setSystemProcess();
if (!mOnlyCore) {
boolean disableOtaDexopt = SystemProperties.getBoolean("config.disable_otadexopt",
false);
if (!disableOtaDexopt) {
try {
OtaDexoptService.main(mSystemContext, mPackageManagerService);
} catch (Throwable e) {
} finally {
}
}
}
...
mSensorServiceStart = SystemServerInitThreadPool.submit(() -> {
TimingsTraceAndSlog traceLog = TimingsTraceAndSlog.newAsyncLog();
startSensorService();
}, START_SENSOR_SERVICE);
// startBootstrapServices
}
改動(dòng)比較大的地方:
ActivityTaskManagerService(ATMS):負(fù)責(zé)管理除Activity和進(jìn)程,包括生命周期和狀態(tài)切換。
ActivityManagerService(AMS):AMN的子類,負(fù)責(zé)管理三大組件(除Activity)和進(jìn)程,包括生命周期和狀態(tài)切換。AMS因?yàn)橐蛈i交互,所以極其復(fù)雜,涉及window。
ActivityTaskManagerService:把 Activity 相關(guān)的內(nèi)容從 ActivityManagerService 剝離出來而產(chǎn)生的。
PowerManagerService(PMS):電源管理服務(wù)。
PackageManagerService(PKMS):包管理服務(wù),不叫PMS是為了和電源管理服務(wù)區(qū)分開。
2.1.5 startCoreServices()
/**
* 啟動(dòng)核心服務(wù)。
*/
private void startCoreServices(@NonNull TimingsTraceAndSlog t) {
// Service for system config
mSystemServiceManager.startService(SystemConfigService.class);
// Tracks the battery level. Requires LightService.
mSystemServiceManager.startService(BatteryService.class);
...
mSystemServiceManager.startService(LooperStatsService.Lifecycle.class);
mSystemServiceManager.startService(ROLLBACK_MANAGER_SERVICE_CLASS);
mSystemServiceManager.startService(NativeTombstoneManagerService.class);
mSystemServiceManager.startService(BugreportManagerService.class);
mSystemServiceManager.startService(GpuService.class);
// startCoreServices
}
2.1.6 startOtherServices()
/**
* 啟動(dòng)其他服務(wù)。
*/
private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
final Context context = mSystemContext;
VibratorService vibrator = null;
DynamicSystemService dynamicSystem = null;
IStorageManager storageManager = null;
NetworkManagementService networkManagement = null;
IpSecService ipSecService = null;
VpnManagerService vpnManager = null;
VcnManagementService vcnManagement = null;
NetworkStatsService networkStats = null;
NetworkPolicyManagerService networkPolicy = null;
NsdService serviceDiscovery = null;
WindowManagerService wm = null;
SerialService serial = null;
NetworkTimeUpdateService networkTimeUpdater = null;
InputManagerService inputManager = null;
TelephonyRegistry telephonyRegistry = null;
ConsumerIrService consumerIr = null;
MmsServiceBroker mmsService = null;
HardwarePropertiesManagerService hardwarePropertiesService = null;
PacProxyService pacProxyService = null;
...
// 現(xiàn)在便可以開始啟動(dòng)三方APP應(yīng)用(如Launcher啟動(dòng)桌面)
mActivityManagerService.systemReady(() -> {
...
}, t);
// startOtherServices
}
經(jīng)過上面這些步驟,我們調(diào)用調(diào)用createSystemContext()創(chuàng)建系統(tǒng)上下文的時(shí)候,也已經(jīng)完成了mSystemContext和ActivityThread的創(chuàng)建。
ATMS、AMS、WMS、PKMS等對(duì)象已經(jīng)創(chuàng)建好了,并且完成了成員變量初始化。
注意:這是系統(tǒng)進(jìn)程開啟時(shí)的流程,在這之后,會(huì)開啟系統(tǒng)的 Launcher程序,完成系統(tǒng)界面的加載與顯示。
在Android的框架設(shè)計(jì)中,服務(wù)器端指的就是所有App共用的系統(tǒng)服務(wù),比如我們這里提到的ATMS、AMS、WMS、PKMS等等,這些基礎(chǔ)的系統(tǒng)服務(wù)是被所有的App公用的。
3、Launcher是什么
在Android系統(tǒng)中,應(yīng)用程序是由Launcher啟動(dòng)起來的,其實(shí),Launcher本身也是一個(gè)應(yīng)用程序,其它的應(yīng)用程序安裝后,就會(huì)Launcher的界面上出現(xiàn)一個(gè)相應(yīng)的圖標(biāo),點(diǎn)擊這個(gè)圖標(biāo)時(shí),Launcher就會(huì)對(duì)應(yīng)的應(yīng)用程序啟動(dòng)起來。
當(dāng)然也可以在 其他應(yīng)用 啟動(dòng)應(yīng)用。但是本質(zhì)上都是調(diào)用startActivity()。
3.1 LauncherActivity.java
frameworks/base/core/java/android/app/LauncherActivity.java
/**
* Displays a list of all activities which can be performed
* for a given intent. Launches when clicked.
*
* @deprecated Applications can implement this UI themselves using
* {@link androidx.recyclerview.widget.RecyclerView} and
* {@link android.content.pm.PackageManager#queryIntentActivities(Intent, int)}
*/
@Deprecated
public abstract class LauncherActivity extends ListActivity {
...
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
Intent intent = intentForPosition(position);
startActivity(intent);
}
}