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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > Android >内容正文

Android

Android开机速度优化(第三篇)

發(fā)布時(shí)間:2023/12/14 Android 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Android开机速度优化(第三篇) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

參考地址:https://www.jianshu.com/p/6dba42c022a9

問題描述

開機(jī)時(shí)間相對(duì)參考機(jī)過慢,大約慢15s左右。Android 系統(tǒng)7.0。

問題分析

開機(jī)問題涉及的層次較多,大致有bootloader-->kernel-->Zygote-->PMS-->AMS-->Launcher
可以借助bootchart來分析,也可以直接通過log分析。不幸的是本項(xiàng)目機(jī)器因未知原因?qū)е聼o(wú)法抓取到bootchart。
幸好在我瀏覽源碼時(shí)發(fā)現(xiàn)了一個(gè)神器perfboot工具。具體在system/core/init/perfboot.py。
運(yùn)行該命令需要在源碼編譯環(huán)境下。詳細(xì)請(qǐng)參考源碼文件,此處不做過多介紹。
使用命令:
./perfboot.py --iterations=5 --interval=30 -v --output=/data/My_Doc/Performance/Bugs/bootup_op_4200151/J5D_UE.tsv
獲取問題機(jī)與參考機(jī)的開機(jī)數(shù)據(jù)。生成下圖

參考機(jī)vs問題機(jī)

上圖X軸是開機(jī)啟動(dòng)過程中的一些重要節(jié)點(diǎn)。Y軸是開機(jī)時(shí)間。
詳細(xì)說明下X軸上各個(gè)節(jié)點(diǎn)表征的含義。

|boot_progress_start|系統(tǒng)進(jìn)入用戶空間,標(biāo)志著kernel啟動(dòng)完成,本例中可以看出kernel啟動(dòng)耗時(shí)30s左右
|:---
|boot_progress_preload_start|Zygote啟動(dòng)
|boot_progress_preload_end|Zygote結(jié)束
|boot_progress_system_run|SystemServer ready,開始啟動(dòng)Android系統(tǒng)服務(wù),如PMS,APMS等
|boot_progress_pms_start|PMS開始掃描安裝的應(yīng)用
|boot_progress_pms_system_scan_start|PMS先行掃描/system目錄下的安裝包
|boot_progress_pms_data_scan_start|PMS掃描/data目錄下的安裝包
|boot_progress_pms_scan_end|PMS掃描結(jié)束
|boot_progress_pms_ready|PMS就緒
|boot_progress_ams_ready|AMS就緒
|boot_progress_enable_screen|AMS啟動(dòng)完成后開始激活屏幕,從此以后屏幕才能響應(yīng)用戶的觸摸,它在WindowManagerService發(fā)出退出開機(jī)動(dòng)畫的時(shí)間節(jié)點(diǎn)之前,而真正退出開機(jī)動(dòng)畫還會(huì)花費(fèi)少許時(shí)間,具體依賴animation zip 包中的desc.txt。wm_boot_animation_done才是用戶感知到的動(dòng)畫結(jié)束時(shí)間節(jié)點(diǎn)
|sf_stop_bootanim|SF設(shè)置service.bootanim.exit屬性值為1,標(biāo)志系統(tǒng)要結(jié)束開機(jī)動(dòng)畫了,可以用來跟蹤開機(jī)動(dòng)畫結(jié)尾部分消耗的時(shí)間
|wm_boot_animation_done|開機(jī)動(dòng)畫結(jié)束,這一步用戶能直觀感受到開機(jī)結(jié)束
通過上圖可以直觀的看到問題機(jī)在進(jìn)入boot_progress_start節(jié)點(diǎn)之前相對(duì)參考機(jī)耗時(shí)較多。而這之前主要涉及bootloader和kernel。

bootloader 優(yōu)化

這一塊沒有接觸過,交給底層同事優(yōu)化。大概說下抓取log的方式.

adb shell cat /proc/bootmsg > bootmsg.txt.

從log里底層同事發(fā)現(xiàn)是bootimg簽名有問題,更詳細(xì)的分析,自己對(duì)這塊真心不懂,總結(jié)不出幫助性的意見。

kernel層優(yōu)化

kernel的優(yōu)化先check一遍config的配置,kernel中config的配置種類繁多,就算是工作幾年的kernel工程師也不一定能清楚每一個(gè)config值的作用。Android提供了一個(gè)基礎(chǔ)配置表。
可以用腳本:kernel/scripts/kconfig/merge_config.sh來生成一份config文件。具體用法戳這
拿生成的config文件和當(dāng)前項(xiàng)目中的config做對(duì)比,同時(shí)也對(duì)比參考機(jī)的config文件。對(duì)比的時(shí)候可以用一個(gè)現(xiàn)成的工具kernel/scripts/diffconfig來比較。
綜合比較后的結(jié)果,本地一點(diǎn)點(diǎn)調(diào)試,查找資料。最終去掉了如下config:

CONFIG_MTD_TESTS=m ----> m改為n CONFIG_SERIAL_MSM_HSL=y ----> y改為n CONFIG_SERIAL_MSM_HSL_CONSOLE=y ----> y改為n CONFIG_MMC_BLOCK_TEST=m ---->注釋掉 CONFIG_MMC_TEST=m ---->注釋掉 CONFIG_SERIAL_MSM_HSL=y ----> y改為n CONFIG_SERIAL_MSM_HSL_CONSOLE=y ----> y改為n CONFIG_MSM_SMD_DEBUG=y ---->注釋掉 CONFIG_CGROUP_DEBUG=y ---->注釋掉 CONFIG_RELAY=y ---->注釋掉 CONFIG_RMNET_DATA_DEBUG_PKT=y ---->注釋掉 CONFIG_DEBUG_GPIO=y ---->注釋掉 CONFIG_CORESIGHT=y ---->注釋掉 CONFIG_CORESIGHT_EVENT=y ---->注釋掉 CONFIG_CORESIGHT_FUSE=y ---->注釋掉 CONFIG_CORESIGHT_CTI=y ---->注釋掉 CONFIG_CORESIGHT_TMC=y ---->注釋掉 CONFIG_CORESIGHT_TPIU=y ---->注釋掉 CONFIG_CORESIGHT_FUNNEL=y ---->注釋掉 CONFIG_CORESIGHT_REPLICATOR=y ---->注釋掉 CONFIG_CORESIGHT_STM=y ---->注釋掉 CONFIG_CORESIGHT_HWEVENT=y ---->注釋掉 CONFIG_DEBUG_MEMORY_INIT=y ---->注釋掉 CONFIG_DYNAMIC_DEBUG=y ---->注釋掉 //以下也全部注釋掉 CONFIG_SCHED_DEBUG CONFIG_DEBUG_KMEMLEAK CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE=400 CONFIG_DEBUG_KMEMLEAK_DEFAULT_OFF CONFIG_DEBUG_SPINLOCK CONFIG_DEBUG_MUTEXES CONFIG_DEBUG_ATOMIC_SLEEP CONFIG_DEBUG_STACK_USAGE CONFIG_DEBUG_LIST CONFIG_FAULT_INJECTION_DEBUG_FS CONFIG_LOCKUP_DETECTOR CONFIG_DEBUG_PAGEALLOC CONFIG_PAGE_POISONING CONFIG_RMNET_DATA_DEBUG_PKT CONFIG_MMC_PERF_PROFILING CONFIG_DEBUG_BUS_VOTER CONFIG_SLUB_DEBUG CONFIG_DEBUG_BUGVERBOSE CONFIG_ALLOC_BUFFERS_IN_4K_CHUNK CONFIG_SERIAL_CORE CONFIG_SERIAL_CORE_CONSOLE CONFIG_SERIAL_MSM_HSL CONFIG_SERIAL_MSM_HSL_CONSOLE CONFIG_MSM_TZ_LOG CONFIG_DYNAMIC_DEBUG

這里說下config的配置有y,n,m,m表示編譯成模塊,不編譯進(jìn)內(nèi)核。不配置的話相當(dāng)于n。
CONFIG_DEBUG_INFO 不能去掉, 會(huì)引起CTS不過。由于config的的各項(xiàng)值可能散落在kernel的不同文件中,我們可以單獨(dú)編譯下kernel,然后去out目錄下查看obj/KERNEL_OBJ/.config 文件,這里面的配置項(xiàng)是完全的。

