日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android serialport new 软件退出_基于Android9.0,了解Android启动流程

發布時間:2023/12/10 Android 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android serialport new 软件退出_基于Android9.0,了解Android启动流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

先記住四個進程和三種方式。

**四個進程**

1.Launcher進程

2.system_server進程

3.App進程

4.Zygote進程

**三種方式**

1.Binder方式

2.Socket方式

3.Handler方式

點擊桌面APP圖標,Launcher調用startActivitySafely(Launcher進程)

```java

/**

* Default launcher application.

*/

public final class Launcher extends Activity

implements View.OnClickListener, OnLongClickListener, LauncherModel.Callbacks,

View.OnTouchListener {

....

/**

* Launches the intent referred by the clicked shortcut.

*

* @param v The view representing the clicked shortcut.

*/

public void onClick(View v) {

// Make sure that rogue clicks don't get through while allapps is launching, or after the

// view has detached (it's possible for this to happen if the view is removed mid touch).

...

Object tag = v.getTag();

if (tag instanceof ShortcutInfo) {

// Open shortcut

final Intent intent = ((ShortcutInfo) tag).intent;

int[] pos = new int[2];

v.getLocationOnScreen(pos);

intent.setSourceBounds(new Rect(pos[0], pos[1],

pos[0] + v.getWidth(), pos[1] + v.getHeight()));

boolean success = startActivitySafely(v, intent, tag);//注意這里

if (success && v instanceof BubbleTextView) {

mWaitingForResume = (BubbleTextView) v;

mWaitingForResume.setStayPressed(true);

}

} else if (tag instanceof FolderInfo) {

...

} else if (v == mAllAppsButton) {

...

}

}

```

```java

boolean startActivitySafely(View v, Intent intent, Object tag) {

boolean success = false;

try {

success = startActivity(v, intent, tag);//注意這里

} catch (ActivityNotFoundException e) {

...

}

return success;

}

```

接著看startActivity

```java

boolean startActivity(View v, Intent intent, Object tag) {

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);//這里表示要在新的task中啟動activity

try {

// Only launch using the new animation if the shortcut has not opted out (this is a

// private contract between launcher and may be ignored in the future).

//只有在快捷方式沒有選擇退出時才使用新動畫啟動(這是一個

//私有合同之間的啟動和可能被忽略在未來)。//這是有道翻譯的

//如果快捷方式尚未退出,則僅使用新動畫啟動(這是

//啟動器之間的私人合同,將來可能會被忽略)。//這是google翻譯的

//大概知道什么意思就行,不必糾結有道還是google

boolean useLaunchAnimation = (v != null) &&

!intent.hasExtra(INTENT_EXTRA_IGNORE_LAUNCH_ANIMATION);

UserHandle user = (UserHandle) intent.getParcelableExtra(ApplicationInfo.EXTRA_PROFILE);

LauncherApps launcherApps = (LauncherApps)

this.getSystemService(Context.LAUNCHER_APPS_SERVICE);

if (useLaunchAnimation) {

ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(v, 0, 0,

v.getMeasuredWidth(), v.getMeasuredHeight());

if (user == null || user.equals(android.os.Process.myUserHandle())) {

// Could be launching some bookkeeping activity

startActivity(intent, opts.toBundle());//注意這里

} else {

launcherApps.startMainActivity(intent.getComponent(), user,

intent.getSourceBounds(),

opts.toBundle());

}

} else {

...

}

return true;

} catch (SecurityException e) {

...

}

return false;

}

```

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

表示要在一個新的Task(任務棧)中啟動這個Activity

Android系統中的每一個Activity都位于一個Task中,一個Task可以包含多個Activity,同一個Activity也可能有多個實例。 在AndroidManifest.xml中,我們可以通過android:launchMode來控制Activity在Task中的實例。

在startActivity的時候,我們也可以通過setFlag 來控制啟動的Activity在Task中的實例。

在Task之外,還有一層容器,這個容器應用開發者和用戶可能都不會感覺到或者用到,但它卻非常重要,那就是Stack,Android系統中的多窗口管理,就是建立在Stack的數據結構上的。 一個Stack中包含了多個Task,一個Task中包含了多個Activity(Window)。

Launcher進程采用Binder向system_server進程發起startActivity請求,現在我們從最熟悉的startAcitivty開始分析(養成先有點,再有線,最后成面的思路,防止看完懵逼)。startActivity有好幾種重載方式,跟源碼一層一層跟下去,發現最后都會調用startActivityForResult。

```java

public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,

@Nullable Bundle options) {

if (mParent == null) {

options = transferSpringboardActivityOptions(options);

Instrumentation.ActivityResult ar =

mInstrumentation.execStartActivity(

this, mMainThread.getApplicationThread(), mToken, this,

intent, requestCode, options);//注意這里

if (ar != null) {

mMainThread.sendActivityResult(

mToken, mEmbeddedID, requestCode, ar.getResultCode(),

ar.getResultData());

}

...

} else {

...

}

}

```

我們這里關注mParent == null條件的即可,mParent 代表的是ActivityGroup,ActivityGroup最開始被用來在一個界面中嵌入多個子Activity,但是在API13中已經被廢棄了,系統推薦采用 Fragment來代替ActivityGroup。

繼續跟下去,查看mInstrumentation.execStartActivity,mInstrumentation是Instrumentation的實例,Instrumentation擁有跟蹤application及activity的功能。

```java

public ActivityResult execStartActivity(

Context who, IBinder contextThread, IBinder token, Activity target,

Intent intent, int requestCode, Bundle options) {

IApplicationThread whoThread = (IApplicationThread) contextThread;

...

try {

...

int result = ActivityManager.getService()

.startActivity(whoThread, who.getBasePackageName(), intent,

intent.resolveTypeIfNeeded(who.getContentResolver()),

token, target != null ? target.mEmbeddedID : null,

requestCode, 0, null, options);//注意這里

checkStartActivityResult(result, intent);

} catch (RemoteException e) {

...

}

return null;

}

```

最后調用

ActivityManager.getService().startActivity來完成啟動。

點進ActivityManager.getService()查看

```java

/**

* @hide

*/

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;

}

};

```

發現是一個IActivityManager的單例。

IActivityManager是一個Binder接口,而ActivityManagerService(AMS)繼承IActivityManager.Stub,IActivityManager.Stub是IActivityManager.aidl生成的接口類,Android8.0開始,把一些Binder代碼轉化為了AIDL模板方式。這里生成一個Launcher進程的AMS代理,AMS是IActivityManager的具體實現,所以這里,就需要去看AMS的startActivity方法。(在system_server進程中調用)

```java

@Override

public final int startActivity(IApplicationThread caller, String callingPackage,

Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,

int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {

return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,

resultWho, requestCode, startFlags, profilerInfo, bOptions,

UserHandle.getCallingUserId());

}

@Override

public final int startActivityAsUser(IApplicationThread caller, String callingPackage,

Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,

int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId) {

return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,

resultWho, requestCode, startFlags, profilerInfo, bOptions, userId,

true /*validateIncomingUser*/);

}

public final int startActivityAsUser(IApplicationThread caller, String callingPackage,

Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,

int startFlags, ProfilerInfo profilerInfo, Bundle bOptions, int userId,

boolean validateIncomingUser) {

enforceNotIsolatedCaller("startActivity");

userId = mActivityStartController.checkTargetUser(userId, validateIncomingUser,

Binder.getCallingPid(), Binder.getCallingUid(), "startActivityAsUser");

// TODO: Switch to user app stacks here.

return mActivityStartController.obtainStarter(intent, "startActivityAsUser")

.setCaller(caller)

.setCallingPackage(callingPackage)

.setResolvedType(resolvedType)

.setResultTo(resultTo)

.setResultWho(resultWho)

.setRequestCode(requestCode)

.setStartFlags(startFlags)

.setProfilerInfo(profilerInfo)

.setActivityOptions(bOptions)

.setMayWait(userId)

.execute();

}

```

mActivityStartController是ActivityStartController的實例

```java

/**

* @return A starter to configure and execute starting an activity. It is valid until after

* {@link ActivityStarter#execute} is invoked. At that point, the starter should be

* considered invalid and no longer modified or used.

*/

ActivityStarter obtainStarter(Intent intent, String reason) {

return mFactory.obtain().setIntent(intent).setReason(reason);

}

```

mFactory是ActivityStarter的一個內部接口,我們再來看看ActivityStarter的execute方法

```java

/**

* Starts an activity based on the request parameters provided earlier.

* @return The starter result.

*/

int execute() {

try {

// TODO(b/64750076): Look into passing request directly to these methods to allow

// for transactional diffs and preprocessing.

if (mRequest.mayWait) {

return startActivityMayWait(mRequest.caller, mRequest.callingUid,

...

} else {

return startActivity(mRequest.caller, mRequest.intent, mRequest.ephemeralIntent,

...

}

} finally {

...

}

}

```

