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

歡迎訪問 生活随笔!

生活随笔

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

Android

【Android 启动过程】Activity 启动源码分析 ( AMS -> ActivityThread、AMS 线程阶段 )

發布時間:2025/6/17 Android 73 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 启动过程】Activity 启动源码分析 ( AMS -> ActivityThread、AMS 线程阶段 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、Activity 啟動源碼分析 ( AMS | ActivityManagerService )
    • 1、Instrumentation 調用 AMS 方法
    • 2、ActivityStarter 調用 AMS 方法
    • 3、Process 啟動新進程
  • 二、Activity 啟動源碼分析 ( ActivityStarter )
    • 1、ActivityStarter.startActivityMayWait() 方法
    • 2、ActivityStarter.startActivity ( 24 參數 ) 方法
    • 3、ActivityStarter.startActivity ( 23 參數 ) 方法
    • 4、ActivityStarter.startActivity ( 9 參數 ) 方法
    • 5、ActivityStarter.startActivityUnchecked 方法
    • 6、ActivityStarter.computeLaunchingTaskFlags() 方法
  • 三、Activity 啟動源碼分析 ( ActivityRecord )
  • 五、ActivityStack
  • 六、ActivityStackSupervisor
  • 四、ActivityStack、TaskRecord、ActivityRecord





一、Activity 啟動源碼分析 ( AMS | ActivityManagerService )




1、Instrumentation 調用 AMS 方法


在 Instrumentation 中 , 通過調用 ActivityManagerService ( AMS ) 的 startActivity 方法 ,

// 在此處調用 AMS , Binder 機制獲取 AMSint result = ActivityManager.getService().startActivity(whoThread, who.getBasePackageName(), intent,intent.resolveTypeIfNeeded(who.getContentResolver()),token, target != null ? target.mEmbeddedID : null,requestCode, 0, null, options);

調用的是 AMS 的 startActivity 101010 個參數的方法 , 在該方法中又掉了 111111 個參數的 startActivityAsUser 方法 ; 在 startActivityAsUser 方法中 , 主要是確保要打開的 Activity 在 AndroidManifest.xml 清單文件中注冊過 ;

在插件化中 , 要在執行該 AMS 方法之前 , 使用在清單文件中注冊過的占坑 Activity 替換插件 Activity , 借此騙過 AMS ;

AMS 相關源碼如下 :

public class ActivityManagerService extends IActivityManager.Stubimplements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {@Overridepublic 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());}@Overridepublic 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) {enforceNotIsolatedCaller("startActivity");userId = mUserController.handleIncomingUser(Binder.getCallingPid(), Binder.getCallingUid(),userId, false, ALLOW_FULL_ONLY, "startActivity", null);// TODO: Switch to user app stacks here.return mActivityStarter.startActivityMayWait(caller, -1, callingPackage, intent,resolvedType, null, null, resultTo, resultWho, requestCode, startFlags,profilerInfo, null, null, bOptions, false, userId, null, "startActivityAsUser");} }

ActivityManagerService 完整源碼參考 : frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java


2、ActivityStarter 調用 AMS 方法


在 ActivityStarter.startActivityUnchecked 中調用了 mSupervisor.resumeFocusedStackTopActivityLocked(mTargetStack, mStartActivity, mOptions); 方法 , 顯示棧頂元素 ,

在 mSupervisor.resumeFocusedStackTopActivityLocked(mTargetStack, mStartActivity, mOptions); 中, 調用了 mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0, "activity", r.intent.getComponent(), false, false, true); 方法啟動新進程 ;

最終在 private final void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) 方法中 , 調用了Process.start(entryPoint, app.processName, uid, uid, gids, debugFlags, mountExternal, app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet, app.info.dataDir, invokeWith, entryPointArgs) 方法 , 開啟新的進程 ;

public class ActivityManagerService extends IActivityManager.Stubimplements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {private final void startProcessLocked(ProcessRecord app, String hostingType,String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) {if (hostingType.equals("webview_service")) {startResult = startWebView(entryPoint,app.processName, uid, uid, gids, debugFlags, mountExternal,app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,app.info.dataDir, null, entryPointArgs);} else {startResult = Process.start(entryPoint,app.processName, uid, uid, gids, debugFlags, mountExternal,app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,app.info.dataDir, invokeWith, entryPointArgs);}} }

ActivityManagerService 完整源碼參考 : frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java


3、Process 啟動新進程


AMS 的 void startProcessLocked(ProcessRecord app, String hostingType, String hostingNameStr, String abiOverride, String entryPoint, String[] entryPointArgs) 方法中 , 調用了 startResult = Process.start(entryPoint, app.processName, uid, uid, gids, debugFlags, mountExternal, app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet, app.info.dataDir, invokeWith, entryPointArgs); 啟動新進程 , 該方法原型如下 :

/*** 開始一個新的過程。** <p>如果啟用了流程,則會創建一個新流程,并且* 在那里執行<var>processClass</var>的靜態main()函數。* 此函數返回后,進程將繼續運行。** <p>如果未啟用進程,則在調用方的* 進程被創建,并在那里調用<var>processClass</var>的main()。** <p>niceName參數(如果不是空字符串)是要使用的自定義名稱* 指定給進程,而不是使用processClass。這允許您* 即使使用相同的基礎,也要創建易于識別的流程* <var>processClass</var>啟動它們。** 當invokeWith不為null時,該進程將作為新應用程序啟動* 而不是合子叉。請注意,這僅適用于uid 0或以下情況* runtimeFlags包含調試\啟用\調試器。** @param processClass 要用作進程主項的類* 指向* @param niceName 用于進程的可讀性更強的名稱。* @param uid 進程將在其下運行的用戶id。* @param gid 進程將在其下運行的組id。* @param gids 與進程關聯的其他組ID。* @param runtimeFlags 為運行時添加附加標志。* @param targetSdkVersion 應用程序的目標SDK版本。* @param seInfo null確定新進程的SELinux信息。* @param abi non null此應用程序啟動時應使用的abi。* @param instructionSet null確定要使用的指令集。* @param appDataDir null ok應用程序的數據目錄。* @param invokeWith null ok用于調用的命令。* @param zygoteArgs 為合子進程提供附加參數。** @返回一個對象,該對象描述嘗試啟動進程的結果。* @在致命啟動失敗時引發RuntimeException** {@hide}*/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);}

完整源碼參考 /frameworks/base/core/java/android/os/Process.java ;





二、Activity 啟動源碼分析 ( ActivityStarter )



1、ActivityStarter.startActivityMayWait() 方法


在 AMS 中調用了 mActivityStarter.startActivityMayWait 方法 , 在 ActivityStarter 中的 startActivityMayWait 中 , 調用了 242424 個參數的 startActivity 方法 ,