kernel關(guān)閉掉一些debug開關(guān)后。在新版本上復(fù)測(cè)結(jié)果如下:

優(yōu)化lk和kernel后

這里提下如何看kernel的log,
開機(jī)后用命令:adb shell dmesg > dmesg.txt抓取Log
log里面搜關(guān)鍵字"Bootloader start count"-->LK 啟動(dòng)
“Bootloader end count”-->LK 結(jié)束
"Kernel MPM timestamp"-->bootloader運(yùn)行完成

通過對(duì)bootloader和kernel的優(yōu)化,直接減少了14s左右的開機(jī)時(shí)間,可以看到優(yōu)化的效果還是比較明顯的。

frameworks層優(yōu)化

用命令: adb logcat -b events|grep boot我們過濾出啟動(dòng)階段的主要事件。

01-01 13:38:52.139 391 391 I boot_progress_start: 15452 01-01 13:38:53.329 391 391 I boot_progress_preload_start: 16641 01-01 13:38:56.675 391 391 I boot_progress_preload_end: 19989 01-01 13:38:57.020 1729 1729 I boot_progress_system_run: 20333 01-01 13:38:57.824 1729 1729 I boot_progress_pms_start: 21137 01-01 13:38:58.865 1729 1729 I boot_progress_pms_system_scan_start: 22179 01-01 13:39:08.852 1729 1729 I boot_progress_pms_data_scan_start: 32166 01-01 13:39:08.907 1729 1729 I boot_progress_pms_scan_end: 32221 01-01 13:39:10.109 1729 1729 I boot_progress_pms_ready: 33422 01-01 13:39:12.557 1729 1729 I boot_progress_ams_ready: 35871 01-01 13:39:15.189 1729 1782 I boot_progress_enable_screen: 38503 01-01 13:39:17.973 290 321 I sf_stop_bootanim: 41287 01-01 13:39:18.887 1729 1961 I wm_boot_animation_done: 42201

結(jié)合對(duì)比圖看,boot_progress_enable_screen之前問題機(jī)跟對(duì)比機(jī)各個(gè)節(jié)點(diǎn)耗時(shí)相差不大。在這里說明下,Android M上啟動(dòng)階段到boot_progress_enable_screen就結(jié)束了,而Android N上還多了sf_stop_bootanim和wm_boot_animation_done兩個(gè)事件。這也就是圖-優(yōu)化kernel后棕紅色的線條到boot_progress_enable_screen就沒有延生的原因,因?yàn)樗硎镜膮⒖紮C(jī),而參考機(jī)正好是Android M系統(tǒng)。
從log的時(shí)間戳可以看出:
boot_progress_enable_screen--->花費(fèi)2s左右的時(shí)間到達(dá)sf_stop_bootanim--->花費(fèi)1s多時(shí)間到達(dá)wm_boot_animation_done。多出來的兩個(gè)過程總共多花接近4s的時(shí)間。
我們要重點(diǎn)看下這個(gè)過程發(fā)生了什么,為什么會(huì)多出來這近4s時(shí)間。

1.先看下boot_progress_enable_screen出現(xiàn)的位置。
它在frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

void enableScreenAfterBoot() {EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_ENABLE_SCREEN,SystemClock.uptimeMillis());mWindowManager.enableScreenAfterBoot();synchronized (this) {updateEventDispatchingLocked();} }

2.sf_stop_bootanim出現(xiàn)的位置。
它在frameworks/native/services/surfaceflinger/SurfaceFlinger_hwc1.cpp。
這里特別說明下SurfaceFlinger_hwc1.cpp是SurfaceFlinger.cpp的升級(jí)版,它支持HWC 2.0,使用的是SurfaceFlinger.cpp還是SurfaceFlinger_hwc1.cpp跟平臺(tái)選擇相關(guān)。