因為之前調用了ActivityStarter的setMayWait方法

```java

ActivityStarter setMayWait(int userId) {

mRequest.mayWait = true;

mRequest.userId = userId;

return this;

}

```

所以,這里的mRequest.mayWait為true,繼續跟

```java

private int startActivityMayWait(IApplicationThread caller, int callingUid,

String callingPackage, Intent intent, String resolvedType,

IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,

IBinder resultTo, String resultWho, int requestCode, int startFlags,

ProfilerInfo profilerInfo, WaitResult outResult,

Configuration globalConfig, SafeActivityOptions options, boolean ignoreTargetSecurity,

int userId, TaskRecord inTask, String reason,

boolean allowPendingRemoteAnimationRegistryLookup) {

...

final ActivityRecord[] outRecord = new ActivityRecord[1];

int res = startActivity(caller, intent, ephemeralIntent, resolvedType, aInfo, rInfo,

voiceSession, voiceInteractor, resultTo, resultWho, requestCode, callingPid,

callingUid, callingPackage, realCallingPid, realCallingUid, startFlags, options,

ignoreTargetSecurity, componentSpecified, outRecord, inTask, reason,

allowPendingRemoteAnimationRegistryLookup);

Binder.restoreCallingIdentity(origId);

...

return res;

}

}

```

接著,連進三個startActivity的重載方法,然后到startActivityUnchecked,后面一串調用startActivityUnchecked->ActivityStackSupervisor.resumeFocusedStackTopActivityLocked->ActivityStack.resumeTopActivityUncheckedLocked->ActivityStack.resumeTopActivityUncheckedLocked->ActivityStack.resumeTopActivityInnerLocked->ActivityStackSupervisor.startSpecificActivityLocked

```java

void startSpecificActivityLocked(ActivityRecord r,

boolean andResume, boolean checkConfig) {

// 該活動的應用程序是否已經在運行?

ProcessRecord app = mService.getProcessRecordLocked(r.processName,

r.info.applicationInfo.uid, true);

getLaunchTimeTracker().setLaunchTime(r);

if (app != null && app.thread != null) {//ProcessRecord類型的對象記錄了進程相關的信息,app.thread為IApplicationThread,這兩個對象在進程為創建時,都是為null的

try {

...

realStartActivityLocked(r, app, andResume, checkConfig);//熱啟動走向,注意這里,進入分支二

return;

} catch (RemoteException e) {

...

}

// If a dead object exception was thrown -- fall through to

// restart the application.

}

mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,

"activity", r.intent.getComponent(), false, false, true);//冷啟動走向,注意這里,進入分支一

}

```

---

### 分支一:進程還沒有創建

ActivityManagerService.startProcessLocked

```java

@GuardedBy("this")

final ProcessRecord startProcessLocked(String processName,

ApplicationInfo info, boolean knownToBeDead, int intentFlags,

String hostingType, ComponentName hostingName, boolean allowWhileBooting,

boolean isolated, boolean keepIfLarge) {

return startProcessLocked(processName, info, knownToBeDead, intentFlags, hostingType,

hostingName, allowWhileBooting, isolated, 0 /* isolatedUid */, keepIfLarge,

null /* ABI override */, null /* entryPoint */, null /* entryPointArgs */,

null /* crashHandler */);//這里以socket的方式,進行跨進程通信。通知zygote fork出app進程

}

@GuardedBy("this")

final ProcessRecord startProcessLocked(String processName, ApplicationInfo info,

boolean knownToBeDead, int intentFlags, String hostingType, ComponentName hostingName,

boolean allowWhileBooting, boolean isolated, int isolatedUid, boolean keepIfLarge,

String abiOverride, String entryPoint, String[] entryPointArgs, Runnable crashHandler) {

long startTime = SystemClock.elapsedRealtime();

ProcessRecord app;

if (!isolated) {//這里為false

app = getProcessRecordLocked(processName, info.uid, keepIfLarge);

checkTime(startTime, "startProcess: after getProcessRecord");

...

} else {

// If this is an isolated process, it can't re-use an existing process.

//如果這是一個獨立的進程,它就不能重用現有的進程。

app = null;

}

...

if (app == null) {

checkTime(startTime, "startProcess: creating new process record");

app = newProcessRecordLocked(info, processName, isolated, isolatedUid);

//創建并鎖定

...

} else {

// If this is a new package in the process, add the package to the list

...

}

...

checkTime(startTime, "startProcess: stepping in to startProcess");

final boolean success = startProcessLocked(app, hostingType, hostingNameStr, abiOverride);//注意這里

checkTime(startTime, "startProcess: done starting proc!");

return success ? app : null;

}

```

進入startProcessLocked

```java

@GuardedBy("this")

private final boolean startProcessLocked(ProcessRecord app,

String hostingType, String hostingNameStr, String abiOverride) {

return startProcessLocked(app, hostingType, hostingNameStr,

false /* disableHiddenApiChecks */, abiOverride);

}

/**

* @return {@code true} if process start is successful, false otherwise.

*/

@GuardedBy("this")

private final boolean startProcessLocked(ProcessRecord app, String hostingType,

String hostingNameStr, boolean disableHiddenApiChecks, String abiOverride) {

...

return startProcessLocked(hostingType, hostingNameStr, entryPoint, app, uid, gids,

runtimeFlags, mountExternal, seInfo, requiredAbi, instructionSet, invokeWith,

startTime);//注意這里

} catch (RuntimeException e) {

...

return false;

}

}

@GuardedBy("this")

private boolean startProcessLocked(String hostingType, String hostingNameStr, String entryPoint,

ProcessRecord app, int uid, int[] gids, int runtimeFlags, int mountExternal,

String seInfo, String requiredAbi, String instructionSet, String invokeWith,

long startTime) {

app.pendingStart = true;

app.killedByAm = false;

app.removed = false;

app.killed = false;

final long startSeq = app.startSeq = ++mProcStartSeqCounter;

app.setStartParams(uid, hostingType, hostingNameStr, seInfo, startTime);

if (mConstants.FLAG_PROCESS_START_ASYNC) {

...

final ProcessStartResult startResult = startProcess(app.hostingType, entryPoint,

app, app.startUid, gids, runtimeFlags, mountExternal, app.seInfo,

requiredAbi, instructionSet, invokeWith, app.startTime);//注意這里

synchronized (ActivityManagerService.this) {

handleProcessStartedLocked(app, startResult, startSeq);

}

...

});

return true;

} else {

...

final ProcessStartResult startResult = startProcess(hostingType, entryPoint, app,

uid, gids, runtimeFlags, mountExternal, seInfo, requiredAbi, instructionSet,

invokeWith, startTime);//注意這里

handleProcessStartedLocked(app, startResult.pid, startResult.usingWrapper,

startSeq, false);

...

return app.pid > 0;

}

}

```

繼續看startProcess

```java

private ProcessStartResult startProcess(String hostingType, String entryPoint,

ProcessRecord app, int uid, int[] gids, int runtimeFlags, int mountExternal,

String seInfo, String requiredAbi, String instructionSet, String invokeWith,

long startTime) {

...

if (hostingType.equals("webview_service")) {

...

} else {

startResult = Process.start(entryPoint,

app.processName, uid, uid, gids, runtimeFlags, mountExternal,

app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,

app.info.dataDir, invokeWith,

new String[] {PROC_START_SEQ_IDENT + app.startSeq});

}

...

return startResult;

...

}

```

繼續看Process.start

```java

public static final ProcessStartResult start(final String processClass,

final String niceName,

int uid, int gid, int[] gids,

int runtimeFlags, int mountExternal,

int targetSdkVersion,

String seInfo,

String abi,

String instructionSet,

String appDataDir,

String invokeWith,

String[] zygoteArgs) {

return zygoteProcess.start(processClass, niceName, uid, gid, gids,

runtimeFlags, mountExternal, targetSdkVersion, seInfo,

abi, instructionSet, appDataDir, invokeWith, zygoteArgs);

}

```

zygoteProcess為ZygoteProcess實例,繼續看ZygoteProcess的start

```java

public final Process.ProcessStartResult start(final String processClass,

...{

try {

return startViaZygote(processClass, niceName, uid, gid, gids,

runtimeFlags, mountExternal, targetSdkVersion, seInfo,

abi, instructionSet, appDataDir, invokeWith, false /* startChildZygote */,

zygoteArgs);

} catch (ZygoteStartFailedEx ex) {

...

}

}

```

繼續