class ActivityStarter {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) {// 獲取對應 Activity 信息 , 并處理該信息// 從多個 Activity 中選擇最合適的 Activity // 類似于打開一個文本文件 , 彈出窗口 , 選擇什么應用打開 ResolveInfo rInfo = mSupervisor.resolveIntent(intent, resolvedType, userId,0 /* matchFlags */,computeResolveFilterUid(callingUid, realCallingUid, mRequest.filterCallingUid));// 在 ActivityRecord 對象中 , 記錄了 Activity 的相關活動final ActivityRecord[] outRecord = new ActivityRecord[1];// 啟動 Activity // 調用的是 24 個參數的 startActivity 方法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);} }

完整代碼參考 frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java ;


2、ActivityStarter.startActivity ( 24 參數 ) 方法


242424 個參數的 startActivity 的重載方法中 , 又調用了 232323 個參數的 startActivity 重載方法 ;

class ActivityStarter {// 24 個參數的 startActivity 的重載方法private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent,String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,String callingPackage, int realCallingPid, int realCallingUid, int startFlags,SafeActivityOptions options, boolean ignoreTargetSecurity, boolean componentSpecified,ActivityRecord[] outActivity, TaskRecord inTask, String reason,boolean allowPendingRemoteAnimationRegistryLookup) {// 調用了 23 個參數的 startActivity 的重載方法mLastStartActivityResult = startActivity(caller, intent, ephemeralIntent, resolvedType,aInfo, rInfo, voiceSession, voiceInteractor, resultTo, resultWho, requestCode,callingPid, callingUid, callingPackage, realCallingPid, realCallingUid, startFlags,options, ignoreTargetSecurity, componentSpecified, mLastStartActivityRecord,inTask, allowPendingRemoteAnimationRegistryLookup);} }

完整代碼參考 frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java ;


3、ActivityStarter.startActivity ( 23 參數 ) 方法


232323 個參數的 startActivity 的重載方法中 , 又調用了 999 個參數的 startActivity 重載方法 ,

class ActivityStarter {// 23 個參數的 startActivity 重載方法 private int startActivity(IApplicationThread caller, Intent intent, Intent ephemeralIntent,String resolvedType, ActivityInfo aInfo, ResolveInfo rInfo,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,IBinder resultTo, String resultWho, int requestCode, int callingPid, int callingUid,String callingPackage, int realCallingPid, int realCallingUid, int startFlags,SafeActivityOptions options,boolean ignoreTargetSecurity, boolean componentSpecified, ActivityRecord[] outActivity,TaskRecord inTask, boolean allowPendingRemoteAnimationRegistryLookup) {// 調用 9 個參數的 startActivity 的重載方法return startActivity(r, sourceRecord, voiceSession, voiceInteractor, startFlags,true /* doResume */, checkedOptions, inTask, outActivity);} }

完整代碼參考 frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java ;


4、ActivityStarter.startActivity ( 9 參數 ) 方法


999 個參數的 startActivity 的重載方法中 , 調用了 startActivityUnchecked 方法 ;

class ActivityStarter {// 9 個參數的 startActivity 的重載方法private int startActivity(final ActivityRecord r, ActivityRecord sourceRecord,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,ActivityRecord[] outActivity) {try {mService.mWindowManager.deferSurfaceLayout();// 此處是主要的邏輯 result = startActivityUnchecked(r, sourceRecord, voiceSession, voiceInteractor,startFlags, doResume, options, inTask, outActivity);}} }

完整代碼參考 frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java ;


5、ActivityStarter.startActivityUnchecked 方法


在 startActivityUnchecked 方法中 , 調用了 computeLaunchingTaskFlags 方法 ,

mTargetStack.startActivityLocked 是將啟動的 Activity 插入到棧頂部 , 調用 ActivityStack 的 startActivityLocked 方法 ;

class ActivityStarter {// 注意:此方法只能從{@link startActivity}調用。private int startActivityUnchecked(final ActivityRecord r, ActivityRecord sourceRecord,IVoiceInteractionSession voiceSession, IVoiceInteractor voiceInteractor,int startFlags, boolean doResume, ActivityOptions options, TaskRecord inTask,ActivityRecord[] outActivity) {// 啟動 Activity 的 Launcher Mode 4 種啟動模式 , 就是在該方法中處理computeLaunchingTaskFlags();computeSourceStack();// 此處將啟動的 Activity 插入到棧頂部// 調用 ActivityStack 的 startActivityLocked 方法 mTargetStack.startActivityLocked(mStartActivity, topFocused, newTask, mKeepCurTransition,mOptions);// 顯示棧頂元素mSupervisor.resumeFocusedStackTopActivityLocked(mTargetStack, mStartActivity,mOptions);}

完整代碼查看 frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java ;


6、ActivityStarter.computeLaunchingTaskFlags() 方法


該方法處理 Activity 啟動模式 , 假如啟動 Activity 場景是 Activity A 啟動 Activity B , mSourceRecord 是 Activity A 相關資料 , 是 ActivityRecord 類型對象 , 該對象中保存了 Activity 的所有信息 ;

mSourceRecord == null , 判斷啟動 Activity 的源是否是 Activity , 如果通過 Context 或 Application 啟動 Activity , 則 mSourceRecord 就是空的 ;

mInTask != null 判斷要加入的 TaskRecord 是否為空 ;

調用 isLaunchModeOneOf(LAUNCH_SINGLE_INSTANCE, LAUNCH_SINGLE_TASK) 方法用于判定該 Activity 的啟動模式是否是 LAUNCH_SINGLE_INSTANCE 或 LAUNCH_SINGLE_TASK 中二者之一 ;

class ActivityStarter {// 處理 Activity 啟動模式private void computeLaunchingTaskFlags() {// 如果調用方不是來自另一個 Activity,而是給了我們一個明確的任務,// 他們希望我們在其中啟動新Activity,那么讓我們看看如何執行該任務。// 假如啟動 Activity 場景是 Activity A 啟動 Activity B // mSourceRecord 是 Activity A 相關資料 , 是 ActivityRecord 類型對象// 該對象中保存了 Activity 的所有信息 if (mSourceRecord == null && mInTask != null && mInTask.getStack() != null) {final Intent baseIntent = mInTask.getBaseIntent();final ActivityRecord root = mInTask.getRootActivity();if (baseIntent == null) {ActivityOptions.abort(mOptions);throw new IllegalArgumentException("Launching into task without base intent: "+ mInTask);}// 如果此任務為空,那么我們將添加第一個活動——它確定根,并且必須作為新的_任務啟動。if (isLaunchModeOneOf(LAUNCH_SINGLE_INSTANCE, LAUNCH_SINGLE_TASK)) {if (root != null) {ActivityOptions.abort(mOptions);throw new IllegalArgumentException("Caller with mInTask " + mInTask+ " has root " + root + " but target is singleInstance/Task");}}} }

完整代碼參考 frameworks/base/services/core/java/com/android/server/am/ActivityStarter.java ;





三、Activity 啟動源碼分析 ( ActivityRecord )



ActivityRecord 中記錄了所有的 Activity 信息 , 其中的 private TaskRecord task; // the task this is in. 成員 , 記錄該 ActivityRecord 是存儲在哪個 TaskRecord 中 ;

由于 Activity 可以啟動多次 , 111 個 Activity 可能有多個 ActivityRecord 與之對應 , 每個 ActivityRecord 都與當前某個存在的 Activity 對應 ; 如果啟動模式是 Standard , 那么每次啟動該 Activity 都會創建一個新的 Activity , 放在任務棧棧頂 ;

final class ActivityRecord extends ConfigurationContainer implements AppWindowContainerListener {private static final String TAG = TAG_WITH_CLASS_NAME ? "ActivityRecord" : TAG_AM;private static final String TAG_CONFIGURATION = TAG + POSTFIX_CONFIGURATION;private static final String TAG_SAVED_STATE = TAG + POSTFIX_SAVED_STATE;private static final String TAG_STATES = TAG + POSTFIX_STATES;private static final String TAG_SWITCH = TAG + POSTFIX_SWITCH;private static final String TAG_VISIBILITY = TAG + POSTFIX_VISIBILITY;// TODO(b/67864419): Remove once recents component is overriddenprivate static final String LEGACY_RECENTS_PACKAGE_NAME = "com.android.systemui.recents";private static final boolean SHOW_ACTIVITY_START_TIME = true;private static final String ATTR_ID = "id";private static final String TAG_INTENT = "intent";private static final String ATTR_USERID = "user_id";private static final String TAG_PERSISTABLEBUNDLE = "persistable_bundle";private static final String ATTR_LAUNCHEDFROMUID = "launched_from_uid";private static final String ATTR_LAUNCHEDFROMPACKAGE = "launched_from_package";private static final String ATTR_RESOLVEDTYPE = "resolved_type";private static final String ATTR_COMPONENTSPECIFIED = "component_specified";static final String ACTIVITY_ICON_SUFFIX = "_activity_icon_";final ActivityManagerService service; // ownerfinal IApplicationToken.Stub appToken; // window manager tokenAppWindowContainerController mWindowContainerController;final ActivityInfo info; // all about me// TODO: This is duplicated state already contained in info.applicationInfo - removeApplicationInfo appInfo; // information about activity's appfinal int launchedFromPid; // always the pid who started the activity.final int launchedFromUid; // always the uid who started the activity.final String launchedFromPackage; // always the package who started the activity.final int userId; // Which user is this running for?final Intent intent; // the original intent that generated usfinal ComponentName realActivity; // the intent component, or target of an alias.final String shortComponentName; // the short component name of the intentfinal String resolvedType; // as per original caller;final String packageName; // the package implementing intent's componentfinal String processName; // process where this component wants to runfinal String taskAffinity; // as per ActivityInfo.taskAffinityfinal boolean stateNotNeeded; // As per ActivityInfo.flagsboolean fullscreen; // The activity is opaque and fills the entire space of this task.// TODO: See if it possible to combine this with the fullscreen field.final boolean hasWallpaper; // Has a wallpaper window as a background.final boolean noDisplay; // activity is not displayed?private final boolean componentSpecified; // did caller specify an explicit component?final boolean rootVoiceInteraction; // was this the root activity of a voice interaction?private CharSequence nonLocalizedLabel; // the label information from the package mgr.private int labelRes; // the label information from the package mgr.private int icon; // resource identifier of activity's icon.private int logo; // resource identifier of activity's logo.private int theme; // resource identifier of activity's theme.private int realTheme; // actual theme resource we will use, never 0.private int windowFlags; // custom window flags for preview window.private TaskRecord task; // the task this is in.private long createTime = System.currentTimeMillis();long displayStartTime; // when we started launching this activitylong fullyDrawnStartTime; // when we started launching this activityprivate long startTime; // last time this activity was startedlong lastVisibleTime; // last time this activity became visiblelong cpuTimeAtResume; // the cpu time of host process at the time of resuming activitylong pauseTime; // last time we started pausing the activitylong launchTickTime; // base time for launch tick messages// Last configuration reported to the activity in the client process.private MergedConfiguration mLastReportedConfiguration;private int mLastReportedDisplayId;private boolean mLastReportedMultiWindowMode;private boolean mLastReportedPictureInPictureMode;CompatibilityInfo compat;// last used compatibility modeActivityRecord resultTo; // who started this entry, so will get our replyfinal String resultWho; // additional identifier for use by resultTo.final int requestCode; // code given by requester (resultTo)ArrayList<ResultInfo> results; // pending ActivityResult objs we have receivedHashSet<WeakReference<PendingIntentRecord>> pendingResults; // all pending intents for this actArrayList<ReferrerIntent> newIntents; // any pending new intents for single-top modeActivityOptions pendingOptions; // most recently given optionsActivityOptions returningOptions; // options that are coming back via convertToTranslucentAppTimeTracker appTimeTracker; // set if we are tracking the time in this app/task/activityHashSet<ConnectionRecord> connections; // All ConnectionRecord we holdUriPermissionOwner uriPermissions; // current special URI access perms.ProcessRecord app; // if non-null, hosting applicationprivate ActivityState mState; // current state we are inBundle icicle; // last saved activity statePersistableBundle persistentState; // last persistently saved activity state// TODO: See if this is still needed.boolean frontOfTask; // is this the root activity of its task?boolean launchFailed; // set if a launched failed, to abort on 2nd tryboolean haveState; // have we gotten the last activity state?boolean stopped; // is activity pause finished?boolean delayedResume; // not yet resumed because of stopped app switches?boolean finishing; // activity in pending finish list?boolean deferRelaunchUntilPaused; // relaunch of activity is being deferred until pause is// completedboolean preserveWindowOnDeferredRelaunch; // activity windows are preserved on deferred relaunchint configChangeFlags; // which config values have changedprivate boolean keysPaused; // has key dispatching been paused for it?int launchMode; // the launch mode activity attribute.int lockTaskLaunchMode; // the lockTaskMode manifest attribute, subject to overrideboolean visible; // does this activity's window need to be shown?boolean visibleIgnoringKeyguard; // is this activity visible, ignoring the fact that Keyguard// might hide this activity?private boolean mDeferHidingClient; // If true we told WM to defer reporting to the client// process that it is hidden.boolean sleeping; // have we told the activity to sleep?boolean nowVisible; // is this activity's window visible?boolean mClientVisibilityDeferred;// was the visibility change message to client deferred?boolean idle; // has the activity gone idle?boolean hasBeenLaunched;// has this activity ever been launched?boolean frozenBeforeDestroy;// has been frozen but not yet destroyed.boolean immersive; // immersive mode (don't interrupt if possible)boolean forceNewConfig; // force re-create with new config next timeboolean supportsEnterPipOnTaskSwitch; // This flag is set by the system to indicate that the// activity can enter picture in picture while pausing (only when switching to another task)PictureInPictureParams pictureInPictureArgs = new PictureInPictureParams.Builder().build();// The PiP params used when deferring the entering of picture-in-picture.int launchCount; // count of launches since last statelong lastLaunchTime; // time of last launch of this activityComponentName requestedVrComponent; // the requested component for handling VR mode.String stringName; // for caching of toString().private boolean inHistory; // are we in the history stack?final ActivityStackSupervisor mStackSupervisor;static final int STARTING_WINDOW_NOT_SHOWN = 0;static final int STARTING_WINDOW_SHOWN = 1;static final int STARTING_WINDOW_REMOVED = 2;int mStartingWindowState = STARTING_WINDOW_NOT_SHOWN;boolean mTaskOverlay = false; // Task is always on-top of other activities in the task.TaskDescription taskDescription; // the recents information for this activityboolean mLaunchTaskBehind; // this activity is actively being launched with// ActivityOptions.setLaunchTaskBehind, will be cleared once launch is completed.// These configurations are collected from application's resources based on size-sensitive// qualifiers. For example, layout-w800dp will be added to mHorizontalSizeConfigurations as 800// and drawable-sw400dp will be added to both as 400.private int[] mVerticalSizeConfigurations;private int[] mHorizontalSizeConfigurations;private int[] mSmallestSizeConfigurations;boolean pendingVoiceInteractionStart; // Waiting for activity-invoked voice sessionIVoiceInteractionSession voiceSession; // Voice interaction session for this activity// A hint to override the window specified rotation animation, or -1// to use the window specified value. We use this so that// we can select the right animation in the cases of starting// windows, where the app hasn't had time to set a value// on the window.int mRotationAnimationHint = -1;private boolean mShowWhenLocked;private boolean mTurnScreenOn;/*** Temp configs used in {@link #ensureActivityConfiguration(int, boolean)}*/private final Configuration mTmpConfig = new Configuration();private final Rect mTmpBounds = new Rect(); }

完整代碼參考 frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java





五、ActivityStack



在 ActivityStarter.startActivityUnchecked 方法中 , 調用了 ActivityStack.startActivityLocked 方法 , 將啟動的 Activity 插入了任務棧的頂部 ;

class ActivityStack<T extends StackWindowController> extends ConfigurationContainerimplements StackWindowListener {void startActivityLocked(ActivityRecord r, ActivityRecord focusedTopActivity,boolean newTask, boolean keepCurTransition, ActivityOptions options) {TaskRecord rTask = r.getTask();final int taskId = rTask.taskId;// mLaunchTaskBehind tasks get placed at the back of the task stack.if (!r.mLaunchTaskBehind && (taskForIdLocked(taskId) == null || newTask)) {// Last activity in task had been removed or ActivityManagerService is reusing task.// Insert or replace.// Might not even be in.insertTaskAtTop(rTask, r);}} }



六、ActivityStackSupervisor



在 ActivityStarter.startActivityUnchecked 方法中 , 調用了 ActivityStackSupervisor.resumeFocusedStackTopActivityLocked 方法 , 作用是重新顯示棧頂 Activity ;

public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener,RecentTasks.Callbacks {boolean resumeFocusedStackTopActivityLocked(ActivityStack targetStack, ActivityRecord target, ActivityOptions targetOptions) {if (!readyToResume()) {return false;}if (targetStack != null && isFocusedStack(targetStack)) {return targetStack.resumeTopActivityUncheckedLocked(target, targetOptions);}final ActivityRecord r = mFocusedStack.topRunningActivityLocked();if (r == null || !r.isState(RESUMED)) {mFocusedStack.resumeTopActivityUncheckedLocked(null, null);} else if (r.isState(RESUMED)) {// Kick off any lingering app transitions form the MoveTaskToFront operation.mFocusedStack.executeAppTransition(targetOptions);}return false;}

完整代碼參考 /frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java ;

在 startSpecificActivityLocked 方法中 , 根據 ProcessRecord app 是否為空 , 確定要啟動的 Activity 對應的進程是否存在 , 如果不存在需要創建進程 ;

public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener,RecentTasks.Callbacks {void startSpecificActivityLocked(ActivityRecord r,boolean andResume, boolean checkConfig) {// Is this activity's application already running?ProcessRecord app = mService.getProcessRecordLocked(r.processName,r.info.applicationInfo.uid, true);getLaunchTimeTracker().setLaunchTime(r);if (app != null && app.thread != null) {try {if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0|| !"android".equals(r.info.packageName)) {// Don't add this if it is a platform component that is marked// to run in multiple processes, because this is actually// part of the framework so doesn't make sense to track as a// separate apk in the process.app.addPackage(r.info.packageName, r.info.applicationInfo.longVersionCode,mService.mProcessStats);}realStartActivityLocked(r, app, andResume, checkConfig);return;} catch (RemoteException e) {Slog.w(TAG, "Exception when starting activity "+ r.intent.getComponent().flattenToShortString(), 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);} }

完整代碼參考 /frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java ;





四、ActivityStack、TaskRecord、ActivityRecord



每個 ActivityStack 中對應多個 TaskRecord ; TaskRecord 對應 " 活動任務棧 "

每個 TaskRecord 對應多個 ActivityRecord ;

對應關系如下圖所示 :



在 ActivityStack 中的 private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>(); 成員存儲的就是若干 TaskRecord ;

/*** 單個堆棧活動的狀態和管理。*/ class ActivityStack<T extends StackWindowController> extends ConfigurationContainerimplements StackWindowListener {/*** 所有以前(可能仍在運行)活動的歷史記錄。它包含#TaskRecord對象。*/private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();}

完整代碼參考 /frameworks/base/services/core/java/com/android/server/am/ActivityStack.java ;


在 TaskRecord.java 源碼中 , TaskRecord 類中有 final ArrayList<ActivityRecord> mActivities 成員變量 , 該成員就是存儲多個 ActivityRecord ;

class TaskRecord extends ConfigurationContainer implements TaskWindowContainerListener {/** 按歷史順序排列的任務中所有活動的列表 */final ArrayList<ActivityRecord> mActivities; }

完整代碼參考 /frameworks/base/services/core/java/com/android/server/am/TaskRecord.java ;

總結

以上是生活随笔為你收集整理的【Android 启动过程】Activity 启动源码分析 ( AMS -> ActivityThread、AMS 线程阶段 )的全部內容,希望文章能夠幫你解決所遇到的問題。

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

一区二区国产精品 | 国产中文字幕一区二区 | 99久久久久久久久久 | 日本女人在线观看 | 女人18毛片90分钟 | 一区在线观看 | 91av观看| 精品一区三区 | 在线观看国产福利片 | 最新超碰在线 | 综合网天天射 | 在线激情网 | 99久久精品免费一区 | 在线电影91 | 欧美激情视频久久 | 国产精品剧情在线亚洲 | 热久久免费视频精品 | 992tv在线成人免费观看 | 国产乱老熟视频网88av | 黄在线免费看 | 国产视频在线看 | 国产免费国产 | 天天久久综合 | 亚洲激精日韩激精欧美精品 | 黄色免费av | 久久免费黄色大片 | 国产五月色婷婷六月丁香视频 | 一区二区三区在线观看免费视频 | 五月婷婷影院 | 国产视频资源 | 免费一级片在线 | 日韩在线观看视频在线 | 日韩在线观看中文字幕 | 亚洲精品国产区 | 中文字幕视频播放 | 成人久久久久久久久 | 久久综合狠狠综合 | 色五月激情五月 | 涩涩网站在线看 | 国产一级免费片 | 丁香六月久久综合狠狠色 | 亚洲va欧美va人人爽春色影视 | 日韩免费网站 | 国产精品自产拍在线观看桃花 | 最近最新中文字幕 | 欧美精品v国产精品 | 最新色站 | 在线免费观看羞羞视频 | 色先锋资源网 | 五月天六月婷婷 | 久久视频在线 | 婷婷亚洲五月 | 中文字幕高清在线播放 | 超碰在线1| 亚洲欧洲av| 中文成人字幕 | 五月天.com| 国内免费久久久久久久久久久 | 精品久久一区二区 | 国产精品免费观看国产网曝瓜 | 精品成人网 | 91九色porn在线资源 | 黄色一级大片在线免费看产 | 欧美精品色 | 久久在线精品 | 伊人永久| 国产精品五月天 | 日日夜夜狠狠 | 激情综合网色播五月 | 日日射av| 黄色影院在线免费观看 | 美女国产在线 | 在线激情影院一区 | 97在线看片 | 亚洲黄色片 | 91热爆在线观看 | 最新不卡av | 三级a毛片 | 精品视频不卡 | 日韩一区二区三区不卡 | 91免费观看视频在线 | 久久久久国产免费免费 | 久艹视频免费观看 | 中文字幕2021 | 一二三区视频在线 | 欧美性生活小视频 | 欧美一区二区三区免费观看 | 99 视频 高清 | 国产超碰在线 | 日韩在线观看a | 亚洲一区二区天堂 | 免费视频你懂的 | 黄色国产高清 | 国产精品完整版 | 久久国产精品成人免费浪潮 | av 一区二区三区 | 国产精品久久久久久久久蜜臀 | 国产 日韩 欧美 自拍 | 欧美日韩一级视频 | 国产一级片不卡 | 六月婷婷久香在线视频 | 欧美一级久久 | 亚洲成av人片在线观看无 | 成人av一区二区兰花在线播放 | 久草视频免费观 | 欧美另类xxxxx | 日韩区欠美精品av视频 | 99九九免费视频 | 亚洲一区二区精品 | 成人a在线观看高清电影 | 二区三区av | 国产成人黄色在线 | www.夜色321.com | 蜜桃av人人夜夜澡人人爽 | 狠狠操操| 99久久综合狠狠综合久久 | 国产视频久久 | 91亚州| 日韩一二三| 亚洲欧美婷婷六月色综合 | 人人澡人人澡人人 | 亚洲电影黄色 | 日本中文乱码卡一卡二新区 | 精品久久久久久久久久 | 亚洲人成网站精品片在线观看 | 九九爱免费视频在线观看 | 久在线观看| 久草在线免费色站 | 成人a毛片 | 中文字幕高清视频 | 亚洲午夜电影网 | 夜夜操天天干 | 在线免费国产视频 | 日韩在线视频网站 | 激情影院在线 | 欧美精品久久久久久久久久 | 911香蕉| 亚洲精品视频中文字幕 | 久久综合狠狠综合久久综合88 | 免费在线成人 | 色噜噜狠狠狠狠色综合久不 | 久久精品一级片 | 国产麻豆精品传媒av国产下载 | 干 操 插 | 九九久久免费 | 天天爱天天射 | 久久99精品久久久久婷婷 | 精品国精品自拍自在线 | 美女久久久久 | 久艹在线观看视频 | 日韩av电影中文字幕在线观看 | 香蕉视频色 | 激情网色 | 亚洲电影久久久 | 菠萝菠萝蜜在线播放 | 欧美日韩国产精品爽爽 | 午夜av日韩 | 精品国产一区二区三区四区vr | 黄色成人在线观看 | 久久一区二区三区国产精品 | 国产亚洲精品无 | 日产av在线播放 | 夜夜操天天干, | av黄色av| 国产精久久久久久妇女av | 福利视频入口 | 色干干 | 成人国产精品电影 | 欧美激情第八页 | 日本九九视频 | 国产精品av免费在线观看 | 精品女同一区二区三区在线观看 | 人人涩| 精品中文字幕在线观看 | 少妇bbw揉bbb欧美 | 天天操天天干天天干 | 日韩电影黄色 | 又紧又大又爽精品一区二区 | va视频在线观看 | 狠狠的日日 | 久久理论影院 | 超碰成人网| 日韩视频免费在线 | 国产精品永久久久久久久www | 99久久久久久国产精品 | 欧美a影视 | 免费看麻豆| 久久在线精品 | 欧美91精品国产自产 | 欧美日韩在线免费观看 | 日韩欧美精品一区二区 | 国产一区在线观看视频 | 国内精品美女在线观看 | 亚洲黄色av一区 | 久草精品视频在线观看 | 黄色的视频 | 韩国av一区 | 亚洲天天在线日亚洲洲精 | 一级性视频 | 久久人人添人人爽添人人88v | 91大神精品视频在线观看 | 91成人免费观看视频 | www久久久| 中文字幕在线免费97 | 激情视频免费观看 | 99视频国产精品免费观看 | 日本久久精品视频 | 欧美成人在线免费 | 欧美精品免费一区二区 | 欧美精品在线免费 | 91久久一区二区 | 黄色免费大片 | 96精品在线 | 国产91九色视频 | 视频在线观看亚洲 | 在线观看视频99 | 久久黄色精品视频 | 国产亚洲精品成人av久久影院 | 国产亚洲精品成人 | 国产成人av福利 | 狠狠狠干狠狠 | 国产色婷婷在线 | 操操碰 | 一区二区三区四区不卡 | 九九影视理伦片 | 中文字幕精品一区 | av电影不卡| 国产精品国产三级国产不产一地 | 免费看的国产视频网站 | 亚洲国产美女精品久久久久∴ | 蜜臀av在线一区二区三区 | 热久久免费视频精品 | 精品9999| 婷婷射五月 | 日韩精品一区二区三区免费观看 | 久久这里只有精品视频首页 | 免费日韩一区二区三区 | 中文字幕在线观看免费高清完整版 | 国产精品一区二区免费视频 | 超碰在线观看97 | 午夜精品久久久久久久久久久久久久 | 亚洲国产一区二区精品专区 | 国产手机视频在线播放 | 亚州精品天堂中文字幕 | 成人在线视频论坛 | 色偷偷88888欧美精品久久 | 久久久久久久国产精品视频 | 国产精品视频区 | 五月婷婷视频在线 | 精品亚洲一区二区 | 亚洲第二色 | 99精品视频在线播放免费 | 麻豆91小视频 | 国内精品亚洲 | japanesefreesexvideo高潮 | 久久视频| 国产玖玖精品视频 | 美腿丝袜av| 久久久免费看视频 | 天天射夜夜爽 | 激情久久综合网 | 天天草天天干天天射 | 国产成人亚洲精品自产在线 | 久久亚洲婷婷 | 免费三级大片 | 日韩二区三区在线 | 午夜国产一区二区 | 免费亚洲一区二区 | 久久福利精品 | 成人久久久久久久久久 | 丁香婷婷激情 | 成人午夜影院在线观看 | av不卡中文字幕 | 中文高清av | 欧美色图另类 | 欧美极品一区二区三区 | 狠狠干狠狠操 | 免费a网址 | 免费观看91视频大全 | 91人人干| 国产精品欧美一区二区 | 亚洲永久精品在线观看 | 成人毛片一区二区三区 | 欧美激情在线网站 | 波多在线视频 | 久久久久免费 | 国产精品久久久久永久免费观看 | 成人久久18免费网站图片 | 二区三区中文字幕 | 青草视频在线看 | 久久不见久久见免费影院 | 日韩欧美v | 日韩欧美一区二区在线播放 | 不卡av免费在线观看 | 中文字幕 国产视频 | 国产h在线观看 | 久久一区二区三区四区 | 黄色网www | 亚洲aⅴ免费在线观看 | 日本中文字幕久久 | 一区二区三区四区影院 | 波多野结衣视频一区二区三区 | 日本三级在线观看中文字 | 国产精品99久久久久的智能播放 | 欧美做受高潮1 | 91久久奴性调教 | 亚洲国产日韩一区 | 婷婷色视频 | 日韩中文字幕在线不卡 | 国产偷国产偷亚洲清高 | 在线天堂日本 | 日本二区三区在线 | 福利视频| 日本午夜在线亚洲.国产 | 久草在线资源网 | 国产精品一区二区在线 | 视频国产| 久久99久久99免费视频 | 91久久国产露脸精品国产闺蜜 | 日韩免费看视频 | 婷婷色资源 | 六月婷色 | 免费a视频 | 啪嗒啪嗒免费观看完整版 | 欧美日韩一区二区三区在线免费观看 | 亚洲va欧美va人人爽 | 国产黄色特级片 | 久久福利 | 美女久久 | 色a在线观看 | 亚州激情视频 | 日本在线h| 91精品久久久久久 | 91精品视屏 | 在线不卡的av| 91试看| 91精品国产99久久久久久红楼 | 不卡国产在线 | 天天爽夜夜爽人人爽曰av | 国产美女精品 | 日韩一区视频在线 | 91精选在线观看 | 国产黄色视| 国产香蕉视频在线播放 | 国产色中涩 | 福利视频| 超碰久热| 91看片淫黄大片一级在线观看 | av黄色av| 亚洲一区二区三区在线看 | 日韩电影在线观看一区二区 | 伊人狠狠干 | 久久久夜色 | 日韩精品播放 | 最近最新中文字幕视频 | 一区二区精品在线视频 | 91精品国产高清自在线观看 | 国产精品乱码久久久 | 狠狠干五月天 | 99在线播放 | 欧美日韩在线观看不卡 | 日韩v在线 | 丁香婷婷久久久综合精品国产 | 精品国产自在精品国产精野外直播 | 免费能看的av | 中文视频在线看 | 安徽妇搡bbbb搡bbbb | av在线直接看| 久草视频国产 | 欧美看片| 狠狠插天天干 | 国产精品99久久久久久久久 | www.天天操.com| 激情五月五月婷婷 | 四虎永久免费 | 日日操夜夜操狠狠操 | 久久午夜国产精品 | 久久人人爽人人爽人人 | 丁香久久激情 | 国产精品原创av片国产免费 | 日韩免费在线观看视频 | 欧美日韩精品影院 | 久久久久久久久久久高潮一区二区 | 久久天天躁夜夜躁狠狠躁2022 | 中文理论片 | 久久久久久久久久久网 | 久久国产经典 | 91av综合 | 亚洲 欧美 综合 在线 精品 | 日韩最新在线视频 | 亚洲国产手机在线 | a级国产乱理论片在线观看 特级毛片在线观看 | 久久最新| 亚洲精选视频在线 | 99精品国产aⅴ | 免费观看一区二区 | 国产精品久久久久久69 | 人人狠狠综合久久亚洲 | 91香蕉国产在线观看软件 | 欧美性色19p | 亚洲精品视频在线观看免费 | 日韩性网站| 在线观看久久久久久 | av在线激情 | a级片在线播放 | 欧美一级日韩三级 | 欧洲精品亚洲精品 | 亚洲午夜不卡 | 丁香九月婷婷 | 国产精品久久久久av免费 | 免费中文字幕在线观看 | 中文字幕视频播放 | 国产网站在线免费观看 | 久久99国产精品久久 | 在线免费色 | 四虎影视欧美 | 成人黄色小说视频 | 91视频在线国产 | 中文字幕网站视频在线 | 九月婷婷色 | 91香蕉视频 | 精品国产乱码一区二 | 国产精品亚 | 精品播放 | 国产一级片观看 | 国产黄大片在线观看 | 91插插插免费视频 | 久久久美女 | 久久一级电影 | 91成人精品一区在线播放69 | 九色精品免费永久在线 | 九九热有精品 | 久久综合中文字幕 | 欧美精品v国产精品v日韩精品 | 99热这里| www.激情五月.com | 黄色在线观看污 | 中文字幕日韩高清 | 亚洲mv大片欧洲mv大片免费 | 亚洲免费成人 | 日韩欧美在线一区二区 | av一区二区在线观看中文字幕 | 国产精品手机在线 | 天天操比 | 久久99影院 | 国产一级免费av | 婷婷久操 | 久久视频精品在线观看 | 99麻豆久久久国产精品免费 | 毛片网站免费在线观看 | 欧美精品久久久久a | 国产一区二区三区四区在线 | 久久视频这里有精品 | 韩国在线视频一区 | 久久短视频 | www.看片网站 | 日韩二区在线观看 | a黄在线观看 | 少妇性色午夜淫片aaaze | 97超碰人人看 | 狠狠的干狠狠的操 | www.久久成人 | 精品麻豆| 精品久久一区二区 | 久草在线观看资源 | a视频免费看 | 久久深夜福利免费观看 | 久久激情精品 | 九九热精品视频在线播放 | 97人人澡人人添人人爽超碰 | 国产真实精品久久二三区 | 天天爱天天插 | 午夜黄色一级片 | 久久av观看 | 亚洲国产成人高清精品 | 综合色亚洲 | 久久综合九色 | 丁香九月激情 | 人人狠狠| 欧美一级免费黄色片 | 日韩av网站在线播放 | 久久综合九色 | 天天色宗合 | 亚洲影音先锋 | 免费高清在线观看成人 | 欧美日韩在线观看视频 | 97超碰色偷偷 | 国产精品久久久久久爽爽爽 | 久久精品这里精品 | 人人爽影院 | 免费精品国产va自在自线 | 美女性爽视频国产免费app | 97碰在线视频 | 久久97久久97精品免视看 | 日韩在线第一 | 麻豆久久久久久久 | 在线观看完整版免费 | 国产露脸91国语对白 | 日韩精品一区二区在线观看 | 国产精品18videosex性欧美 | 成人免费观看a | 成人黄色小说在线观看 | 免费男女网站 | 免费看网站在线 | 久草在线免费资源 | 精品国产视频在线观看 | 久久久久久久看片 | 日韩专区视频 | 午夜影院一级片 | 青青看片 | 亚洲精品国偷自产在线99热 | 婷婷香蕉 | 亚洲国产成人在线播放 | 久久夜夜爽 | 中文字幕精品一区二区三区电影 | 97超碰超碰久久福利超碰 | 国产精品成人在线 | 国产乱码精品一区二区三区介绍 | 色a在线观看 | www日 | 久久伊人色综合 | 日韩中文在线视频 | 国产无遮挡又黄又爽在线观看 | 中文资源在线官网 | 人人干人人爽 | 欧美一级视频免费看 | 青春草免费在线视频 | 黄色的片子 | 在线播放 日韩专区 | 免费在线观看av电影 | 亚洲伦理一区 | 337p日本欧洲亚洲大胆裸体艺术 | 999久久a精品合区久久久 | 97看片| 国产精品免费一区二区三区 | 欧美成年人在线视频 | 99精品视频在线看 | 九九色视频 | 久久手机免费观看 | 久久99精品一区二区三区三区 | www.久久视频 | 91精品视频在线观看免费 | 色噜噜在线观看视频 | 日本精品视频免费 | 天天操天天操天天操天天操天天操天天操 | 亚洲 中文 在线 精品 | 亚洲免费在线观看视频 | 黄色小说视频网站 | 在线观看黄色的网站 | 麻豆影视在线观看 | 黄色特级片 | 区一区二区三在线观看 | 中日韩在线视频 | 91av国产视频| 天天激情在线 | 亚洲国产精品女人久久久 | 亚洲在线 | 91福利专区| 国产又粗又猛又黄又爽的视频 | 香蕉视频最新网址 | 伊甸园永久入口www 99热 精品在线 | 欧美成人精品欧美一级乱黄 | 国产精品福利无圣光在线一区 | 婷婷深爱五月 | 97超碰免费在线观看 | 草莓视频在线观看免费观看 | 国产在线观看h | 成人一区二区三区中文字幕 | 日韩mv欧美mv国产精品 | 久久亚洲二区 | 中文字幕91| 国产一区视频在线播放 | 天天射天天爽 | 91综合在线| 婷婷丁香九月 | 国产精品免费在线观看视频 | 国产黄色特级片 | 欧美另类性 | 一区二区精品在线视频 | 成年人免费在线观看网站 | 亚洲午夜久久久久久久久电影网 | 中文av一区二区 | 欧美一级在线 | 69精品久久 | 激情综合中文娱乐网 | 免费看v片网站 | 成人精品福利 | 久久久污 | 久久久久久久久久久网站 | 国产一区在线视频观看 | 国产色小视频 | 免费在线观看成人小视频 | 精品视频一区在线观看 | 黄色一级免费电影 | 绯色av一区 | 日韩一二区在线观看 | 国产精品对白一区二区三区 | 国产精品私人影院 | 国产高清日韩 | 亚洲精品视频在线观看网站 | 精品久久毛片 | 99在线视频网站 | 免费看高清毛片 | 蜜臀av一区二区 | 久久视频国产精品免费视频在线 | 毛片在线播放网址 | 日韩视频免费观看高清完整版在线 | 欧美一区二视频在线免费观看 | 玖玖玖精品 | 91禁在线观看 | 黄色av影院 | 亚洲午夜av久久乱码 | 久草在线一免费新视频 | 日韩在线观看网站 | 日韩精品中文字幕在线 | 天天干天天天天 | 国产在线精品福利 | 碰超在线 | 国产免费成人av | 男女全黄一级一级高潮免费看 | 国产91精品看黄网站在线观看动漫 | 69av国产| 久久精品视频网站 | www中文在线| www.大网伊人| 欧美人体xx | 伊人久久一区 | 久久视频二区 | 亚洲精品久久久蜜桃直播 | 91麻豆精品国产自产在线 | 中文av字幕在线观看 | 日韩av二区 | 欧美一区二区三区不卡 | 成片免费观看视频999 | 手机版av在线 | 九九久久国产精品 | 成年人在线免费看 | 亚洲国产精品第一区二区 | 久久精品一区二区三区中文字幕 | 欧美视频在线二区 | 久久久香蕉视频 | 四虎国产精 | 在线国产视频一区 | 婷婷色五 | 特黄特色特刺激视频免费播放 | 国产女做a爱免费视频 | 精品国产免费久久 | 狠狠色丁香久久婷婷综合丁香 | 成人网色 | 国产高清区 | 国产精品一区免费看8c0m | 精品国产1区 | 99热精品国产一区二区在线观看 | 色偷偷网站视频 | 久草在线资源免费 | 伊人久久精品久久亚洲一区 | 国产成人久久精品一区二区三区 | 国内一级片在线观看 | 懂色av懂色av粉嫩av分享吧 | 美女久久久 | 8x成人在线| 91av视频在线播放 | 久久蜜臀一区二区三区av | 在线视频 影院 | 国产精品免费视频一区二区 | 婷婷精品国产一区二区三区日韩 | 国产小视频在线观看免费 | 在线国产专区 | 97在线播放视频 | 男女免费视频观看 | 黄色软件视频网站 | 中文字幕在线国产精品 | 久久精品免费电影 | 在线中文字幕电影 | 国产 欧美 在线 | av一区二区三区在线观看 | av网站有哪些 | 精品一二三四视频 | 国产视频精选在线 | 日韩超碰| 色综合人人 | 免费精品国产va自在自线 | 亚洲激情影院 | 亚洲欧美国产精品 | 麻豆视频国产在线观看 | 久久久精品网站 | 国产99久久精品一区二区永久免费 | 色综合在| 一级一片免费观看 | 一区二区三区www | 色妞色视频一区二区三区四区 | 不卡中文字幕在线 | 日韩r级电影在线观看 | 中文字幕在线视频一区二区 | 日韩在线播放av | 国产日韩精品一区二区在线观看播放 | 久久这里只有精品23 | 久久99视频免费 | 少妇性aaaaaaaaa视频 | 69视频国产 | 丁香六月久久综合狠狠色 | 国产一区不卡在线 | 中文日韩在线 | 亚洲伦理一区二区 | 操久久网| 黄av资源 | 91色吧| 欧美日韩另类视频 | www色综合 | 一二区精品 | 狠狠狠干 | 亚洲精品免费播放 | 在线免费亚洲 | 97伊人网| 国产麻豆剧果冻传媒视频播放量 | 一区免费观看 | 日产乱码一二三区别在线 | 2019免费中文字幕 | 91人人澡人人爽人人精品 | 99精品免费视频 | 亚洲影视九九影院在线观看 | 亚洲视频在线观看网站 | 在线观看免费av网站 | 麻豆视频在线观看免费 | 国产黄网站在线观看 | 日本免费久久高清视频 | 91中文字幕在线播放 | 亚洲综合最新在线 | 午夜男人影院 | 中文字幕电影高清在线观看 | 99久久精品午夜一区二区小说 | 欧美日韩国产伦理 | 日韩av在线高清 | 日韩久久精品一区二区 | 成片免费观看视频999 | 欧美精品免费视频 | 精品亚洲va在线va天堂资源站 | 国产成人在线免费观看 | 国产一区二区在线观看免费 | 国产精品嫩草在线 | 久久蜜臀一区二区三区av | 女人高潮一级片 | a级国产乱理论片在线观看 伊人宗合网 | 久久成年人视频 | 久久综合婷婷综合 | 日韩精品高清不卡 | 国产一区二区三区在线免费观看 | 2021国产在线视频 | 欧美 日韩 国产 中文字幕 | 在线观看完整版免费 | 在线观看日韩精品视频 | 久久高清免费 | 成人精品国产免费网站 | av电影免费 | 午夜久久久久久久 | 五月婷婷综合久久 | 午夜三级毛片 | 五月婷婷欧美视频 | 亚洲另类xxxx | 久久久91精品国产一区二区三区 | 久久躁日日躁aaaaxxxx | 操操操日日 | 丁香午夜 | 亚洲一区二区三区四区精品 | 国产黄色观看 | 亚洲国产免费av | 国产丝袜在线 | 成人在线视频一区 | 99视频在线观看视频 | av在线com | 91重口视频 | av在线直接看 | 91成人在线看 | 91成人精品国产刺激国语对白 | 99久久精品国产系列 | 国产高清在线免费视频 | 免费在线观看视频a | 欧美精品乱码久久久久久按摩 | 亚洲精品乱码久久久久久蜜桃动漫 | 一区二区精品在线 | 日日综合网 | 亚洲 成人 一区 | 97在线观看免费高清完整版在线观看 | 欧美精品国产综合久久 | 福利视频第一页 | 欧美一级裸体视频 | 欧美a在线看| 超碰97公开 | 国产精品每日更新 | 国产一区二区中文字幕 | 玖玖在线视频观看 | www黄色软件 | 黄色一区二区在线观看 | 天天草天天干天天射 | 欧美analxxxx | 黄色成年 | 91精品一区二区三区蜜臀 | 中文字幕在线观看视频免费 | 国产免费观看高清完整版 | 深爱婷婷激情 | 婷婷亚洲综合五月天小说 | 亚洲综合精品在线 | 国产在线观看午夜 | 99在线精品视频观看 | 日本中文字幕免费观看 | 亚洲综合精品视频 | 久热电影 | 九七在线视频 | 国产成人久久av | 天堂资源在线观看视频 | 97免费在线视频 | 欧美成人91 | 狠狠躁18三区二区一区ai明星 | www.久艹 | a天堂最新版中文在线地址 久久99久久精品国产 | 国产成人av一区二区三区在线观看 | 狂野欧美激情性xxxx | 国产无遮挡猛进猛出免费软件 | 美女网站免费福利视频 | 深夜福利视频在线观看 | 国产视频二区三区 | 国产视频欧美视频 | 视频福利在线 | 毛片在线播放网址 | 黄色网免费 | 国产精品美女久久久久久久 | 久久视奸 | 国产精品一二三 | av资源在线观看 | 在线观看亚洲a | www.久久视频 | 欧美国产91 | 欧美日韩中文字幕在线视频 | 99精品视频免费 | 欧美国产一区二区 | 免费观看丰满少妇做爰 | 国产三级精品三级在线观看 | 国产在线观看你懂得 | 婷婷丁香色 | 免费的国产精品 | 国产中文字幕视频在线观看 | a级片韩国 | 天天色播 | 高清久久久久久 | 日韩大片在线观看 | 高清中文字幕 | 欧美最新大片在线看 | 激情欧美一区二区免费视频 | 成人av影视观看 | 五月婷婷在线综合 | 欧美人操人| 久久电影网站中文字幕 | 91尤物在线播放 | 在线成人短视频 | 久久艹国产视频 | 天天干天天干天天色 | 日韩精品免费一区二区 | 国产馆在线播放 | 国产亚洲精品美女久久 | 欧美国产91 | 日韩高清一区在线 | 久久伊人色综合 | 国产91影院 | 国产精品久久久久久久久久直播 | 激情av资源网 | 999国内精品永久免费视频 | 96av在线视频 | 久久久99精品免费观看app | 国产精品 国内视频 | 亚洲最大在线视频 | a视频免费 | 欧美日韩国产一区 | 免费无遮挡动漫网站 | 91视频在线国产 | 激情欧美xxxx| 国产探花在线看 | 久操中文字幕在线观看 | 国产精品永久在线 | 国产综合婷婷 | 欧美成人在线免费 | 天天操狠狠干 | 在线日韩亚洲 | www.com在线观看 | 亚洲永久精品一区 | 97视频免费在线看 | 黄在线免费观看 | 99精品区 | 亚洲首页 | 字幕网在线观看 | 亚洲电影在线看 | 最新国产在线视频 | 久久精品久久精品久久 | 日韩精品短视频 | 午夜色影院 | 亚洲精品无 | 热re99久久精品国产66热 | 97狠狠操 | 精品一区二区亚洲 | 色网站在线免费观看 | 91九色精品女同系列 | 日韩久久一区 | 在线观看av黄色 | 国产日韩视频在线观看 | www色片 | 懂色av懂色av粉嫩av分享吧 | 天天天天天干 | 在线观看黄网站 | 亚洲精品久久久久www | 中文字幕在线观 | 亚洲 欧洲 国产 精品 | 国产综合在线观看视频 | 天天天操操操 | 欧美成人在线免费观看 | 在线你懂| 在线播放日韩av | 国产一级片在线播放 | 97国产一区 | 91色综合 | 亚洲午夜精品电影 | 精品日韩在线一区 | 五月在线| 亚洲日本欧美 | 在线观看免费av网 | www在线观看视频 | 69国产在线观看 | 中文亚洲欧美日韩 | 手机看片| 五月天六月色 | 在线免费观看麻豆 | 日韩欧美一区二区在线播放 | 超碰久热| 丁香六月久久综合狠狠色 | 日韩精品免费一区二区三区 | 久久99精品国产麻豆婷婷 | 久久国产剧场电影 | 九热精品 | a视频在线观看免费 | 国产视频69 | av官网| 国产高清一区二区 | 99热99re6国产在线播放 | 日本三级久久久 | 美女黄色网在线播放 | 亚洲伦理电影在线 | 精品在线一区二区三区 | 国产系列 在线观看 | 成人久久18免费网站麻豆 | 成人av电影在线播放 | 人人干在线观看 | 精品天堂av| 婷婷日日 | 日本在线中文 | 色爱成人网 | 亚洲午夜精品久久久久久久久久久久 | 国产精品久久久久久久久毛片 | 国产精品高潮在线观看 | 999久久久久| 丝袜一区在线 | 啪啪精品 | 国产精品剧情 | 亚洲www天堂com | 欧美日韩一二三四区 | 在线看黄色的网站 | 中文字幕 欧美性 | 日韩三级视频在线观看 | 日本在线中文在线 | 亚洲综合色网站 | 91在线色 | 国产在线观看二区 | 日产中文字幕 | 九九色综合| 一区二区三区中文字幕在线 | 精品国产一区二区三区男人吃奶 | 最近免费中文字幕mv在线视频3 | 国产午夜在线观看视频 | 中文字幕日本特黄aa毛片 | 精品成人a区在线观看 | 在线观看蜜桃视频 | 色偷偷88888欧美精品久久 | 免费性网站 | 欧洲色吧 | 国产视频一区二区在线 | 午夜视频久久久 | 成在线播放 | 欧美一区二区三区在线视频观看 | 免费高清国产 | 国产精品video | 日日干天天爽 | 久草在线一免费新视频 | 久久精品9 | 欧美一级电影在线观看 | 久久午夜精品 | 国产一级免费观看视频 | 美女天天操 | 激情五月六月婷婷 | 日本动漫做毛片一区二区 | 97视频播放 | 久久久久久久久久久福利 |