원본 코드 편 - 안 드 로 이 드 시작 프로 세 스
APPLICTION, APPLICATION FRAMEWORK, LIBRARICB+ANDROID RUNTIME, LINUX KERNEL
안 드 로 이 드 시작
안내 프로그램 이 리 눅 스 커 널 을 시작 하면 각종 구동 과 데이터 구 조 를 불 러 옵 니 다. 구동 이 있 으 면 안 드 로 이 드 시스템 을 시작 하 는 동시에 사용자 등급 의 첫 번 째 프로 세 스 init (system \ core \ init. c) 코드 를 다음 과 같이 불 러 옵 니 다.
int main(int argc, char **argv)
{
//
mount("tmpfs", "/dev", "tmpfs", 0, "mode=0755");
mkdir("/dev/pts", 0755);
//
log_init();
INFO("reading config file
");
// init.rc
init_parse_config_file("/init.rc");
}
init. rc 파일 을 불 러 오 면 Zygote 프로 세 스 를 시작 합 니 다. 이 프로 세 스 는 Android 시스템 의 모 프로 세 스 로 Android 의 다른 서비스 프로 세 스, 코드 를 시작 합 니 다.
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
socket zygote stream 666
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart media
onrestart restart netd
c + 코드 에서 자바 코드 로:
int main(int argc, const char* const argv[])
{
...
// Android
AppRuntime runtime;
...
// Next arg is startup classname or "--zygote"
if (i < argc) {
arg = argv[i++];
if (0 == strcmp("--zygote", arg)) {
bool startSystemServer = (i < argc) ?
strcmp(argv[i], "--start-system-server") == 0 : false;
setArgv0(argv0, "zygote");
set_process_name("zygote");
// java
runtime.start("com.android.internal.os.ZygoteInit",
...
}
ZygoteInit. java 코드:
public static void main(String argv[]) { try { VMRuntime.getRuntime().setMinimumHeapSize(5 * 1024 * 1024);
// Android
preloadClasses();
//cacheRegisterMaps();
preloadResources();
...
if (argv[1].equals("true")) {
//
startSystemServer();
} else if (!argv[1].equals("false")) {
...
}
private static boolean startSystemServer()
...
args = new String[] {
"--setuid=1000",
"--setgid=1000",
"--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,3001,3002,3003,3006",
"--capabilities=130104352,130104352",
"--rlimit=8,",
"--runtime-init",
"--nice-name=system_server",
"com.android.server.SystemServer",
...
/* Request to fork the system server process */
// SystemServer
pid = Zygote.forkSystemServer(
parsedArgs.uid, parsedArgs.gid,
parsedArgs.gids, debugFlags, rlimits,
parsedArgs.permittedCapabilities,
parsedArgs.effectiveCapabilities);
..
}
System Server. java 코드
public static void main(String[] args) {
...
// jni
System.loadLibrary("android_servers");
// native
init1(args);
}
native public static void init1(String[] args);
SystemServer 에 대응 하 는 c + + 코드 comandroidserver SystemServer. cpp 코드 는 다음 과 같 습 니 다.
// java
extern "C" int system_init();
static void android_server_SystemServer_init1(JNIEnv* env, jobject clazz)
{
//
system_init();
}
/*
* JNI registration.
*/
static JNINativeMethod gMethods[] = {
/* name, signature, funcPtr */
// init1 android_server_SystemServer_init1
{ "init1", "([Ljava/lang/String;)V", (void*) android_server_SystemServer_init1 },
};
systeminit 의 실현 방법 은 Systeminit. cpp 코드 에서 다음 과 같 습 니 다.
extern "C" status_t system_init()
{
...
//
if (strcmp(propBuf, "1") == 0) {
// Start the SurfaceFlinger
SurfaceFlinger::instantiate();
}
AndroidRuntime* runtime = AndroidRuntime::getRuntime();
LOGI("System server: starting Android services.
");
// , Systemserver init2
runtime->callStatic("com/android/server/SystemServer", "init2");
...
}
SystemServer 의 init 2 방법 코드:
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 의 run 방법:
public void run () {... / / Android 각종 서 비 스 를 시작 하고 ServiceManager 에 추가 하여 Slog. i (TAG, "Device Policy") 를 관리 합 니 다. devicePolicy = new DevicePolicy Manager Service (context); ServiceManager. addService (Context. DEVICEPOLICYSERVICE, ottle =
...
// We now tell the activity manager it is okay to run third party
// code. It will call back into us once it has gotten to the state
// where third party code can really run (but before it has actually
// started launching the initial applications), for us to complete our
// initialization.
// ActivityManagerService.systemReady
((ActivityManagerService)ActivityManagerNative.getDefault())
.systemReady(new Runnable() {
public void run() {
Slog.i(TAG, "Making services ready");
Activity MangerService 의 system Ready 방법:
public void systemReady(final Runnable goingCallback) {
...
// Activity
mMainStack.resumeTopActivityLocked(null);
}
}
Activity Stack 의 resume TopActivity Locked 방법
final boolean resumeTopActivityLocked(ActivityRecord prev) {
// Find the first activity that is not finishing.
// Activity next null
ActivityRecord next = topRunningActivityLocked(null);
// Remember how we'll process this pause/resume situation, and ensure
// that the state is reset however we wind up proceeding.
final boolean userLeaving = mUserLeaving;
mUserLeaving = false;
if (next == null) {
// There are no more activities! Let's just start up the
// Launcher...
if (mMainStack) {
// lucher
return mService.startHomeActivityLocked();
}
}
Android 시스템 시작 이 완료 되 어 Luncher 애플 리 케 이 션 의 홈 인터페이스 가 열 렸 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.