```java

private Process.ProcessStartResult startViaZygote(final String processClass,

...

synchronized(mLock) {

return zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi), argsForZygote);//注意這里,以及注意openZygoteSocketIfNeeded這個方法

}

}

```

繼續

```java

@GuardedBy("mLock")

private static Process.ProcessStartResult zygoteSendArgsAndGetResult(

ZygoteState zygoteState, ArrayList<String> args)

throws ZygoteStartFailedEx {

...

// Should there be a timeout on this?

Process.ProcessStartResult result = new Process.ProcessStartResult();//注意這里

...

return result;

} catch (IOException ex) {

...

}

}

```

這里的openZygoteSocketIfNeeded(),內部實現Zygote通過Socket的方式,與system_sever連接,最后調用native層方法nativeForkAndSpecialize,fork一個新的進程。(這條線,自行閱讀、跟蹤源碼。記住:點成線,線成面,切勿貪心,否則一臉懵逼。)

至此APP進程創建完成,接著會通過反射執行APP進程的ActivityThread的main方法,這個main方法是APP進程的入口。

```java

public static void main(String[] args) {

...

Looper.prepareMainLooper();//創建一個主線程的Looper

...

ActivityThread thread = new ActivityThread();

thread.attach(false, startSeq);//注意這里

if (sMainThreadHandler == null) {

sMainThreadHandler = thread.getHandler();

}

...

Looper.loop();//開啟循環

throw new RuntimeException("Main thread loop unexpectedly exited");

}

```

繼續看attach

```java

private void attach(boolean system, long startSeq) {

sCurrentActivityThread = this;

mSystemThread = system;

if (!system) {

...

final IActivityManager mgr = ActivityManager.getService();//獲取AMS在app客戶端的代理對象

try {

mgr.attachApplication(mAppThread, startSeq);//注意這里,app進程掛起,執行system進程AMS的attachApplication

} catch (RemoteException ex) {

throw ex.rethrowFromSystemServer();

}

...

}

```

繼續attachApplication

```java

@Override

public final void attachApplication(IApplicationThread thread, long startSeq) {

synchronized (this) {

...

attachApplicationLocked(thread, callingPid, callingUid, startSeq);//注意這里

...

}

}

```

繼續attachApplicationLocked

```java

@GuardedBy("this")

private final boolean attachApplicationLocked(IApplicationThread thread,

int pid, int callingUid, long startSeq) {

...

if (app.isolatedEntryPoint != null) {

// This is an isolated process which should just call an entry point instead of

// being bound to an application.

thread.runIsolatedEntryPoint(app.isolatedEntryPoint, app.isolatedEntryPointArgs);

} else if (app.instr != null) {

thread.bindApplication(processName, appInfo, providers,

app.instr.mClass,

profilerInfo, app.instr.mArguments,

app.instr.mWatcher,

app.instr.mUiAutomationConnection, testMode,

mBinderTransactionTrackingEnabled, enableTrackAllocation,

isRestrictedBackupMode || !normalMode, app.persistent,

new Configuration(getGlobalConfiguration()), app.compat,

getCommonServicesLocked(app.isolated),

mCoreSettingsObserver.getCoreSettingsLocked(),

buildSerial, isAutofillCompatEnabled);

} else {

thread.bindApplication(processName, appInfo, providers, null, profilerInfo,

null, null, null, testMode,

mBinderTransactionTrackingEnabled, enableTrackAllocation,

isRestrictedBackupMode || !normalMode, app.persistent,

new Configuration(getGlobalConfiguration()), app.compat,

getCommonServicesLocked(app.isolated),

mCoreSettingsObserver.getCoreSettingsLocked(),

buildSerial, isAutofillCompatEnabled);

}

...

} catch (Exception e) {

...

}

// See if the top visible activity is waiting to run in this process...

//看看頂部可見的活動是否正在等待在這個進程中運行……

if (normalMode) {

try {

if (mStackSupervisor.attachApplicationLocked(app)) {//注意這里

didSomething = true;

}

} catch (Exception e) {

..

}

}

...

return true;

}

```

thread為IApplicationThread,這里system進程調用app進程的ActivityThrad.ApplicationThread的bindApplication,同時

繼續看看

```java

public final void bindApplication(String processName, ApplicationInfo appInfo,

List<ProviderInfo> providers, ComponentName instrumentationName,

ProfilerInfo profilerInfo, Bundle instrumentationArgs,

IInstrumentationWatcher instrumentationWatcher,

IUiAutomationConnection instrumentationUiConnection, int debugMode,

boolean enableBinderTracking, boolean trackAllocation,

boolean isRestrictedBackupMode, boolean persistent, Configuration config,

CompatibilityInfo compatInfo, Map services, Bundle coreSettings,

String buildSerial, boolean autofillCompatibilityEnabled) {

...

sendMessage(H.BIND_APPLICATION, data);

}

```

局勢越來越明朗了,繼續sendMessage,連著幾個重載,最后到H的H.BIND_APPLICATION

```java

case BIND_APPLICATION:

Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");

AppBindData data = (AppBindData)msg.obj;

handleBindApplication(data);//注意這里

Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);

break;

```

繼續handleBindApplication

```java

private void handleBindApplication(AppBindData data) {

...

final LoadedApk pi = getPackageInfo(instrApp, data.compatInfo,

appContext.getClassLoader(), false, true, false);//拿到并保存了ApplicationInfo所包含的代碼和資源的目錄

final ContextImpl instrContext = ContextImpl.createAppContext(this, pi);//創建要啟動Activity的上下文環境

try {

final ClassLoader cl = instrContext.getClassLoader();

mInstrumentation = (Instrumentation)

cl.loadClass(data.instrumentationName.getClassName()).newInstance();//用類加載器來創建Instrumentation實例

} catch (Exception e) {

...

}

final ComponentName component = new ComponentName(ii.packageName, ii.name);//該類保存了Activity類名和包名

mInstrumentation.init(this, instrContext, appContext, component,

data.instrumentationWatcher, data.instrumentationUiAutomationConnection);

...

} else {

mInstrumentation = new Instrumentation();

mInstrumentation.basicInit(this);

}

app = data.info.makeApplication(data.restrictedBackupMode, null);//這里生成Application

...

try {

mInstrumentation.callApplicationOnCreate(app);//注意這里

} catch (Exception e) {

...

}

} finally {

...

}

...

}

```

繼續

```java

public void callApplicationOnCreate(Application app) {

app.onCreate();//執行Application的onCreate()方法

}

```

這里Application由data.info.makeApplication生成,http://data.info為LoadedApk對象,所以這里看LoadedApk的makeApplication

```java

public Application makeApplication(boolean forceDefaultAppClass,

Instrumentation instrumentation) {

...

ContextImpl appContext = ContextImpl.createAppContext(mActivityThread, this);

app = mActivityThread.mInstrumentation.newApplication(

cl, appClass, appContext);

appContext.setOuterContext(app);

} catch (Exception e) {

...

}

mActivityThread.mAllApplications.add(app);

mApplication = app;

if (instrumentation != null) {//這里傳入的instrumentation為null,data.info.makeApplication(data.restrictedBackupMode, null);

try {

instrumentation.callApplicationOnCreate(app);

} catch (Exception e) {

...

}

}

...

return app;

}

```

記得attachApplicationLocked里面,還調用了ActivityStackSupervisor的attachApplicationLocked

```java

boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {

final String processName = app.processName;

...

if (realStartActivityLocked(activity, app,

top == activity /* andResume */, true /* checkConfig */)) {//注意這里

didSomething = true;

}

} catch (RemoteException e) {

...

}

}...

return didSomething;

}

```

繼續看realStartActivityLocked,的后面接著下面的**分支二**

### 分支二:進程已經創建

ActivityStackSupervisor.realStartActivityLocked

```java

final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,

boolean andResume, boolean checkConfig) throws RemoteException {

...

// Create activity launch transaction.

final ClientTransaction clientTransaction = ClientTransaction.obtain(app.thread,

r.appToken);

clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent),

System.identityHashCode(r), r.info,

// TODO: Have this take the merged configuration instead of separate global

// and override configs.

mergedConfiguration.getGlobalConfiguration(),

mergedConfiguration.getOverrideConfiguration(), r.compat,

r.launchedFromPackage, task.voiceInteractor, app.repProcState, r.icicle,

r.persistentState, results, newIntents, mService.isNextTransitionForward(),

profilerInfo));

// Set desired final state.

final ActivityLifecycleItem lifecycleItem;

if (andResume) {

lifecycleItem = ResumeActivityItem.obtain(mService.isNextTransitionForward());

} else {

lifecycleItem = PauseActivityItem.obtain();

}

clientTransaction.setLifecycleStateRequest(lifecycleItem);

// Schedule transaction.執行Activity啟動事務

mService.getLifecycleManager().scheduleTransaction(clientTransaction);//注意這里

...

return true;

}

```