void SurfaceFlinger::bootFinished() {...// stop boot animation// formerly we would just kill the process, but we now ask it to exit so it// can choose where to stop the animation.property_set("service.bootanim.exit", "1");const int LOGTAG_SF_STOP_BOOTANIM = 60110;LOG_EVENT_LONG(LOGTAG_SF_STOP_BOOTANIM,ns2ms(systemTime(SYSTEM_TIME_MONOTONIC))); }

3.wm_boot_animation_done出現(xiàn)的位置。
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

public void performEnableScreen() {...// Don't enable the screen until all existing windows have been drawn.if (!mForceDisplayEnabled && checkWaitingForWindowsLocked()) {return;}if (!mBootAnimationStopped) {// Do this one time.Trace.asyncTraceBegin(Trace.TRACE_TAG_WINDOW_MANAGER, "Stop bootanim", 0);try {IBinder surfaceFlinger = ServiceManager.getService("SurfaceFlinger");if (surfaceFlinger != null) {//Slog.i(TAG_WM, "******* TELLING SURFACE FLINGER WE ARE BOOTED!");Parcel data = Parcel.obtain();data.writeInterfaceToken("android.ui.ISurfaceComposer");surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, // BOOT_FINISHEDdata, null, 0);data.recycle();}} catch (RemoteException ex) {Slog.e(TAG_WM, "Boot completed: SurfaceFlinger is dead!");}mBootAnimationStopped = true;}if (!mForceDisplayEnabled && !checkBootAnimationCompleteLocked()) {if (DEBUG_BOOT) Slog.i(TAG_WM, "performEnableScreen: Waiting for anim complete");return;}...EventLog.writeEvent(EventLogTags.WM_BOOT_ANIMATION_DONE, SystemClock.uptimeMillis());... }

找到了3個(gè)節(jié)點(diǎn)出現(xiàn)的位置,現(xiàn)在再來分析如何將這3個(gè)節(jié)點(diǎn)串聯(lián)起來。
1-->2過程: AMS的enableScreenAfterBoot調(diào)用WMS的enableScreenAfterBoot方法,在WMS中的enableScreenAfterBoot會(huì)繼續(xù)調(diào)用內(nèi)部方法performEnableScreen,該方法內(nèi)部判斷開機(jī)動(dòng)畫如果沒有停止,就調(diào)用SurfaceFlinger去停止開機(jī)動(dòng)畫

surfaceFlinger.transact(IBinder.FIRST_CALL_TRANSACTION, // BOOT_FINISHEDdata, null, 0);

這里的FIRST_CALL_TRANSACTION實(shí)際上就是BOOT_FINISHED。
frameworks/native/include/gui/ISurfaceComposer.h

class BnSurfaceComposer: public BnInterface<ISurfaceComposer> { public:enum {// Note: BOOT_FINISHED must remain this value, it is called from// Java by ActivityManagerService.BOOT_FINISHED = IBinder::FIRST_CALL_TRANSACTION,

surfaceFlinger.transact發(fā)出的調(diào)用請(qǐng)求會(huì)被ISurfaceComposer處理。
frameworks/native/libs/gui/ISurfaceComposer.cpp

status_t BnSurfaceComposer::onTransact(uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) {...switch(code) {case BOOT_FINISHED: {CHECK_INTERFACE(ISurfaceComposer, data, reply);bootFinished();return NO_ERROR;}}... }

這里的bootFinished就是SurfaceFlinger_hwc1.cpp定義的bootFinished()方法,最終來到了第2個(gè)節(jié)點(diǎn)sf_stop_bootanim。
為了驗(yàn)證上述調(diào)用過程,我們添加上打印調(diào)用棧的log看看輸出。

void SurfaceFlinger::bootFinished() {const nsecs_t now = systemTime();const nsecs_t duration = now - mBootTime;ALOGI("Boot is finished (%ld ms)", long(ns2ms(duration)) );mBootFinished = true;android::CallStack stack;stack.update();stack.log("azhengye", ANDROID_LOG_DEBUG, " ");String8 strtemp = stack.toString("");ALOGD("Sunny\t%s", strtemp.string()); } --------------------------------------------------------------------------------- 04-28 12:41:15.978 308 2956 D azhengye: #00 pc 0002b761 /system/lib/libsurfaceflinger.so 04-28 12:41:15.978 308 2956 D azhengye: #01 pc 00045c9f /system/lib/libgui.so 04-28 12:41:15.978 308 2956 D azhengye: #02 pc 000310cf /system/lib/libsurfaceflinger.so 04-28 12:41:15.978 308 2956 D azhengye: #03 pc 000359b3 /system/lib/libbinder.so 04-28 12:41:15.979 308 2956 D azhengye: #04 pc 0003d159 /system/lib/libbinder.so 04-28 12:41:15.979 308 2956 D azhengye: #05 pc 0003cdb7 /system/lib/libbinder.so 04-28 12:41:15.979 308 2956 D azhengye: #06 pc 0003d2bb /system/lib/libbinder.so 04-28 12:41:15.979 308 2956 D azhengye: #07 pc 0004f5f5 /system/lib/libbinder.so 04-28 12:41:15.979 308 2956 D azhengye: #08 pc 0000e349 /system/lib/libutils.so 04-28 12:41:15.979 308 2956 D azhengye: #09 pc 000473d3 /system/lib/libc.so 04-28 12:41:15.979 308 2956 D azhengye: #10 pc 0001a0c9 /system/lib/libc.so --------------------------------------------------------------------------------- SurfaceFlinger_hwc1.cpp:312 android::SurfaceFlinger::bootFinished() ISurfaceComposer.cpp:371 android::BnSurfaceComposer::onTransact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int) SurfaceFlinger_hwc1.cpp:3103 android::SurfaceFlinger::onTransact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int) Binder.cpp:126 android::BBinder::transact(unsigned int, android::Parcel const&, android::Parcel*, unsigned int) IPCThreadState.cpp:1111 android::IPCThreadState::executeCommand(int) IPCThreadState.cpp:445 android::IPCThreadState::getAndExecuteCommand() IPCThreadState.cpp:513 android::IPCThreadState::joinThreadPool(bool) ProcessState.cpp:63 (discriminator 1)android::PoolThread::threadLoop() Threads.cpp:751 android::Thread::_threadLoop(void*) pthread_create.cpp:198 (discriminator 1)__pthread_start(void*) clone.cpp:41 (discriminator 1)__start_thread

上述log也印證了之前的分析,至此1-->2的過程算是通了。在來看2-->3過程,在3節(jié)點(diǎn)出現(xiàn)之前還有一次判斷:

if (!mForceDisplayEnabled && !checkBootAnimationCompleteLocked()) {if (DEBUG_BOOT) Slog.i(TAG_WM, "performEnableScreen: Waiting for anim complete");return; }

這里系統(tǒng)需要去檢測(cè)開機(jī)動(dòng)畫是否還在播放,

private boolean checkBootAnimationCompleteLocked() {if (SystemService.isRunning(BOOT_ANIMATION_SERVICE)) {mH.removeMessages(H.CHECK_IF_BOOT_ANIMATION_FINISHED);mH.sendEmptyMessageDelayed(H.CHECK_IF_BOOT_ANIMATION_FINISHED,BOOT_ANIMATION_POLL_INTERVAL);return false;}return true; }

BOOT_ANIMATION_SERVICE是在初始化SurfaceFlinger時(shí)啟動(dòng)的。
frameworks/native/services/surfaceflinger/SurfaceFlinger_hwc1.cpp

void SurfaceFlinger::init() {...// start boot animationstartBootAnim(); }

順藤摸瓜來到了BootAnimation,前面分析過在SurfaceFlinger的bootFinished方法中將"service.bootanim.exit"置為了1,這個(gè)設(shè)置在BootAnimation就被讀取了。
frameworks/base/cmds/bootanimation/BootAnimation.cpp

... #define EXIT_PROP_NAME "service.bootanim.exit" ... void BootAnimation::checkExit() {// Allow surface flinger to gracefully request shutdownchar value[PROPERTY_VALUE_MAX];property_get(EXIT_PROP_NAME, value, "0");int exitnow = atoi(value);if (exitnow) {requestExit();if (mAudioPlayer != NULL) {mAudioPlayer->requestExit();}} }

跟蹤到這2-->3過程也就通暢了。在理清了該過程的調(diào)用邏輯后,問題也浮出了水面。原來之前的同事在解決一個(gè)開機(jī)進(jìn)桌面出現(xiàn)黑屏問題時(shí),在checkExit內(nèi)部人為delay了幾秒的時(shí)間...

在排查log時(shí)還發(fā)現(xiàn)下面的錯(cuò)誤:

01-01 15:55:23.506 1865 1865 E BitmapFactory: Unable to decode stream: java.io.FileNotFoundException: /data/system/users/0/wallpaper_orig (No such file or directory)

adb shell 進(jìn)入手機(jī)發(fā)現(xiàn)確實(shí)沒有/data/system/users/0/wallpaper_orig文件。
會(huì)不會(huì)是是wallpaper異常導(dǎo)致消耗時(shí)間多余呢?
為了清晰debug在過濾下log

adb logcat -b all|grep -E "Wallpaper may change|haveWall|sf_stop_bootanim|boot_progress_enable_screen"

輸出如下log:

01-02 12:13:03.814 1851 2082 V WindowManager: Wallpaper may change! Adjusting 01-02 12:13:04.865 1851 2082 V WindowManager: Wallpaper may change! Adjusting 01-02 12:13:06.986 1851 2006 I boot_progress_enable_screen: 40388 01-02 12:13:06.988 1851 2082 V WindowManager: Wallpaper may change! Adjusting 01-02 12:13:07.052 1851 2006 I WindowManager: ******** booted=true msg=false haveBoot=false haveApp=false haveWall=false wallEnabled=true haveKeyguard=true 01-02 12:13:07.056 1851 2082 I WindowManager: ******** booted=true msg=false haveBoot=false haveApp=false haveWall=false wallEnabled=true haveKeyguard=true 01-02 12:13:07.184 1851 2082 I WindowManager: ******** booted=true msg=false haveBoot=false haveApp=false haveWall=false wallEnabled=true haveKeyguard=true 01-02 12:13:08.049 1851 2082 V WindowManager: Wallpaper may change! Adjusting 01-02 12:13:08.066 1851 2082 I WindowManager: ******** booted=true msg=false haveBoot=false haveApp=false haveWall=false wallEnabled=true haveKeyguard=true 01-02 12:13:08.067 1851 2082 I WindowManager: ******** booted=true msg=false haveBoot=false haveApp=false haveWall=false wallEnabled=true haveKeyguard=true 01-02 12:13:08.071 1851 2082 I WindowManager: ******** booted=true msg=false haveBoot=false haveApp=false haveWall=false wallEnabled=true haveKeyguard=true 01-02 12:13:08.072 1851 2082 I WindowManager: ******** booted=true msg=false haveBoot=false haveApp=false haveWall=false wallEnabled=true haveKeyguard=true 01-02 12:13:08.076 1851 2082 I WindowManager: ******** booted=true msg=false haveBoot=false haveApp=false haveWall=false wallEnabled=true haveKeyguard=true 01-02 12:13:09.894 1851 2082 V WindowManager: Wallpaper may change! Adjusting 01-02 12:13:09.908 1851 3413 V WindowManager: Wallpaper may change! Adjusting 01-02 12:13:10.178 1851 2082 I WindowManager: ******** booted=true msg=false haveBoot=false haveApp=false haveWall=true wallEnabled=true haveKeyguard=true 01-02 12:13:10.186 292 3736 I sf_stop_bootanim: 43587 01-02 12:13:10.191 1851 2082 I WindowManager: ******** booted=true msg=false haveBoot=false haveApp=false haveWall=true wallEnabled=true haveKeyguard=true 01-02 12:13:10.196 1851 2082 I WindowManager: ******** booted=true msg=false haveBoot=false haveApp=false haveWall=true wallEnabled=true haveKeyguard=true 01-02 12:13:10.397 1851 2082 I WindowManager: ******** booted=true msg=false haveBoot=false haveApp=false haveWall=true wallEnabled=true haveKeyguard=true

然后在做實(shí)驗(yàn)push一個(gè)wallpaper_orig到指定目錄,BitmapFactory的錯(cuò)誤雖然不見了。然而對(duì)于縮短時(shí)間并沒有什么卵用。
看來不是這個(gè)異常沒有拖慢開機(jī)速度。但我注意到

01-02 12:13:10.178 1851 2082 I WindowManager: ******** booted=true msg=false haveBoot=false haveApp=false haveWall=true wallEnabled=true haveKeyguard=true 01-02 12:13:10.186 292 3736 I sf_stop_bootanim: 43587

這段log中haveWall=true之前一直都是haveWall=false,haveWall表示系統(tǒng)Window已經(jīng)成功加載好了Wallpaper。Log中不斷的輸出
WindowManager: Wallpaper may change! Adjusting
這里究竟為什么Wallpaper會(huì)不斷的Adjusting呢?看起來一旦Wallpaper調(diào)整好就會(huì)將haveWall置true。
追蹤了下該句log在代碼中的位置:
frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

private boolean checkWaitingForWindowsLocked() {//省略無(wú)關(guān)代碼if (DEBUG_SCREEN_ON || DEBUG_BOOT) {Slog.i(TAG_WM, "******** booted=" + mSystemBooted + " msg=" + mShowingBootMessages+ " haveBoot=" + haveBootMsg + " haveApp=" + haveApp+ " haveWall=" + haveWallpaper + " wallEnabled=" + wallpaperEnabled+ " haveKeyguard=" + haveKeyguard);}// If we are turning on the screen to show the boot message,// don't do it until the boot message is actually displayed.if (!mSystemBooted && !haveBootMsg) {return true;}// If we are turning on the screen after the boot is completed// normally, don't do so until we have the application and// wallpaper.if (mSystemBooted && ((!haveApp && !haveKeyguard) ||(wallpaperEnabled && !haveWallpaper))) {return true;}return false;}

這個(gè)checkWaitingForWindowsLocked表示是否需要等待系統(tǒng)Windows就緒。被同在WindowManagerService類中的performEnableScreen方法調(diào)用

public void performEnableScreen() {// Don't enable the screen until all existing windows have been drawn.if (!mForceDisplayEnabled && checkWaitingForWindowsLocked()) {return;} }

從注釋看performEnableScreen執(zhí)行的是激活屏幕動(dòng)作,然而在此之前需要等待系統(tǒng)必要的windows已經(jīng)被畫好了,也就是說我屏幕一旦激活了,繪制好的windows就能馬上顯示出來。否則performEnableScreen直接就退出了。
而performEnableScreen又是被同在WindowManagerService類中enableScreenAfterBoot方法調(diào)用。大致的調(diào)用過程如下:
AMS打印出boot_progress_enable_screen---->調(diào)用WMS的enableScreenAfterBoot--->調(diào)用WMS的performEnableScreen--->調(diào)用WMS的checkWaitingForWindowsLocked檢查是否可以Enable Screen,因?yàn)閃allpaper沒有準(zhǔn)備好,因此checkWaitingForWindowsLocked返回了true,進(jìn)而導(dǎo)致performEnableScreen直接返回,沒有去執(zhí)行本來要做的Enable Screen動(dòng)作。

WindowManager: Wallpaper may change! Adjusting
是在下面的code打印出來的。
frameworks/base/services/core/java/com/android/server/wm/WindowSurfacePlacer.java

// "Something has changed! Let's make it correct now." private void performSurfacePlacementInner(boolean recoveringMemory) {//省略無(wú)關(guān)代碼if (mWallpaperMayChange) {if (DEBUG_WALLPAPER_LIGHT)Slog.v(TAG, "Wallpaper may change! Adjusting");defaultDisplay.pendingLayoutChanges |= FINISH_LAYOUT_REDO_WALLPAPER;if (DEBUG_LAYOUT_REPEATS) debugLayoutRepeats("WallpaperMayChange",defaultDisplay.pendingLayoutChanges);}//省略無(wú)關(guān)代碼 }

debug調(diào)用棧如下:

1-01 21:18:30.572 2912 2962 W System.err: java.lang.Exception: print stack 01-01 21:18:30.573 2912 2962 W System.err: at com.android.server.wm.WindowManagerService.checkWaitingForWindowsLocked(WindowManagerService.java:5841) 01-01 21:18:30.574 2912 2962 W System.err: at com.android.server.wm.WindowManagerService.performEnableScreen(WindowManagerService.java:5905) 01-01 21:18:30.575 2912 2962 W System.err: at com.android.server.wm.WindowManagerService$H.handleMessage(WindowManagerService.java:8390) 01-01 21:18:30.576 2912 2962 W System.err: at android.os.Handler.dispatchMessage(Handler.java:102) 01-01 21:18:30.577 2912 2962 W System.err: at android.os.Looper.loop(Looper.java:154) 01-01 21:18:30.578 2912 2962 W System.err: at android.os.HandlerThread.run(HandlerThread.java:61) 01-01 21:18:30.578 2912 2962 W System.err: at com.android.server.ServiceThread.run(ServiceThread.java:46)

這塊沒有檢查出多余的操作,沒繼續(xù)check了。
經(jīng)過以上分析后修改代碼,最終問題機(jī)的開機(jī)速度達(dá)到了參考機(jī)的標(biāo)準(zhǔn)。性能問題是一個(gè)持續(xù)挖掘改善的過程,開機(jī)過程中還能優(yōu)化的地方肯定還有。

debug 技術(shù)說明

匯總下分析該問題時(shí),匯集的一些debug技術(shù)。

  • java代碼中打印堆棧 Slog.d("azhengye", "Stack=="+new RuntimeException("azhengye debug").fillInStackTrace());
    或者new Exception("print stack").printStackTrace(); 然后log中搜索"System.err:"

  • c++ debug: 為了在native查看函數(shù)調(diào)用棧可以在需要的地方添加如下代碼。
    #include <utils/CallStack.h>
    android::CallStack stack;
    stack.update();
    String8 strtemp = stack.toString("");
    ALOGD("\t%s", strtemp.string());
    過濾出的log還需要用arm-linux-androideabi-addr2line轉(zhuǎn)行下,好在有現(xiàn)成的腳本幫我們做這件事,這里一并貼出來。

#!/usr/bin/python # stack symbol parser import os import string import sys ANDROID_TARGET_OUT = os.getcwd()+"/" # addr2line tool path and symbol path addr2line_tool = 'arm-linux-androideabi-addr2line' symbol_dir = ANDROID_TARGET_OUT + '/symbols' symbol_bin = symbol_dir + '/system/bin/' symbol_lib = symbol_dir + '/system/lib/' class ReadLog: def __init__(self,filename): self.logname = filename def parse(self): f = file(self.logname,'r') lines = f.readlines() if lines != []: print 'read file ok' else: print 'read file failed' result =[] for line in lines: if line.find('stack') != -1: print 'stop search' break elif line.find('system') != -1: #print 'find one item' + line result.append(line) return result class ParseContent: def __init__(self,addr,lib): self.address = addr # pc address self.exename = lib # executable or shared library def addr2line(self): cmd = addr2line_tool + " -C -f -s -e " + symbol_dir + self.exename + " " + self.address #print cmd stream = os.popen(cmd) lines = stream.readlines(); list = map(string.strip,lines) return list inputarg = sys.argv if len(inputarg) < 2: print 'Please input panic log' exit() filename = inputarg[1] readlog = ReadLog(filename) inputlist = readlog.parse() for item in inputlist: itemsplit = item.split() test = ParseContent(itemsplit[-2],itemsplit[-1]) list = test.addr2line() print "%-30s%s" % (list[1],list[0])

在源碼編譯的imge文件夾下執(zhí)行上面的腳本,調(diào)試 SF 的bootFinished就用的該腳本,下面是個(gè)輸出例子。

01-02 01:38:13.305 477 3072 D azhengye : #00 pc 000059b9 /system/bin/bootanimation 01-02 01:38:13.305 477 3072 D azhengye : #01 pc 00006515 /system/bin/bootanimation 01-02 01:38:13.305 477 3072 D azhengye : #02 pc 0000591f /system/bin/bootanimation 01-02 01:38:13.305 477 3072 D azhengye : #03 pc 000054f1 /system/bin/bootanimation 01-02 01:38:13.305 477 3072 D azhengye : #04 pc 0000e349 /system/lib/libutils.so 01-02 01:38:13.305 477 3072 D azhengye : #05 pc 000473d3 /system/lib/libc.so 01-02 01:38:13.305 477 3072 D azhengye : #06 pc 0001a0c9 /system/lib/libc.so ------------------------------------------------------------------------------------ python panic.py /data/My_Doc/Performance/boot_c_log read file ok BootAnimation.cpp:534 android::BootAnimation::checkExit() BootAnimation.cpp:972 android::BootAnimation::playAnimation(android::BootAnimation::Animation const&) BootAnimation.cpp:870 android::BootAnimation::movie() BootAnimation.cpp:452 android::BootAnimation::threadLoop() Threads.cpp:751 android::Thread::_threadLoop(void*) pthread_create.cpp:198 (discriminator 1)__pthread_start(void*) clone.cpp:41 (discriminator 1)__start_thread
  • 堆棧dump

    adb shell kill -3 <pid>

輸出的trace會(huì)保存在 /data/anr/traces.txt文件中。這個(gè)需要注意,如果沒有 /data/anr/這個(gè)目錄 或/data/anr/traces.txt這個(gè)文件,需要手工創(chuàng)建一下,并設(shè)置好讀寫權(quán)限。如果是native thread的堆棧打印,可能需要修改dalvik/vm/Thread.cpp的dumpNativeThread方法。

  • debuggerd coredump 這個(gè)是開始分析問題查資料找到的debug方法,不過自己沒有實(shí)踐,僅作記錄參考。
    debuggerd是android的一個(gè)daemon進(jìn)程,負(fù)責(zé)在進(jìn)程異常出錯(cuò)時(shí),將進(jìn)程的運(yùn)行時(shí)信息dump出來供分析。debuggerd生成的coredump數(shù)據(jù)是以文本形式呈現(xiàn),被保存在 /data/tombstone/ 目錄下,它可以在不中斷進(jìn)程執(zhí)行的情況下打印當(dāng)前進(jìn)程的native堆棧。使用方法是:

debuggerd -b <pid>

這可以協(xié)助我們分析進(jìn)程執(zhí)行行為,也可以用來定位native進(jìn)程中鎖死或錯(cuò)誤邏輯引起的死循環(huán)的代碼位置。

總結(jié)

各家廠商都會(huì)定制不同的開機(jī)行為,因此沒有一個(gè)固定的方法能fix所有的開機(jī)問題,但通過本文我們總結(jié)分析該類問題的套路,那就是關(guān)注boot階段的各個(gè)event事件,先量化出開機(jī)慢在哪里,然后在去針對(duì)性的優(yōu)化。
源碼真的是個(gè)寶庫(kù),多讀吧。



作者:小草凡
鏈接:https://www.jianshu.com/p/6dba42c022a9
來源:簡(jiǎn)書
簡(jiǎn)書著作權(quán)歸作者所有,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處。

總結(jié)

以上是生活随笔為你收集整理的Android开机速度优化(第三篇)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

午夜色性片 | 亚洲成熟女人毛片在线 | 精品理论片| 国产精品成人一区 | 免费观看一级特黄欧美大片 | 天天操天天玩 | 欧美日韩精品免费观看视频 | 欧美激情va永久在线播放 | 欧美日韩一区二区三区在线观看视频 | 成人在线免费视频观看 | 免费看黄电影 | 伊人精品影院 | 日韩午夜在线 | 麻豆国产网站 | 日本最大色倩网站www | 日本xxxxav| 亚洲国产精品激情在线观看 | 999久久国产 | 91在线最新 | 久草资源在线观看 | 久久久www| 久久久久久久久久久久电影 | 亚洲国产wwwccc36天堂 | 精品亚洲成人 | 一区二区精品在线视频 | 国产精品一区二区视频 | 在线a视频免费观看 | 亚洲国产精品va在线看黑人 | 亚洲最新av在线网站 | ,午夜性刺激免费看视频 | 91精品视频免费 | 中文字幕在线播放日韩 | 欧美美女一级片 | 国产精品久久久久婷婷 | 国产精品18久久久久久首页狼 | 国产色久 | 国产精品美女视频 | 少妇搡bbbb搡bbb搡忠贞 | 免费看黄的| 九月婷婷色 | 草久久影院 | 日韩欧美69 | av在线电影网站 | 国产在线视频在线观看 | 丁香六月国产 | 久久久九色精品国产一区二区三区 | 四虎影视精品成人 | 免费视频 你懂的 | 国产亚洲精品久久久久久网站 | 欧美男男激情videos | 国产 欧美 日本 | 91九色国产在线 | 免费看三片| www.av中文字幕.com | 狠狠干网 | 亚洲永久av| 久久久久免费精品国产小说色大师 | 欧美精品久久久久久久久老牛影院 | 国产精品黄网站在线观看 | 久久丁香| 五月花激情 | 97超碰国产在线 | 国产一级在线免费观看 | 98精品国产自产在线观看 | 黄色aaa级片 | 成人高清av在线 | 国产69久久久欧美一级 | 天堂av最新网址 | 免费a视频 | 五月天电影免费在线观看一区 | 天天操天天操天天操天天 | 97在线观看免费高清完整版在线观看 | 日韩在线视频一区二区三区 | 一区二区三区四区精品 | 51精品国自产在线 | 亚洲精品在线观看视频 | 国产不卡在线视频 | www.色婷婷| 久久人人爽视频 | 国产69精品久久久久久久久久 | 欧美一级电影免费观看 | 中文乱码视频在线观看 | 欧美一级日韩三级 | 中文字幕一区二区三区在线观看 | 免费a网站 | 精品视频999| 在线午夜电影神马影院 | 最新极品jizzhd欧美 | 国产精品videoxxxx | 日韩在线大片 | 国产精品观看 | 久草在线观看视频免费 | 在线观看日韩国产 | 日韩电影在线观看一区二区三区 | 男女拍拍免费视频 | 日韩精品资源 | 999在线视频 | 色综合久久久网 | 国产xx在线 | 奇米网在线观看 | 欧美激情片在线观看 | 国产在线国偷精品产拍 | 免费av片在线 | av在线播放观看 | 久久影视网 | 最新久久免费视频 | 久久久精品午夜 | 亚洲v精品 | 在线观看中文字幕网站 | 日韩中文免费视频 | 欧美另类一二三四区 | 久久综合久久综合久久综合 | 成人小视频在线播放 | 99久久久久国产精品免费 | 97超视频 | 久久免费中文视频 | 久久99国产精品久久99 | 天天干天天插伊人网 | 婷婷国产在线 | 国产专区视频在线 | 五月婷婷导航 | 精品伊人久久久 | 99热这里有精品 | 超碰在线1 | 亚洲免费视频观看 | 在线国产一区二区三区 | 欧洲一区精品 | 免费观看91视频大全 | 一级α片 | 天天操天天色综合 | 欧洲视频一区 | 国产资源网 | 三级免费黄 | 国产在线999| 超级碰碰碰碰 | 香蕉视频久久 | 91片黄在线观 | 日本午夜在线观看 | 免费日韩av片 | 9在线观看免费高清完整 | 91久久久久久国产精品 | 欧美大荫蒂xxx | 中文字幕有码在线播放 | 最近中文字幕视频网 | 久久久久久久久久伊人 | www.看片网站 | 国产黄色大片免费看 | 色www精品视频在线观看 | 亚洲欧美日韩在线一区二区 | 日韩视频免费观看高清完整版在线 | 国产香蕉久久精品综合网 | 啪啪肉肉污av国网站 | 欧美精品二区 | 国产中文字幕在线播放 | 婷色在线 | 久久久久久久久久久久久久免费看 | 国产香蕉97碰碰久久人人 | 欧美性直播| 黄视频网站大全 | 国产黄a三级 | 一区二区三区四区五区在线视频 | 欧美在线一级片 | 丝袜美腿在线视频 | 成人亚洲精品国产www | 91传媒91久久久 | 亚洲午夜精品久久久久久久久 | 欧美日韩国产欧美 | 九九九九色 | 亚洲一区美女视频在线观看免费 | 久草视频在线免费看 | 在线观看一区二区视频 | 日本少妇高清做爰视频 | 色综合久久88色综合天天人守婷 | 91大神精品视频在线观看 | 91高清免费在线观看 | 中文字幕制服丝袜av久久 | 91香蕉亚洲精品 | 91亚洲激情| 亚洲乱码中文字幕综合 | 日韩在线中文字幕 | 99精品视频免费 | 在线日本v二区不卡 | 91精品啪 | 在线小视频你懂得 | 中文字幕丝袜美腿 | 天天激情站 | 免费网站在线观看人 | 久久综合欧美 | 成人黄色在线 | 伊人婷婷久久 | 国产亚洲精品综合一区91 | 日韩精品一区二区三区水蜜桃 | 国产成人精品一区二区三区在线 | 国产精品综合久久久久久 | 亚洲午夜精品在线观看 | 免费观看mv大片高清 | 黄色大片国产 | 亚洲激情av | 日韩电影一区二区三区在线观看 | 日本韩国精品一区二区在线观看 | 中文字幕日韩在线播放 | 久久婷婷综合激情 | 日本资源中文字幕在线 | 中文字幕视频播放 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 欧美日韩国产精品一区 | 国产综合精品一区二区三区 | 蜜桃av人人夜夜澡人人爽 | 尤物97国产精品久久精品国产 | 国产专区视频在线观看 | 97超碰人人模人人人爽人人爱 | 激情五月婷婷网 | 黄色的视频 | 久久综合婷婷国产二区高清 | 久久理论电影 | 中文字幕在线播放视频 | 天天操综合网站 | 狠狠狠色丁香婷婷综合久久88 | 国产午夜精品理论片在线 | 成人免费观看大片 | 久久伦理 | 黄色软件在线观看 | 天天干天天怕 | 国产99久久久久 | 91亚洲成人 | 91一区啪爱嗯打偷拍欧美 | 国产一级视屏 | 亚洲日韩中文字幕在线播放 | 国内外成人在线 | 日韩视频www | 国产精品欧美久久久久久 | 婷婷去俺也去六月色 | 精品视频区 | 久久久片 | 999成人网| 日日草av| 色在线亚洲 | 日本精品久久久久中文字幕5 | 国产精品一区二区免费看 | 黄色1级毛片 | 97色婷婷 | 人人澡人| 日韩欧美视频在线观看免费 | 欧美成人h版在线观看 | 中文字幕 国产精品 | 日日干天夜夜 | 丁香六月综合网 | 草久中文字幕 | 国产高清第一页 | 黄色精品一区 | 国产一区精品在线观看 | 91av蜜桃 | 亚洲综合在 | 国产主播大尺度精品福利免费 | 久久露脸国产精品 | 久久久久高清毛片一级 | 青青网视频| 免费久久网站 | 久久精品综合一区 | 色婷婷午夜 | 日日日天天天 | 在线 日韩 av| 免费三级黄色片 | 久久精品播放 | 久精品在线| 国产精品免费久久久久久久久久中文 | 午夜精品一二三区 | 国产精品久久久久久久久久久久午夜片 | 久久国产a | 亚洲精品视频在线免费播放 | 午夜精品久久久久99热app | 国产精品久久久久久69 | 久久久久麻豆 | 最近2019好看的中文字幕免费 | 日韩一区二区三区观看 | 亚洲视频免费在线 | 亚洲最新视频在线播放 | 97av.com| 色综合天天色综合 | 九九在线高清精品视频 | 91 中文字幕| 有码视频在线观看 | 成人一区二区三区在线 | 国内精品久久久久影院日本资源 | 亚洲精品乱码白浆高清久久久久久 | 九9热这里真品2 | 国产录像在线观看 | 国产免码va在线观看免费 | 久久久网 | 精品国产伦一区二区三区观看方式 | 激情综合网在线观看 | 欧美91av| 免费在线观看一区二区三区 | 免费又黄又爽 | 日韩激情视频在线观看 | 亚洲无人区小视频 | 成年人精品 | 成人小视频在线 | 看污网站 | 国产91对白在线 | 国产99久久| 成人av资源在线 | 亚洲性xxxx| 中文字幕在线观看完整 | 最近中文字幕在线 | 四虎影视国产精品免费久久 | 国产一级91 | 亚洲欧美va | 中文字幕高清av | 国产亚洲片| 亚洲欧美一区二区三区孕妇写真 | 国产精品资源在线观看 | 国产一级免费观看 | 黄色官网在线观看 | 中文字幕欧美激情 | 久草精品视频 | 婷婷丁香视频 | 欧美 日韩 性 | 中文亚洲欧美日韩 | 天天干天天干天天干 | 日日爱夜夜爱 | www,黄视频| 一区在线播放 | 国产91免费在线观看 | 日韩视频免费在线 | 久久免费视频播放 | 激情久久婷婷 | 国产生活一级片 | 激情视频久久 | 精品欧美一区二区三区久久久 | 日韩午夜av电影 | 天天干天天摸 | 亚洲成年人免费网站 | www.夜夜夜 | 在线激情网 | 国产精品日韩在线播放 | 在线视频精品 | 午夜免费在线观看 | 久久黄色免费观看 | 在线黄色国产电影 | 日韩中文字幕免费在线播放 | 精品伊人久久久 | 18做爰免费视频网站 | 又黄又爽又无遮挡免费的网站 | 永久免费av在线播放 | 99热在线观看 | 精品国产欧美一区二区三区不卡 | 丁香5月婷婷| 久久久久免费精品国产 | 香蕉在线视频观看 | 国产在线观看高清视频 | 精品一区二区三区电影 | 欧美综合色在线图区 | 欧美夫妻生活视频 | 韩国一区二区av | 麻豆成人网 | 日韩特黄av| 在线观看午夜 | 99久久er热在这里只有精品15 | 久久中文网 | 亚洲情感电影大片 | 国产精品视频资源 | 久久精品中文字幕 | 国产黄色精品视频 | 亚洲精品综合一二三区在线观看 | 国产在线不卡 | 国产日韩欧美在线免费观看 | 国产福利一区二区三区视频 | 欧美乱大交 | 91av视频免费观看 | 亚洲综合色激情五月 | 日韩精品在线观看av | 日韩免费看 | 色综合五月天 | 干天天| 五月激情站 | 国产黄色大片 | 99精品视频在线观看播放 | 国产免费又粗又猛又爽 | 一级特黄av| 国产精品九色 | 欧美精品久久久久久久久久久 | 欧洲在线免费视频 | 成人午夜剧场在线观看 | 久久精品成人热国产成 | 成人在线视频你懂的 | 天天se天天cao天天干 | 一级黄色毛片 | 日韩精品一区二区三区三炮视频 | 丁香久久婷婷 | 天天鲁天天干天天射 | 91爱爱视频 | 二区三区精品 | 午夜色大片在线观看 | 91视频a| 欧美国产日韩在线视频 | 亚洲禁18久人片 | 999久久久久久久久久久 | 欧美日韩一区二区视频在线观看 | 激情久久综合 | 中文字幕免费在线 | 婷婷开心久久网 | 中文字幕观看在线 | 九色最新网址 | 丝袜少妇在线 | 国产久视频| 国产91免费在线 | 亚洲成人av片在线观看 | 亚洲黄色区 | 国产精品女同一区二区三区久久夜 | 97在线视频网站 | 亚洲深夜影院 | 激情五月婷婷综合 | 日韩免费视频线观看 | 伊人激情网 | 日韩女同一区二区三区在线观看 | 91插插插网站 | 欧美精品三级在线观看 | 精品久久久久久久久亚洲 | 丝袜美腿一区 | 高清在线观看av | 国产专区在线视频 | 国产成人av | 精品久久久久一区二区国产 | 免费国产亚洲视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产一级片播放 | 99热这里只有精品在线观看 | 亚洲欧美视频在线播放 | 西西444www高清大胆 | 日韩理论视频 | 久久久久久久免费观看 | av电影一区 | 91黄在线看 | 一区二区视频在线播放 | 精品高清视频 | 麻豆视频在线免费看 | 黄色网址国产 | 九九九热精品免费视频观看网站 | 天天射天天| 国产69久久久 | 日韩在线播放视频 | 男女精品久久 | 米奇影视7777| 激情婷婷在线 | 久久成| 操操操日日日干干干 | 国产日产欧美在线观看 | 99精品免费在线观看 | 日日插日日干 | 亚洲精品乱码久久久久久蜜桃动漫 | 日韩videos | 97在线免费观看视频 | 欧美日韩另类在线观看 | 久久激情视频 | 国产中文在线播放 | 免费视频网 | 欧美日韩精品综合 | 日韩精品极品视频 | 91香蕉视频黄色 | 久久久久 免费视频 | 国产一区二区在线免费观看 | 久久99在线观看 | 九九色视频 | 三级免费黄 | 91豆花在线| 日本在线视频网址 | 日韩在线免费不卡 | 久久图 | 婷婷丁香六月天 | 青青河边草免费 | 久久九精品 | 欧美 日韩 国产 成人 在线 | 天天操天天操天天操天天操天天操 | 五月黄色 | 91视视频在线直接观看在线看网页在线看 | 国产精品视频最多的网站 | av免费福利 | 婷婷网在线 | 国产日韩精品在线观看 | 成人亚洲精品国产www | 午夜电影久久久 | 欧美午夜精品久久久久 | 久久深夜 | 国产一级视频在线观看 | 久久久久久久久久久免费 | 97免费在线视频 | 六月婷色 | 激情视频一区二区三区 | 国产色区 | 国产精品网红福利 | 日本韩国欧美在线观看 | 欧美日韩中字 | 中文字幕av一区二区三区四区 | 欧美高清视频不卡网 | 片网站| 免费高清在线视频一区· | 欧美aaaxxxx做受视频 | 成人免费电影 | 色五月激情五月 | 欧美一级片在线免费观看 | 在线观看mv的中文字幕网站 | 99久久精品免费视频 | 久久久www成人免费精品 | 亚洲黄色a| 久久夜视频 | a天堂免费 | 亚洲第一区在线播放 | 亚洲成av人片一区二区梦乃 | 久久99热精品这里久久精品 | 伊人婷婷色| 狠狠躁夜夜躁人人爽超碰97香蕉 | 日本最大色倩网站www | 97精品国产97久久久久久免费 | 人人爽人人爽人人爽学生一级 | 久久成视频 | 黄网站app在线观看免费视频 | 黄色高清视频在线观看 | 中文字幕中文字幕 | 国产精品网址在线观看 | a天堂一码二码专区 | 国产免费一区二区三区最新 | 午夜手机电影 | 99精品国产一区二区三区麻豆 | 美女搞黄国产视频网站 | 正在播放 久久 | 三级黄色网络 | 黄网站免费看 | 国模视频一区二区 | 五月天亚洲激情 | av中文字幕网站 | 丁香花在线观看视频在线 | 日韩 在线观看 | 亚洲欧美综合精品久久成人 | 亚洲精品福利在线观看 | 一二区精品 | 国产一区二区观看 | 久久婷婷视频 | 在线看污网站 | 人人爽人人爽人人爽人人爽 | 又黄又色又爽 | av大全在线看 | 亚洲天堂网在线视频观看 | 国产小视频免费观看 | 日韩综合色 | 色吊丝av中文字幕 | 深爱综合网| 天天综合色天天综合 | 国产精品黄色影片导航在线观看 | 日韩av网站在线播放 | 亚洲精品456在线播放第一页 | 久久综合导航 | 国产手机在线 | 日韩电影在线一区 | 欧美-第1页-屁屁影院 | 999免费视频 | 国产亚洲精品免费 | 国产精品 中文字幕 亚洲 欧美 | 国产成人精品免高潮在线观看 | 免费国产ww| 成年人av在线播放 | 男女男视频 | 成人黄色av免费在线观看 | 五月婷婷视频在线观看 | 午夜视频免费在线观看 | 欧美特一级 | 欧美黑人xxxx猛性大交 | 亚洲爽爽网 | 奇米导航| 欧美成人xxx | 精品自拍sae8—视频 | 中文在线最新版天堂 | 人人精品久久 | 91插插影库 | 日韩中文字幕免费视频 | 欧美日韩精品免费观看 | 中文字幕一区二区三区精华液 | 午夜久久久精品 | 久久人人爽人人爽人人片 | 蜜桃传媒一区二区 | 国产亚洲资源 | 日韩av不卡在线观看 | 国产精品久久久久久一二三四五 | av中文国产 | 日韩欧三级 | 亚洲精品国产区 | 97电影院网 | 麻豆系列在线观看 | 在线播放日韩av | 九九免费在线观看视频 | 亚洲综合视频网 | 我要色综合天天 | 黄色网大全 | 国产不卡视频 | 久久久久久久99精品免费观看 | 免费色网| 黄色小说免费观看 | 97视频在线观看免费 | 久久国产免费视频 | 丁香电影小说免费视频观看 | 911国产精品 | 97碰在线视频 | 婷婷色资源 | www国产一区 | 九九视频一区 | 国内精品久久久 | 亚洲天堂精品视频在线观看 | 久草五月| 黄色视屏在线免费观看 | 亚州精品天堂中文字幕 | 久久综合国产伦精品免费 | 狠狠狠色丁香婷婷综合久久五月 | 日韩精品免费在线观看视频 | 久久尤物电影视频在线观看 | 亚洲一区二区三区精品在线观看 | 免费福利在线观看 | 国产精品一二 | 久久艹艹| 色爱成人网 | 亚洲天堂精品视频 | www.夜色.com | 婷婷六月天天 | 午夜国产福利在线 | 欧美性色综合网 | 手机看片中文字幕 | 在线免费黄色片 | 天天爱天天草 | 五月婷婷导航 | 久草免费福利在线观看 | 干av在线| 麻豆久久精品 | 国产精品免费视频网站 | 精品久久五月天 | 国产成人精品免高潮在线观看 | 亚洲男女精品 | 91丨九色丨国产在线观看 | 久久呀 | 久久综合99 | 久久人网 | 亚洲久草网 | 五月婷婷影院 | 成年人视频在线免费 | 国产福利91精品张津瑜 | 亚洲精品视频在线观看网站 | 亚洲国产精品影院 | 亚洲97在线 | 国产精品久久久毛片 | 江苏妇搡bbbb搡bbbb | 黄色app网站在线观看 | 麻豆国产精品永久免费视频 | 国产精品精品久久久久久 | 免费国产亚洲视频 | 精品在线一区二区三区 | www成人av| 97色在线视频 | 91视频三区 | 日韩在线第一区 | 婷婷丁香九月 | 国产免费观看高清完整版 | 在线影院中文字幕 | 91在线操 | 99久久er热在这里只有精品66 | 国产精品一区二区三区四区在线观看 | 精品色综合 | 午夜免费电影院 | 婷婷丁香导航 | 日本电影久久 | 玖玖视频在线 | 国产精品免费在线播放 | 五月婷婷色播 | 天堂av网在线| 夜色资源网 | 欧美日韩国产精品久久 | 亚州免费视频 | 国产高清黄 | 狠狠网亚洲精品 | 天天视频色 | 在线欧美中文字幕 | 在线视频a | 亚洲天天草| 人人精久 | 午夜色性片 | 91经典在线 | 人人爽人人插 | 极品嫩模被强到高潮呻吟91 | 免费av视屏 | 天天搞夜夜骑 | 日韩精品在线看 | 少妇做爰k8经典 | 成人毛片一区二区三区 | 91精品国自产在线观看欧美 | www.久久色| 欧美日韩xxxxx | 久草在线视频新 | 91视频三区| 一区二区三区在线不卡 | 精品国模一区二区 | 在线观看免费成人av | 国产中文字幕亚洲 | 五月激情片 | 黄色国产成人 | 久久视频这里只有精品 | 91麻豆网 | 成人免费看片网址 | 91视频这里只有精品 | 亚洲精品在线观看不卡 | 国产97视频在线 | 日本乱码在线 | 亚洲精色 | 在线欧美国产 | 成人羞羞视频在线观看免费 | 久久福利剧场 | 国产美女视频免费观看的网站 | 91在线观看视频网站 | 欧美视频不卡 | 国产精彩视频一区 | 91视频91蝌蚪 | 国产91在线看 | 久久精品毛片基地 | 国产第一页福利影院 | 99久久精品国产系列 | 日韩在线字幕 | 性色视频在线 | 天天亚洲综合 | 超碰在线99 | 天堂麻豆 | 中文av网站 | av免费在线看网站 | 四虎影视成人精品国库在线观看 | 欧美精品免费在线观看 | 亚洲最新av| 9999在线视频| 97精品在线观看 | 一级黄色片网站 | 亚洲精品国产精品99久久 | 亚洲va欧洲va国产va不卡 | 久久黄色a级片 | 国产不卡免费视频 | 午夜视频在线观看网站 | 色婷婷电影网 | 中文字幕第一页在线播放 | www日日夜夜 | 奇米影视777四色米奇影院 | 亚洲v欧美v国产v在线观看 | 91刺激视频| 久操中文字幕在线观看 | 日本中文乱码卡一卡二新区 | 亚洲综合少妇 | 日韩欧美在线观看一区二区 | 极品中文字幕 | 色视频网址 | 国产精品99久久久久久人免费 | 黄色av一区二区三区 | 精品国产乱码久久久久久久 | 视频一区二区精品 | 亚洲性少妇性猛交wwww乱大交 | 精品免费视频 | 国产在线美女 | 一区二区欧美在线观看 | 香蕉视频在线免费 | 免费日韩三级 | 久草精品视频在线播放 | 美女网站在线看 | 国产黄色精品在线观看 | 欧美人牲| 欧美日韩二区在线 | 在线免费观看黄色小说 | 性色av香蕉一区二区 | 伊人亚洲综合网 | 国产91精品高清一区二区三区 | 日本特黄一级 | 欧美午夜一区二区福利视频 | 伊在线视频 | 2023天天干| 亚洲欧美日韩一区二区三区在线观看 | 在线久草视频 | 国产精品一区二区在线免费观看 | 伊人激情网 | 日韩欧美国产免费播放 | 日韩免费高清在线 | 欧美精品被 | www.伊人色.com | 久久午夜羞羞影院 | 日韩中文字幕在线不卡 | 日韩黄在线观看 | 国产一级在线播放 | 亚洲精品国产精品国自产观看 | 三级av在线播放 | 成人av一区二区三区 | 久草a视频 | 人人干在线 | 亚洲天堂精品视频在线观看 | 欧美性生活久久 | 久久久久国产精品视频 | 日韩精品一区二区免费 | 美女网站黄免费 | 亚洲夜夜网| 91精品啪在线观看国产线免费 | 欧美另类一二三四区 | 国产成人精品一区二区三区福利 | 亚洲激情六月 | 久久精品国产精品亚洲精品 | 久久a v电影| 香蕉视频在线观看免费 | 激情xxxx| 色网站在线免费观看 | 六月丁香婷 | 在线看黄色av | 免费成人短视频 | 在线久久 | 黄色网在线免费观看 | 日韩三级视频 | 欧美不卡视频在线 | 99性视频| a级一a一级在线观看 | 91av在线免费看 | 久久天堂亚洲 | 丁香五香天综合情 | 久久99精品久久久久久清纯直播 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 国产亚洲精品美女久久 | 在线看国产日韩 | 在线观看精品黄av片免费 | 麻豆视频免费在线观看 | 综合久久网站 | 伊人天堂网 | 国产最顶级的黄色片在线免费观看 | www.黄色在线| 国产精品久久久久aaaa九色 | 992tv又爽又黄的免费视频 | 成人午夜片av在线看 | 欧美日韩亚洲在线观看 | av色图天堂网 | 久久精品视 | 免费av网址在线观看 | 日韩r级电影在线观看 | 午夜av影院 | 免费在线色视频 | 人人爽人人爽人人片av | 国产一区免费在线 | 日韩免费在线网站 | 久久久久女人精品毛片 | 精品一区二区视频 | 欧美在线1 | 国产精品99爱 | 日韩精品一区二区在线 | 在线观看中文字幕一区二区 | 日韩高清黄色 | 少妇性aaaaaaaaa视频 | 亚洲精品久久久蜜桃直播 | 激情五月在线观看 | 青青久草在线 | 国产一二三区av | 麻豆小视频在线观看 | 亚洲香蕉在线观看 | 看av免费网站 | 99re久久资源最新地址 | 天天插伊人 | 成人一级免费电影 | 亚洲美女精品 | 99九九视频 | 日韩在线视频不卡 | 免费情缘| 久久久综合 | 成人av.com| 欧洲高潮三级做爰 | 久久99国产精品免费网站 | 在线视频欧美日韩 | 亚洲三级精品 | 久久人人爽人人爽人人 | av电影一区二区三区 | 美女网站视频免费都是黄 | 亚洲国产网址 | 一级欧美一级日韩 | 久久天天躁夜夜躁狠狠85麻豆 | 在线观看av片 | 黄色国产大片 | 久久99国产一区二区三区 | 亚洲人人精品 | av在线h| 在线观看av的网站 | 国产一区二区免费 | 99福利片| 韩日三级在线 | 亚洲午夜久久久久久久久久久 | 99精品在线观看视频 | 久久人人97超碰精品888 | 欧美日韩中文字幕视频 | 亚洲成 人精品 | 久久a国产 | 韩国av三级 | 欧美一二区在线 | 天天干天天干天天干天天干天天干天天干 | 久草免费在线观看视频 | 视频在线一区二区三区 | 人人看黄色 | 午夜视频一区二区 | 成年人国产精品 | 久爱综合 | 国产日韩av在线 | 六月丁香婷婷久久 | 深爱激情久久 | 中文字幕五区 | 97免费中文视频在线观看 | 免费观看性生活大片3 | 国产亚洲久一区二区 | 五月婷婷激情 | 欧美另类性 | 久久夜色精品国产亚洲aⅴ 91chinesexxx | 国产在线久久久 | 国产一区成人在线 | av在线免费观看不卡 | 久久极品 | 亚洲精品综合在线观看 | 操天天操| 亚洲综合色丁香婷婷六月图片 | 中文字幕在线观看视频一区 | 久久在线免费观看视频 | 欧美一区在线观看视频 | 欧美日产一区 | 色成人亚洲网 | 人成午夜视频 | 中文字幕在线看视频国产中文版 | 伊人永久 | 久久激情视频 久久 | 欧美性视频网站 | 天天曰天天射 | 日韩大片免费观看 | 性色av香蕉一区二区 | 成人黄色电影在线 | 中文字幕一区二区三区乱码在线 | 婷婷中文字幕在线观看 | 色香com. | av高清一区二区三区 | 亚洲精品国偷自产在线99热 | 中文字幕电影高清在线观看 | 日韩美精品视频 | 国产精品一区二区三区免费视频 | 黄色大片av | 91视频在线网址 | 在线观看91久久久久久 | www好男人| 精品视频成人 | 国产二区av | 91在线欧美 | 色综合久久88色综合天天6 | 操操操日日日干干干 | 在线探花| 青青河边草免费观看完整版高清 | zzijzzij亚洲成熟少妇 | 国产美女精品视频 | 成人免费在线播放 | 激情五月综合 | 国产福利午夜 | 亚洲精品视频在线观看免费 | 国产黄色片免费观看 | 九九免费在线观看 | 国产免费小视频 | 国产高清视频色在线www | 精品国产一区二区三区av性色 | 国产日韩欧美在线免费观看 | 日本成址在线观看 | 婷婷久操 | 国产精品自拍在线 | 成人小视频在线观看免费 | 91精品国产99久久久久久久 | 99精品美女| 欧美激情精品久久久久久变态 | 色久天| 久久免费高清 | 在线观看精品国产 | 国产免费国产 | 麻豆va一区二区三区久久浪 | 五月婷婷久久综合 | 久草在线网址 | 麻豆视传媒官网免费观看 | 夜夜操狠狠干 | 亚洲美女视频网 | 国产精品美女久久久久久网站 | 四虎国产精品免费 | 久久精品高清视频 | 五月婷婷色播 | 国产精品久久久久久久毛片 | 成人av一级片| 久久国内精品99久久6app | 九色精品免费永久在线 | 午夜黄色| 九九久| 五月天久久精品 | 日韩色爱| 婷婷干五月| 99久久精品久久久久久动态片 | av在线8 | 色婷婷成人网 | 久久亚洲福利视频 | 99久久99| 国产对白av | 午夜12点 |