mService是AMS,getLifecycleManager()返回一個ClientLifecycleManager對象

```java

/**

* Schedule a transaction, which may consist of multiple callbacks and a lifecycle request.

* @param transaction A sequence of client transaction items.

* @throws RemoteException

*

* @see ClientTransaction

*/

void scheduleTransaction(ClientTransaction transaction) throws RemoteException {

final IApplicationThread client = transaction.getClient();

transaction.schedule();

if (!(client instanceof Binder)) {

// If client is not an instance of Binder - it's a remote call and at this point it is

// safe to recycle the object. All objects used for local calls will be recycled after

// the transaction is executed on client in ActivityThread.

transaction.recycle();

}

}

```

scheduleTransaction內部調用ClientTransaction.schedule

```java

/**

* Schedule the transaction after it was initialized. It will be send to client and all its

* individual parts will be applied in the following sequence:

* 1. The client calls {@link #preExecute(ClientTransactionHandler)}, which triggers all work

* that needs to be done before actually scheduling the transaction for callbacks and

* lifecycle state request.

* 2. The transaction message is scheduled.

* 3. The client calls {@link TransactionExecutor#execute(ClientTransaction)}, which executes

* all callbacks and necessary lifecycle transitions.

*/

public void schedule() throws RemoteException {

mClient.scheduleTransaction(this);

}

```

這里mClient就是執行ClientTransaction.obtain(app.thread,r.appToken);時,傳進來的app.thread,也就是IApplicationThread。

```java

/** Obtain an instance initialized with provided params. */

public static ClientTransaction obtain(IApplicationThread client, IBinder activityToken) {

ClientTransaction instance = ObjectPool.obtain(ClientTransaction.class);

if (instance == null) {

instance = new ClientTransaction();

}

instance.mClient = client;

instance.mActivityToken = activityToken;

return instance;

}

```

IApplicationThread的具體實現為ActivityThread的內部類ApplicationThread,兜兜轉轉,又回到了ApplicationThread

```java

@Override

public void scheduleTransaction(ClientTransaction transaction) throws RemoteException {

ActivityThread.this.scheduleTransaction(transaction);

}

```

ActivityThread的內部沒有scheduleTransaction()方法,看父類的ClientTransactionHandler

```java

/** Prepare and schedule transaction for execution. */

void scheduleTransaction(ClientTransaction transaction) {

transaction.preExecute(this);

sendMessage(ActivityThread.H.EXECUTE_TRANSACTION, transaction);

}

```

ClientTransactionHandler的sendMessage是一個抽象方法,所以去實現類ActivityThread去找,最終調用ActivityThread的sendMessage方法

```java

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;//ActivityThread.H.EXECUTE_TRANSACTION

msg.obj = obj;

msg.arg1 = arg1;

msg.arg2 = arg2;

if (async) {

msg.setAsynchronous(true);

}

mH.sendMessage(msg);

}

```

mH是Handler的實例,繼續跟mH的EXECUTE_TRANSACTION

```java

case EXECUTE_TRANSACTION:

final ClientTransaction transaction = (ClientTransaction) msg.obj;

mTransactionExecutor.execute(transaction);

if (isSystem()) {

// Client transactions inside system process are recycled on the client side

// instead of ClientLifecycleManager to avoid being cleared before this

// message is handled.

transaction.recycle();

}

// TODO(lifecycler): Recycle locally scheduled transactions.

break;

```

mTransactionExecutor為TransactionExecutor的實例,繼續

```java

public void execute(ClientTransaction transaction) {

final IBinder token = transaction.getActivityToken();

log("Start resolving transaction for client: " + mTransactionHandler + ", token: " + token);

executeCallbacks(transaction);

executeLifecycleState(transaction);

mPendingActions.clear();

log("End resolving transaction");

}

```

調用了executeCallbacks和executeLifecycleState,繼續

```java

/** Cycle through all states requested by callbacks and execute them at proper times. */

@VisibleForTesting

public void executeCallbacks(ClientTransaction transaction) {

...

final int size = callbacks.size();

for (int i = 0; i < size; ++i) {

final ClientTransactionItem item = callbacks.get(i);

log("Resolving callback: " + item);

final int postExecutionState = item.getPostExecutionState();

final int closestPreExecutionState = mHelper.getClosestPreExecutionState(r,

item.getPostExecutionState());

if (closestPreExecutionState != UNDEFINED) {

cycleToPath(r, closestPreExecutionState);

}

item.execute(mTransactionHandler, token, mPendingActions);

item.postExecute(mTransactionHandler, token, mPendingActions);

if (r == null) {

// Launch activity request will create an activity record.

r = mTransactionHandler.getActivityClient(token);

}

if (postExecutionState != UNDEFINED && r != null) {

// Skip the very last transition and perform it by explicit state request instead.

final boolean shouldExcludeLastTransition =

i == lastCallbackRequestingState && finalState == postExecutionState;

cycleToPath(r, postExecutionState, shouldExcludeLastTransition);

}

}

}

/** Transition to the final state if requested by the transaction. */

private void executeLifecycleState(ClientTransaction transaction) {

...

// Cycle to the state right before the final requested state.

cycleToPath(r, lifecycleItem.getTargetState(), true /* excludeLastState */);

// Execute the final transition with proper parameters.

lifecycleItem.execute(mTransactionHandler, token, mPendingActions);

lifecycleItem.postExecute(mTransactionHandler, token, mPendingActions);

}

```

executeCallbacks和executeLifecycleState都調用了cycleToPath,繼續

```java

/** Transition the client between states. */

@VisibleForTesting

public void cycleToPath(ActivityClientRecord r, int finish) {

cycleToPath(r, finish, false /* excludeLastState */);

}

/**

* Transition the client between states with an option not to perform the last hop in the

* sequence. This is used when resolving lifecycle state request, when the last transition must

* be performed with some specific parameters.

*/

private void cycleToPath(ActivityClientRecord r, int finish,

boolean excludeLastState) {

final int start = r.getLifecycleState();

log("Cycle from: " + start + " to: " + finish + " excludeLastState:" + excludeLastState);

final IntArray path = mHelper.getLifecyclePath(start, finish, excludeLastState);

performLifecycleSequence(r, path);//注意這里

}

```

繼續跟進performLifecycleSequence

```java

/** Transition the client through previously initialized state sequence. */

private void performLifecycleSequence(ActivityClientRecord r, IntArray path) {

final int size = path.size();

for (int i = 0, state; i < size; i++) {

state = path.get(i);

log("Transitioning to state: " + state);

switch (state) {

case ON_CREATE://注意這里

mTransactionHandler.handleLaunchActivity(r, mPendingActions,

null /* customIntent */);

break;

case ON_START:

mTransactionHandler.handleStartActivity(r, mPendingActions);

break;

case ON_RESUME:

mTransactionHandler.handleResumeActivity(r.token, false /* finalStateRequest */,

r.isForward, "LIFECYCLER_RESUME_ACTIVITY");

break;

case ON_PAUSE:

mTransactionHandler.handlePauseActivity(r.token, false /* finished */,

false /* userLeaving */, 0 /* configChanges */, mPendingActions,

"LIFECYCLER_PAUSE_ACTIVITY");

break;

case ON_STOP:

mTransactionHandler.handleStopActivity(r.token, false /* show */,

0 /* configChanges */, mPendingActions, false /* finalStateRequest */,

"LIFECYCLER_STOP_ACTIVITY");

break;

case ON_DESTROY:

mTransactionHandler.handleDestroyActivity(r.token, false /* finishing */,

0 /* configChanges */, false /* getNonConfigInstance */,

"performLifecycleSequence. cycling to:" + path.get(size - 1));

break;

case ON_RESTART:

mTransactionHandler.performRestartActivity(r.token, false /* start */);

break;

default:

throw new IllegalArgumentException("Unexpected lifecycle state: " + state);

}

}

}

```

mTransactionHandler為傳入的ClientTransactionHandler,其handleLaunchActivity為抽象方法,其子類ActivityThread實現了該方法

```java

/**

* Extended implementation of activity launch. Used when server requests a launch or relaunch.

*/

@Override

public Activity handleLaunchActivity(ActivityClientRecord r,

PendingTransactionActions pendingActions, Intent customIntent) {

...

final Activity a = performLaunchActivity(r, customIntent);

...

return a;

}

```

繼續performLaunchActivity

```java

/** Core implementation of activity launch. */

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {

ActivityInfo aInfo = r.activityInfo;//獲取ActivityInfo類

if (r.packageInfo == null) {

r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,

Context.CONTEXT_INCLUDE_CODE);// 獲取APK文件描述LoadedApk,LoadedApk在構造時,拿到并保存了ApplicationInfo所包含的代碼和資源的目錄

}

ComponentName component = r.intent.getComponent();//獲取要啟動的Activity的ComponentName類,該類保存了Activity類名和包名

if (component == null) {

component = r.intent.resolveActivity(

mInitialApplication.getPackageManager());

r.intent.setComponent(component);

}

if (r.activityInfo.targetActivity != null) {

component = new ComponentName(r.activityInfo.packageName,

r.activityInfo.targetActivity);

}

ContextImpl appContext = createBaseContextForActivity(r);// 創建要啟動Activity的上下文環境

Activity activity = null;

try {

java.lang.ClassLoader cl = appContext.getClassLoader();// 用類加載器來創建Activity實例

activity = mInstrumentation.newActivity(

cl, component.getClassName(), r.intent);

StrictMode.incrementExpectedActivityCount(activity.getClass());

r.intent.setExtrasClassLoader(cl);

r.intent.prepareToEnterProcess();

...

} catch (Exception e) {

...

}

try {

Application app = r.packageInfo.makeApplication(false, mInstrumentation);// 創建Application,makeApplication方法內部會調用創建Application的onCreate()

...

activity.attach(appContext, this, getInstrumentation(), r.token,

r.ident, app, r.intent, r.activityInfo, title, r.parent,

r.embeddedID, r.lastNonConfigurationInstances, config,

r.referrer, r.voiceInteractor, window, r.configCallback);// 初始化Activity,在attach方法中會創建window對象并與Activity關聯

...

if (r.isPersistable()) {

mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);

} else {

mInstrumentation.callActivityOnCreate(activity, r.state);

}

...

}

...

} catch (SuperNotCalledException e) {

...

} catch (Exception e) {

...

}

return activity;

}

```

r.isPersistable()

```java

public boolean isPersistable() {

return activityInfo.persistableMode == ActivityInfo.PERSIST_ACROSS_REBOOTS;

}

```

繼續走Instrumentation的callActivityOnCreate(activity, r.state, r.persistentState);

```java

/**

* Perform calling of an activity's {@link Activity#onCreate}

* method. The default implementation simply calls through to that method.

* @param activity The activity being created.

* @param icicle The previously frozen state (or null) to pass through to

* @param persistentState The previously persisted state (or null)

*/

public void callActivityOnCreate(Activity activity, Bundle icicle,

PersistableBundle persistentState) {

prePerformCreate(activity);

activity.performCreate(icicle, persistentState);//注意這里

postPerformCreate(activity);

}

```

繼續,Activity.performCreate

```java

final void performCreate(Bundle icicle, PersistableBundle persistentState) {

mCanEnterPictureInPicture = true;

restoreHasCurrentPermissionRequest(icicle);

if (persistentState != null) {

onCreate(icicle, persistentState);

} else {

onCreate(icicle);

}

writeEventLog(LOG_AM_ON_CREATE_CALLED, "performCreate");

mActivityTransitionState.readState(icicle);

mVisibleFromClient = !mWindow.getWindowStyle().getBoolean(

com.android.internal.R.styleable.Window_windowNoDisplay, false);

mFragments.dispatchActivityCreated();

mActivityTransitionState.setEnterActivityOptions(this, getActivityOptions());

}

```

終于看到了熟悉的onCreate,感動,Read The Fucking Source Code。

---

### 總結:

- 先弄清楚,APP的啟動流程。至于流程中涉及的Binder、Socket、Handler、反射等,后續再慢慢展開學習、了解

- 胖子有什么理解錯誤的,歡迎大家指出來,一起討論、學習、進步

- 胖子文筆不怎么好,第一次寫博客,盡量一次走一條路,岔路后續再慢慢補齊

- 寫博客,對了解、學習、加深源碼內部機制,有很大的幫助

- 期待胖子的第二篇[《Android消息機制》](基于Android9.0,了解Android消息機制)

---

### 參考文獻

[Android 9.0 點擊桌面應用圖標,啟動Activity的過程分析](CSDN-個人空間)

[android點擊桌面App圖標activity啟動流程](Android啟動過程 - 左手指月 - 博客園)

Android開發藝術探索<br/>

總結

以上是生活随笔為你收集整理的android serialport new 软件退出_基于Android9.0,了解Android启动流程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

精品国产黄色片 | 国产一区二区成人 | 成人国产精品久久久 | 精精国产xxxx视频在线播放 | 在线观看一级视频 | 深夜男人影院 | 在线中文字幕一区二区 | 亚洲国产中文字幕在线观看 | 男女视频国产 | 91亚色在线观看 | 日韩av快播电影网 | 国产精品一区电影 | 日日添夜夜添 | 日韩视频二区 | 色大片免费看 | 亚洲欧美日韩国产精品一区午夜 | 密桃av在线| 中文字幕在线看视频 | 日韩免费观看一区二区 | 欧美一级高清片 | 成人av资源 | 亚洲精品在线视频播放 | 日韩69视频 | 午夜久久久久久久 | 欧美日韩99 | 国产精品99蜜臀久久不卡二区 | 97精品在线观看 | 成人久久久精品国产乱码一区二区 | 在线观看亚洲国产 | 色婷婷影视 | 亚洲资源网| 国产精品普通话 | 亚洲另类视频在线 | 日韩三区在线 | 天天色天天 | 97视频在线免费 | 9992tv成人免费看片 | 波多野结衣日韩 | 99久高清在线观看视频99精品热在线观看视频 | 欧美精品xxx | 91免费看黄色 | 狠狠色伊人亚洲综合网站野外 | 日韩高清一 | 色噜噜在线观看 | 色视频在线免费观看 | 超级碰碰碰视频 | 三级免费黄色 | 蜜臀精品久久久久久蜜臀 | 黄色软件大全网站 | 午夜视频亚洲 | 久久国产午夜精品理论片最新版本 | 黄色一级大片在线免费看国产一 | 天天综合成人 | 99热在线精品观看 | 久久精品一区二区三区四区 | 手机成人免费视频 | 在线观看免费国产小视频 | 亚洲三级黄色 | 九色在线视频 | 欧美精品亚州精品 | 欧美另类成人 | 亚洲免费永久精品国产 | 色综合久久综合网 | 亚洲伦理一区 | 97视频在线观看免费 | 涩涩伊人 | 国产在线国偷精品产拍免费yy | 国产精品一区二区果冻传媒 | 久久激情网站 | 国产精品欧美久久久久三级 | 91黄站| 91自拍视频在线 | 日本中文字幕在线视频 | 丰满少妇对白在线偷拍 | 免费看三级网站 | 91成年人网站 | 国产精品每日更新 | 久久免费美女视频 | 国产中文字幕久久 | 九九热久久久 | 超碰97人 | 狠狠色伊人亚洲综合网站色 | 911免费视频 | 亚洲欧洲精品久久 | 中文视频在线看 | 国产四虎影院 | 久久久久成| 在线三级播放 | 在线观看韩日电影免费 | 久久久久激情电影 | 在线观看视频中文字幕 | 日韩色av色资源 | 亚洲欧美日韩精品一区二区 | 亚洲一级国产 | 亚洲精品国产精品国自 | 欧美极品xxxxx| 狠狠色狠狠色合久久伊人 | 欧美另类高清 | 91免费在线播放 | 美女黄频在线观看 | 亚洲无人区小视频 | 欧亚日韩精品一区二区在线 | 国产精品99精品久久免费 | 亚洲国产剧情 | 91理论片午午伦夜理片久久 | 99久久久国产免费 | 国产一区二区三精品久久久无广告 | 久草精品在线观看 | 亚洲爽爽网 | 99精品免费久久久久久日本 | 91亚洲成人 | 97成人在线 | 九九热精品视频在线播放 | 成人在线小视频 | 男女视频久久久 | 狠狠狠色丁香综合久久天下网 | 91高清一区 | 四虎4hu永久免费 | 92中文资源在线 | 黄色毛片大全 | 久久电影国产免费久久电影 | 国产成人精品一区二区三区 | 日韩av网站在线播放 | 超碰在线98 | www在线免费观看 | 成人免费大片黄在线播放 | 久久这里| 91探花国产综合在线精品 | 日本黄色大片免费 | 亚洲精品国产成人av在线 | 国产成人av一区二区三区在线观看 | 在线a人v观看视频 | 日本婷婷色 | 成年人在线观看视频免费 | 日韩欧美第二页 | 久久精品高清视频 | 亚洲精品国产精品国自产观看 | 深爱激情站| 久草久草在线观看 | 2017狠狠干| 91免费版成人 | 免费日韩精品 | 国产少妇在线观看 | 精品久久久久久久久久久久 | 中文字幕在线日本 | 亚欧日韩av | 一级成人免费 | 最近中文字幕在线播放 | 97精品国产91久久久久久久 | 中文字幕在线观看第三页 | 日韩av免费大片 | 成人 亚洲 欧美 | 奇米导航| 欧美一级性生活片 | 九九九九九九精品 | 免费aa大片 | 久久综合九九 | 高清视频一区 | 日精品在线观看 | 黄色免费大全 | 精品国产伦一区二区三区观看体验 | 国产黄色网 | 国产一区免费在线 | www操操操| 91网站免费观看 | 麻豆传媒视频观看 | 国产精品成人一区二区三区吃奶 | 91九色porny蝌蚪视频 | 久久精品99北条麻妃 | 欧美久草在线 | 色国产在线 | 91桃色国产在线播放 | 在线免费av网 | 人人爱爱人人 | 在线观看色视频 | 成 人 a v天堂 | 久久免费看视频 | 日本在线中文在线 | 国产一级久久久 | 日韩免费av在线 | 久久国产a| 国产亚洲精品美女 | 天天爱综合 | 日韩欧美一区二区三区视频 | 国产日韩高清在线 | 激情文学综合丁香 | 精品久久久免费视频 | 中文字幕乱码在线播放 | 免费精品 | 2020天天干天天操 | 亚洲成av人电影 | 国产精品毛片久久久久久久 | 久久久久北条麻妃免费看 | 中文字幕在线专区 | 亚洲精品国产精品国自 | 亚洲视频免费 | 美女视频a美女大全免费下载蜜臀 | 一级成人免费 | 狠狠狠色丁香婷婷综合久久五月 | 色999五月色 | 色在线免费观看 | 国产精品99久久免费观看 | 免费av在线 | 久久视频在线观看 | 色综合久久久 | 久久天天综合网 | 久久人人爽爽人人爽人人片av | 国产资源网站 | 国产录像在线观看 | 黄色aa久久 | 超碰97免费观看 | 亚洲成成品网站 | 狠狠色伊人亚洲综合网站野外 | 伊人电影在线观看 | 日韩精品一区二区三区丰满 | 人人爽人人爽人人爽人人爽 | 99视频在线观看一区三区 | 成人久久 | av电影在线不卡 | 久草免费福利在线观看 | 免费人成网 | 亚洲欧美国产精品久久久久 | 日韩城人在线 | 久久久久综合视频 | 国产专区在线 | 九九综合在线 | 国产精品久久久久久久免费观看 | 中文字幕免费久久 | 在线观看黄污 | 久久久久高清毛片一级 | 精品国产aⅴ麻豆 | av黄色国产 | 一区二区三区日韩视频在线观看 | 日韩欧美第二页 | 福利视频网址 | 三级免费黄色 | 在线播放av网址 | 国产特黄色片 | 91系列在线 | 日韩高清不卡一区二区三区 | 国产成人1区 | 九九免费在线看完整版 | 麻豆精品传媒视频 | 日韩视频精品在线 | 国产精品久久久久久久婷婷 | 福利视频入口 | 最近中文字幕久久 | 午夜aaaa| 国产在线观看午夜 | 国产欧美高清 | 99久久99久久 | 亚洲精品乱码久久久久久蜜桃欧美 | 91视频在线网址 | 国产在线精品一区二区不卡了 | 探花视频在线观看 | 日本字幕网 | 色吊丝在线永久观看最新版本 | 日韩免费一级a毛片在线播放一级 | 狠狠操狠狠 | 久久久久久久国产精品 | 国产成人精品综合久久久 | 香蕉视频在线免费 | www.天天操| 干干日日 | 91黄色免费看 | 中文字幕日本在线 | 激情婷婷亚洲 | 色噜噜狠狠色综合中国 | 久久这里只精品 | 天天干天天射天天爽 | 中文字幕你懂的 | 黄在线免费看 | 亚洲欧美激情插 | 成年人黄色在线观看 | 欧美va天堂va视频va在线 | 欧美久久久久久久久久久 | 在线精品在线 | 伊人五月婷 | 国产一区电影在线观看 | 天天·日日日干 | 精品视频国产一区 | 免费h在线观看 | 国产一区二区三区高清播放 | 国产亚洲精品久久久久久大师 | 91九色蝌蚪国产 | 国产91精品在线播放 | 国内精品在线一区 | 国产99久久久久 | 欧美一级视频一区 | 99久久日韩精品免费热麻豆美女 | 国产精品久久在线 | 亚洲一区二区黄色 | www.97色.com| 欧美日韩视频在线 | 欧美在线日韩在线 | 亚洲在线视频免费 | 日韩理论片 | 天天综合网~永久入口 | 99热精品在线观看 | 欧洲激情在线 | 1000部国产精品成人观看 | 欧美精品在线一区 | 丁香资源影视免费观看 | 99精品偷拍视频一区二区三区 | 99久久精品国 | www91在线| 黄色片网站免费 | 久久精品国产美女 | 精品国产亚洲日本 | 精品国内自产拍在线观看视频 | 91网免费看| 一区二区三区在线免费 | 日韩av网址在线 | 亚洲乱码精品久久久 | 91自拍视频在线观看 | 一区二区视频电影在线观看 | 日韩视频免费观看高清完整版在线 | 国产美女免费观看 | 黄色国产在线 | 国产不卡在线 | 国产精品久久久久久久久久不蜜月 | 99久久久国产精品免费观看 | 最近中文字幕久久 | 欧美日韩精品在线 | 91精品视频导航 | 亚洲国产精品一区二区久久,亚洲午夜 | 欧美淫aaa免费观看 日韩激情免费视频 | 九九免费在线观看视频 | 国产 日韩 欧美 自拍 | 日韩视频中文字幕在线观看 | 在线 高清 中文字幕 | 特级a老妇做爰全过程 | 亚洲一级黄色大片 | 91成版人在线观看入口 | 成人国产在线 | av在线电影免费观看 | 亚洲日本va在线观看 | 正在播放国产一区二区 | 国产精品久久久久婷婷二区次 | 久久精品电影 | 伊人成人激情 | 亚洲精品一区二区精华 | 久二影院 | 丝袜美腿在线 | av中文天堂 | 欧美日韩亚洲一 | 91免费国产在线观看 | www.com久久| 精品久久久网 | 天天人人综合 | 992tv在线观看网站 | 午夜91视频 | 一区二区三区四区在线免费观看 | 444av| 成人午夜电影在线观看 | 美女视频黄免费 | 中文字幕免费观看全部电影 | 欧美激情精品久久久久久免费 | 亚洲精品视频免费 | 婷婷在线看 | 国产精品不卡在线观看 | 97超碰在 | 久草在线中文视频 | 日本性xxxxx 亚洲精品午夜久久久 | 日韩中文在线电影 | 91精品国| 天天天操操操 | 最新久久久 | 香蕉视频免费看 | 国产高清一区二区 | wwwwwww色| 色综合久久中文综合久久牛 | 亚洲国产精彩中文乱码av | 97国产精品亚洲精品 | 久久久国产精品人人片99精片欧美一 | 欧美性极品xxxx做受 | 精品在线观看一区二区三区 | 国产又粗又猛又爽 | 国产午夜精品久久 | 国产精品高清在线观看 | 久艹视频免费观看 | 成人av免费在线 | 麻豆精品视频在线观看免费 | 久久久.com | 视频一区二区国产 | 亚洲国产精品推荐 | 国产亚洲精品久久网站 | 国产在线高清视频 | 在线观看视频免费播放 | free. 性欧美.com | 在线视频区 | 一区二区三区在线播放 | 色视频网页 | 色中射| 91精品系列| 午夜国产福利视频 | 九九精品久久 | 香蕉国产91| 久久久午夜电影 | 婷婷精品在线视频 | 婷婷久操| 午夜av电影 | 91污视频在线观看 | 国产精品一区二区av日韩在线 | 91亚色在线观看 | 99视频精品免费视频 | 色婷婷影视 | 欧美日韩精品在线免费观看 | 又黄又爽又无遮挡的视频 | 色在线网站 | 久久久久久福利 | 在线电影 你懂得 | 最近免费中文字幕大全高清10 | 国产精品亚洲精品 | 丝袜一区在线 | 99久久毛片| 黄色特级毛片 | 国产精久久久久久久 | 天堂在线视频免费观看 | 中文欧美字幕免费 | 日本天天色 | 啪啪动态视频 | 国产精品18久久久久vr手机版特色 | 亚洲一级电影 | 在线观看中文字幕dvd播放 | 国产精品国产亚洲精品看不卡15 | 手机版av在线 | 欧亚日韩精品一区二区在线 | 国产精品久久99精品毛片三a | 天天干夜夜想 | 亚州精品天堂中文字幕 | 综合在线观看 | 亚洲精品系列 | 成人片在线播放 | 亚洲精品www. | 亚洲成人av一区 | 一区二区三区高清在线 | 久久精品精品电影网 | 亚洲黄在线观看 | 在线亚洲精品 | 免费一级毛毛片 | 91人人澡人人爽 | 国产精品毛片久久蜜 | 91中文字幕 | 天天色 天天 | 欧美a级在线免费观看 | 精品一区免费 | 成人h视频在线 | 国产一级免费在线 | 久草国产在线观看 | 亚洲精品视频在线免费 | 91高清视频| 免费男女羞羞的视频网站中文字幕 | 色香天天| 亚洲小视频在线 | 久久午夜精品视频 | 日韩精品一二三 | 中文字幕在线观看视频一区二区三区 | 最近中文字幕免费av | 欧美天天干 | 91av视屏| 亚洲一级片 | 亚洲国产午夜精品 | 一区二区三区中文字幕在线 | 久草在线视频中文 | 黄色三级免费网址 | 久久爱992xxoo | 色综合www | 激情五月六月婷婷 | 国产一区二区视频在线 | 97人人人人 | 99久久爱| 亚洲精品色婷婷 | 欧美一级免费片 | 欧美亚洲一区二区在线 | 欧产日产国产69 | 日韩电影在线一区 | 国产精品中文字幕在线播放 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 午夜av一区二区三区 | 日韩欧美视频二区 | 亚洲人人网 | 美女视频黄是免费的 | 国产成人三级三级三级97 | 成年人在线观看网站 | 精品国产一区二区三区四区在线观看 | 亚洲精品高清一区二区三区四区 | 亚洲最大av在线播放 | 亚洲精品乱码久久久久久蜜桃欧美 | 狠狠色丁香 | 射射色| 日韩视频中文字幕在线观看 | 欧美analxxxx| 免费av大全 | 婷婷性综合 | 色综合天天综合网国产成人网 | 日韩欧美大片免费观看 | 五月综合 | 国产一二区视频 | 91大神一区二区三区 | 国产精品成人国产乱一区 | 国产成人精品一区二区三区网站观看 | 丁香婷婷综合激情五月色 | 色九九在线 | 国产明星视频三级a三级点| 中文字幕av在线播放 | japanese黑人亚洲人4k | 国产成人61精品免费看片 | 三级黄色网址 | 欧美视频不卡 | 国产无套精品久久久久久 | 免费精品| 精品国产1区二区 | 国产精品丝袜久久久久久久不卡 | japanese黑人亚洲人4k | 午夜精品一二区 | 一区二区免费不卡在线 | 99久久精品免费看国产麻豆 | 欧美在线视频一区二区三区 | 国产精品久久久久久久毛片 | 五月婷在线 | 亚洲小视频在线观看 | 欧美在线free | 日韩欧美精品一区 | 精品一区二区免费视频 | 国产99在线 | 亚洲成人av片在线观看 | 日韩电影中文字幕在线 | 草久在线观看视频 | 美女视频黄是免费的 | 手机在线黄色网址 | 97国产在线播放 | 国产中文字幕一区二区三区 | 午夜久久久久久久久 | 国产精品网址在线观看 | 成人精品视频 | 成年人在线免费视频观看 | 久久久天堂 | 国产中文字幕三区 | 九九综合久久 | 狠狠夜夜 | 91漂亮少妇露脸在线播放 | 91精品欧美一区二区三区 | 国产在线日韩 | 久久国产精彩视频 | 国产精品久久三 | 免费看v片 | 精品999国产| 亚洲成a人片在线观看网站口工 | 91精品久久久久久久久久入口 | 五月婷香蕉久色在线看 | 欧美一级片免费在线观看 | 中文字幕国产一区二区 | 亚洲综合欧美日韩狠狠色 | 国产精品久久久久久超碰 | 啪一啪在线 | 婷婷综合在线 | 青青五月天 | av青草 | 久久精品免费观看 | 中文在线字幕观看电影 | 成人一级在线观看 | 精品婷婷 | 欧美日韩在线电影 | av在线进入| 精品久久久久一区二区国产 | 国产精品18videosex性欧美 | 在线a人片免费观看视频 | 国产资源精品在线观看 | 精品三级av | 久热这里有精品 | 亚洲精品日韩在线观看 | 国产中文字幕视频在线观看 | 亚洲在线成人精品 | 欧美日韩国产伦理 | 日韩黄色免费 | 香蕉在线观看视频 | 久久国产精品二国产精品中国洋人 | 欧美成人在线网站 | 免费中文字幕视频 | 日韩欧美在线综合网 | 亚洲91网站 | 色综合天天做天天爱 | 亚洲精品五月天 | 欧美91精品久久久久国产性生爱 | 婷婷在线资源 | 欧美性精品 | 亚洲欧洲在线视频 | 深爱综合网 | 超碰在97 | 麻豆成人小视频 | 国产又粗又猛又爽又黄的视频免费 | 色综合久久五月天 | 国产区 在线 | 国产精品中文在线 | 91亚洲在线观看 | 色婷婷狠狠干 | 日韩视频区 | 国产精品久久99精品毛片三a | 国产九九在线 | 久久三级毛片 | 国产不卡精品视频 | 日本三级不卡视频 | 黄色字幕网 | 九草在线视频 | 一区二区不卡视频在线观看 | 在线免费性生活片 | 午夜精品久久久久久久99热影院 | 久草视频手机在线 | 久久成年人视频 | 青青河边草免费观看 | 天堂成人在线 | 久久一二三四 | 狠狠干电影 | 91漂亮少妇露脸在线播放 | 亚洲欧美视频在线 | 日韩激情影院 | 日本狠狠色| 91精品高清| 日日夜操 | 欧美一区二区三区四区夜夜大片 | av高清免费 | 999国内精品永久免费视频 | av不卡中文| 国产91成人 | 国产美女视频 | 婷婷成人综合 | 亚洲午夜精品久久久久久久久 | 婷婷丁香在线 | 国产一区二区三精品久久久无广告 | 九草在线观看 | 国产黄色片免费观看 | 91成人精品一区在线播放69 | 国产色综合天天综合网 | 国产69久久久欧美一级 | 国产手机在线观看视频 | 亚洲欧洲日韩在线观看 | 在线视频日韩精品 | 国产亚洲综合性久久久影院 | 狠狠色狠狠色综合日日92 | 国产亚洲精品美女久久 | 热re99久久精品国产99热 | 热久久免费国产视频 | 久久免费公开视频 | 欧美日韩啪啪 | 亚洲理论在线观看 | 天天操天 | 超碰97成人 | 日本性生活一级片 | 国产精品入口麻豆www | 久久精品高清 | 在线视频欧美精品 | 亚洲高清视频一区二区三区 | 黄色免费观看 | 91精品视频免费在线观看 | 国产一级视频 | 一级片视频在线 | 亚洲一区视频免费观看 | 五月婷婷播播 | 国模精品在线 | 国内成人精品2018免费看 | 尤物九九久久国产精品的分类 | 成人av免费在线看 | 亚洲欧美少妇 | 日韩中文字幕亚洲一区二区va在线 | 五月天婷婷综合 | 国产传媒中文字幕 | 中文字幕高清有码 | 欧美成人中文字幕 | 免费在线观看毛片网站 | 国产日韩中文字幕在线 | 午夜在线看 | 欧美日韩一区二区在线 | 亚洲日本va中文字幕 | 一本一本久久a久久 | aa一级片 | 开心色激情网 | 久久国产精品99久久久久久老狼 | 国产麻豆精品一区 | 日韩av综合网站 | 日韩一区在线免费观看 | 午夜婷婷综合 | 91久久奴性调教 | 日韩电影在线观看中文字幕 | 精品1区2区| 欧美日韩在线播放 | 天天插天天干天天操 | 国产美女视频免费观看的网站 | 伊人热 | 亚洲午夜久久久影院 | 日日干夜夜干 | 人人爽人人乐 | 九九九视频在线 | 一区二区视频在线观看免费 | 91日韩在线专区 | 正在播放国产精品 | 久久久久高清 | 久草爱 | 国产精品18毛片一区二区 | 日韩美女免费线视频 | 国产一区在线不卡 | 手机成人免费视频 | 亚洲乱码精品久久久久 | 久久久国产一区二区三区四区小说 | 超碰夜夜 | 国产午夜亚洲精品 | 中国美女一级看片 | 久久九九九九 | 欧美激情精品久久久久久免费印度 | 99在线精品观看 | 综合网天天 | 日韩理论片中文字幕 | 色国产精品 | 久久久久久久久久久影院 | 国产精品第十页 | 国产成人av在线 | 色com网| 久久久久久久久免费视频 | 超碰资源在线 | 99精品免费久久久久久久久日本 | 亚洲国产影院 | 91在线视频免费观看 | 天天干亚洲 | 伊人五月| 久久av网址 | 欧美成人a在线 | 亚洲精品中文在线 | 国产精品一区二区三区在线看 | 欧美成人精品欧美一级乱黄 | 狠狠操影视| 波多野结衣电影久久 | 很污的网站| 中文字幕在线观看免费观看 | 国产成人精品国内自产拍免费看 | 免费看一级黄色 | 人人舔人人干 | 日韩三级免费观看 | 欧美99精品| 中文字幕黄色网址 | 91天天视频| 久久96| 美女视频免费一区二区 | 免费看网站在线 | 激情丁香5月 | 黄色精品一区二区 | 综合网伊人 | 免费视频 你懂的 | 久久视频一区二区 | 国产一级二级在线播放 | 久久精品精品电影网 | 精品国产一区二区三区久久影院 | 91麻豆文化传媒在线观看 | 9i看片成人免费看片 | 2018亚洲男人天堂 | 精品一区二区在线观看 | 亚洲精品欧美精品 | 久草www | 精品久久久99 | 97精产国品一二三产区在线 | 97免费视频在线播放 | av免费观看网站 | 黄色一级大片在线观看 | 久久精品一二三区 | 97精产国品一二三产区在线 | 久久人人爽人人片av | 美女视频黄免费网站 | 精品国产伦一区二区三区观看说明 | 日韩一级理论片 | av中文字幕不卡 | 在线观看中文字幕第一页 | 99se视频在线观看 | 91精品国产欧美一区二区成人 | 99国产成+人+综合+亚洲 欧美 | 亚洲精品综合在线观看 | 黄色成人影视 | 国产免费观看高清完整版 | 天天爱天天操天天射 | 欧美激情综合五月色丁香 | 婷婷国产一区二区三区 | 人人草网站 | 天天综合网入口 | 亚洲免费公开视频 | 欧美性黑人 | 成人宗合网 | 性色视频在线 | 午夜在线观看 | 欧美性一级观看 | 玖草在线观看 | 日韩视 | 肉色欧美久久久久久久免费看 | 毛片1000部免费看 | 99精品国自产在线 | 天天草天天 | 亚洲精品视频在线 | 一区二区视频欧美 | 91成人国产 | 日本黄色免费大片 | 狠狠色噜噜狠狠狠合久 | 日本精品在线看 | 亚洲国产精品视频在线观看 | 国产视频一区在线 | 中文字幕久久网 | 美女中文字幕 | 91在线入口 | 日日摸日日 | 天天干天天操天天入 | 九九热免费精品视频 | 国产在线1区| 亚洲免费在线观看视频 | 久久精品国产一区二区电影 | 国产一区二区免费看 | 亚洲电影第一页av | 99热九九这里只有精品10 | 国内三级在线观看 | 免费在线观看成人小视频 | 中文字幕av免费观看 | 色多多视频在线 | 中文字幕制服丝袜av久久 | 日日日天天天 | 色在线最新 | 久久免费美女视频 | 一级免费观看 | 天天操网站 | 国产综合小视频 | 免费 在线 中文 日本 | 国产成人精品日本亚洲999 | 国产精品久久久久久久久久久久午夜 | 日本不卡一区二区三区在线观看 | 久久综合免费 | 97人人模人人爽人人喊中文字 | 狠狠狠狠狠狠狠狠 | 国产色在线视频 | 久久视频99 | 久草www | 91丨九色丨国产丨porny精品 | 人人插人人费 | 国内揄拍国内精品 | 久草视频精品 | 日日碰狠狠添天天爽超碰97久久 | 天堂资源在线观看视频 | 国产精品免费观看国产网曝瓜 | 成人国产在线 | 黄av在线 | 国产不卡一二三区 | 亚洲经典精品 | 成年人免费看片网站 | 国产精品自产拍在线观看桃花 | 国产午夜精品免费一区二区三区视频 | 精品国产一区二区三区久久久蜜臀 | 国内精品久久久久影院一蜜桃 | 久草久草在线 | 美女久久久久久久 | 黄在线| 超碰97公开 | 丝袜一区在线 | 久草在线视频免费资源观看 | av福利在线播放 | 欧美日韩精品在线视频 | 久久精品人| 国产一二三区在线观看 | 天天综合中文 | 五月天综合网站 | 亚洲无吗视频在线 | 91精品国产福利在线观看 | 99国产视频在线 | 91麻豆精品国产91久久久无限制版 | 狠狠狠狠干 | 91黄视频在线观看 | 亚洲草视频 | 国产伦理精品一区二区 | 久久手机免费观看 | 国产无遮挡又黄又爽馒头漫画 | 干干日日| 免费三级在线 | 手机在线日韩视频 | 91黄在线看 | 亚洲国产字幕 | 91热精品视频| 国产资源在线免费观看 | 欧美污污网站 | 在线日本看片免费人成视久网 | 免费三级黄色片 | 综合久久精品 | 日韩欧美高清在线 | 日日天天av | wwwav视频| 在线免费黄色片 | 国产剧情一区二区在线观看 | 久久综合久久综合九色 | 免费三级黄色片 | 国产在线观看不卡 | 91观看视频 | 欧美一区二区在线刺激视频 | 91精品视频免费观看 | 国产一区观看 | 国产亚洲精品久久久久久久久久久久 | 久久av网址 | 中文字幕中文字幕中文字幕 | 国产精品永久 | 日韩美在线 | 亚洲人在线 | 日韩在线免费小视频 | 久久久久免费精品 | 国产1级毛片 | 国产美女视频 | 国产一区二区精品在线 | 波多野结衣理论片 | 国产精品久久久久久影院 | 国产午夜精品一区 | 欧美激情精品久久久久 | av免费在线网站 | 中文字幕一二三区 | 美女免费网站 | 玖玖在线看| 在线成人免费 | 国产免费高清视频 | 91毛片在线观看 | 激情xxxx| 99久久综合国产精品二区 | 天堂在线成人 | 人人添人人澡人人澡人人人爽 | 开心激情五月婷婷 | 国产欧美三级 | 久久精品这里都是精品 | 免费av片在线| 久久久污| 日韩精品一区二区免费 | 久久精品久久久精品美女 | 国产精品video爽爽爽爽 | 狠狠色狠狠色综合日日92 | 五月天丁香亚洲 | 国产999精品 | 色婷婷九月 | 国产精品毛片一区视频播 | 日韩一区二区三区在线观看 | 国色天香永久免费 | 久久久久久电影 | av在线播放网址 | 免费观看成人网 | 91完整版观看 | 人人天天夜夜 | 欧美一级艳片视频免费观看 | 在线小视频你懂的 | 中文字幕首页 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 欧美 日韩 性 | 97色婷婷成人综合在线观看 | 色综合天天色综合 | 国产一区二区三区久久久 | 婷五月激情 | 久久国产精品99久久人人澡 | 综合久久2023 | 美女网站在线播放 | 在线观看视频福利 | 亚洲一二三区精品 | 国产精品久久久久久久久岛 | 国产精品原创在线 | av在线免费在线 | 欧美日韩精品在线观看视频 | 久草在线资源免费 | 精品在线99 | 久久成视频 | 国产精品igao视频网入口 | 91tv国产成人福利 | 香蕉网在线观看 | 狠狠ri| 中午字幕在线观看 | 国产亚洲精品久久久久久久久久久久 | 亚洲一区二区视频在线 | 国产精品永久在线观看 | 国产不卡一 | 亚洲色图27p| 91传媒91久久久 | 日韩三级久久 | 国产在线观看中文字幕 | 中文字幕av一区二区三区四区 | 国内三级在线观看 | 日韩av电影中文字幕在线观看 | 在线免费观看欧美日韩 | 精品视频免费看 | 国产亚洲精品免费 | 久久一区国产 | 久久免费高清视频 | 国产乱码精品一区二区三区介绍 | 久草电影在线观看 | 色丁香久久 | 在线观看一级视频 | 91视频免费播放 | 成人免费在线电影 | 99久久精品视频免费 | 国产黄色看片 | 人人添人人澡人人澡人人人爽 | 婷婷草| 午夜视频播放 | 精品国产欧美一区二区三区不卡 | 五月婷丁香网 | 国产手机av | 亚洲精品日韩在线观看 |