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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

App性能分析数据监控

發(fā)布時間:2023/11/28 生活经验 66 豆豆
生活随笔 收集整理的這篇文章主要介紹了 App性能分析数据监控 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

App性能分析數據監(jiān)控
APP的性能監(jiān)控包括: CPU 占用率、內存使用情況、網絡狀況監(jiān)控、啟動時閃退、卡頓、FPS、使用時崩潰、耗電量監(jiān)控、流量監(jiān)控等等。
文中所有代碼都已同步到github中,有興趣的可以clone 下來一起探討下。
環(huán)境
Xcode 10.0+
Swift 4.2
1 . CPU 占用率
CPU作為手機的中央處理器,可以說是手機最關鍵的組成部分,所有應用程序都需要它來調度運行,資源有限。所以當APP因設計不當,使 CPU 持續(xù)以高負載運行,將會出現APP卡頓、手機發(fā)熱發(fā)燙、電量消耗過快等等嚴重影響用戶體驗的現象。
因此對應用在CPU 中占用率的監(jiān)控,將變得尤為重要。那么應該如何來獲取CPU的占有率呢?!
都知道,APP在運行的時候,會對應一個Mach Task,而Task下可能有多條線程同時執(zhí)行任務,每個線程都是作為利用CPU的基本單位。所以可以通過獲取當前Mach Task下,所有線程占用 CPU 的情況,來計算APP的 CPU 占用率。
在《OS X and iOS Kernel Programming》是這樣描述 Mach task 的:
任務(task)是一種容器(container)對象,虛擬內存空間和其他資源都是通過這個容器對象管理的,這些資源包括設備和其他句柄。嚴格地說,Mach 的任務并不是其他操作系統中所謂的進程,因為 Mach 作為一個微內核的操作系統,并沒有提供“進程”的邏輯,而只是提供了最基本的實現。不過在 BSD 的模型中,這兩個概念有1:1的簡單映射,每一個 BSD 進程(也就是 OS X 進程)都在底層關聯了一個 Mach 任務對象。

iOS 是基于 Apple Darwin 內核,由kernel 、XNU 和Runtime 組成,而XNU 是Darwin 的內核,它是“X is not UNIX”的縮寫,是一個混合內核,由 Mach 微內核和 BSD 組成。Mach 內核是輕量級的平臺,只能完成操作系統最基本的職責,比如:進程和線程、虛擬內存管理、任務調度、進程通信和消息傳遞機制等。其他的工作,例如文件操作和設備訪問,都由 BSD 層實現。
iOS 的線程技術與Mac OS X類似,也是基于 Mach 線程技術實現的,在 Mach 層中thread_basic_info 結構體封裝了單個線程的基本信息:
struct thread_basic_info {
time_value_t user_time; /* user run time /
time_value_t system_time; /
system run time /
integer_t cpu_usage; /
scaled cpu usage percentage /
policy_t policy; /
scheduling policy in effect /
integer_t run_state; /
run state (see below) /
integer_t flags; /
various flags (see below) /
integer_t suspend_count; /
suspend count for thread /
integer_t sleep_time; /
number of seconds that thread has been sleeping */
}
一個Mach Task包含它的線程列表。內核提供了task_threads API 調用獲取指定 task 的線程列表,然后可以通過thread_info API調用來查詢指定線程的信息,在 thread_act.h 中有相關定義。
task_threads 將target_task 任務中的所有線程保存在act_list 數組中,act_listCnt表示線程個數:
kern_return_t task_threads
(
task_t target_task,
thread_act_array_t *act_list,
mach_msg_type_number_t *act_listCnt
);
thread_info 結構如下:
kern_return_t thread_info
(
thread_act_t target_act,
thread_flavor_t flavor, // 傳入不同的宏定義獲取不同的線程信息
thread_info_t thread_info_out, // 查詢到的線程信息
mach_msg_type_number_t *thread_info_outCnt // 信息的大小
);
所以如下獲取CPU的占有率:
#import “LSLCpuUsage.h”
#import <mach/task.h>
#import <mach/vm_map.h>
#import <mach/mach_init.h>
#import <mach/thread_act.h>
#import <mach/thread_info.h>

@implementation LSLCpuUsage

  • (double)getCpuUsage {
    kern_return_t kr;
    thread_array_t threadList; // 保存當前Mach task的線程列表
    mach_msg_type_number_t threadCount; // 保存當前Mach task的線程個數
    thread_info_data_t threadInfo; // 保存單個線程的信息列表
    mach_msg_type_number_t threadInfoCount; // 保存當前線程的信息列表大小
    thread_basic_info_t threadBasicInfo; // 線程的基本信息

    // 通過“task_threads”API調用獲取指定 task 的線程列表
    // mach_task_self_,表示獲取當前的 Mach task
    kr = task_threads(mach_task_self(), &threadList, &threadCount);
    if (kr != KERN_SUCCESS) {
    return -1;
    }
    double cpuUsage = 0;
    for (int i = 0; i < threadCount; i++) {
    threadInfoCount = THREAD_INFO_MAX;
    // 通過“thread_info”API調用來查詢指定線程的信息
    // flavor參數傳的是THREAD_BASIC_INFO,使用這個類型會返回線程的基本信息,
    // 定義在 thread_basic_info_t 結構體,包含了用戶和系統的運行時間、運行狀態(tài)和調度優(yōu)先級等
    kr = thread_info(threadList[i], THREAD_BASIC_INFO, (thread_info_t)threadInfo, &threadInfoCount);
    if (kr != KERN_SUCCESS) {
    return -1;
    }

      threadBasicInfo = (thread_basic_info_t)threadInfo;if (!(threadBasicInfo->flags & TH_FLAGS_IDLE)) {cpuUsage += threadBasicInfo->cpu_usage;}
    

    }

    // 回收內存,防止內存泄漏
    vm_deallocate(mach_task_self(), (vm_offset_t)threadList, threadCount * sizeof(thread_t));

    return cpuUsage / (double)TH_USAGE_SCALE * 100.0;
    }
    @end

  1. 內存
    雖然現在的手機內存越來越大,但畢竟是有限的,如果因為應用設計不當造成內存過高,可能面臨被系統“干掉”的風險,這對用戶來說是毀滅性的體驗。
    Mach task 的內存使用信息存放在mach_task_basic_info 結構體中 ,其中resident_size 為應用使用的物理內存大小,virtual_size 為虛擬內存大小,在task_info.h中:
    #define MACH_TASK_BASIC_INFO 20 /* always 64-bit basic info /
    struct mach_task_basic_info {
    mach_vm_size_t virtual_size; /
    virtual memory size (bytes) /
    mach_vm_size_t resident_size; /
    resident memory size (bytes) /
    mach_vm_size_t resident_size_max; /
    maximum resident memory size (bytes) /
    time_value_t user_time; /
    total user run time for
    terminated threads /
    time_value_t system_time; /
    total system run time for
    terminated threads /
    policy_t policy; /
    default policy for new threads /
    integer_t suspend_count; /
    suspend count for task */
    };
    獲取方式是通過task_info API 根據指定的 flavor 類型,返回 target_task 的信息,在task.h中:
    kern_return_t task_info
    (
    task_name_t target_task,
    task_flavor_t flavor,
    task_info_t task_info_out,
    mach_msg_type_number_t *task_info_outCnt
    );
    筆者嘗試過使用如下方式獲取內存情況,基本和騰訊的GT的相近,但是和Xcode和Instruments的值有較大差距:
    // 獲取當前應用的內存占用情況,和Xcode數值相差較大
  • (double)getResidentMemory {
    struct mach_task_basic_info info;
    mach_msg_type_number_t count = MACH_TASK_BASIC_INFO_COUNT;
    if (task_info(mach_task_self(), MACH_TASK_BASIC_INFO, (task_info_t)&info, &count) == KERN_SUCCESS) {
    return info.resident_size / (1024 * 1024);
    } else {
    return -1.0;
    }
    }
    后來看了一篇博主討論了這個問題,說使用phys_footprint 才是正解,https://www.jianshu.com/u/b534ce5f8fae。測試后,基本和Xcode的數值相近。
    // 獲取當前應用的內存占用情況,和Xcode數值相近
  • (double)getMemoryUsage {
    task_vm_info_data_t vmInfo;
    mach_msg_type_number_t count = TASK_VM_INFO_COUNT;
    if(task_info(mach_task_self(), TASK_VM_INFO, (task_info_t) &vmInfo, &count) == KERN_SUCCESS) {
    return (double)vmInfo.phys_footprint / (1024 * 1024);
    } else {
    return -1.0;
    }
    }
    關于 phys_footprint 的定義可以在 XNU 源碼中,找到 osfmk/kern/task.c 里對于 phys_footprint 的注釋,認為注釋里提到的公式計算的應該才是應用實際使用的物理內存。
    /*
  • phys_footprint
  • Physical footprint: This is the sum of:
  • + (internal - alternate_accounting)
    
  • + (internal_compressed - alternate_accounting_compressed)
    
  • + iokit_mapped
    
  • + purgeable_nonvolatile
    
  • + purgeable_nonvolatile_compressed
    
  • + page_table
    
  • internal
  • The task’s anonymous memory, which on iOS is always resident.
  • internal_compressed
  • Amount of this task’s internal memory which is held by the compressor.
  • Such memory is no longer actually resident for the task [i.e., resident in its pmap],
  • and could be either decompressed back into memory, or paged out to storage, depending
  • on our implementation.
  • iokit_mapped
  • IOKit mappings: The total size of all IOKit mappings in this task, regardless of
    clean/dirty or internal/external state].
  • alternate_accounting
  • The number of internal dirty pages which are part of IOKit mappings. By definition, these pages
  • are counted in both internal and iokit_mapped, so we must subtract them from the total to avoid
  • double counting.
    */
    當然我也是贊同這點的>.<。
  1. 啟動時間
    APP的啟動時間,直接影響用戶對你的APP的第一體驗和判斷。如果啟動時間過長,不單單體驗直線下降,而且可能會激發(fā)蘋果的watch dog機制kill掉你的APP,那就悲劇了,用戶會覺得APP怎么一啟動就卡死然后崩潰了,不能用,然后長按APP點擊刪除鍵。(Xcode在debug模式下是沒有開啟watch dog的,所以一定要連接真機測試APP)
    在衡量APP的啟動時間之前先了解下,APP的啟動流程:

APP的啟動可以分為兩個階段,即main()執(zhí)行之前和main()執(zhí)行之后。總結如下:
t(App 總啟動時間) = t1( main()之前的加載時間 ) + t2( main()之后的加載時間 )。
? t1 = 系統的 dylib (動態(tài)鏈接庫)和 App 可執(zhí)行文件的加載時間;
? t2 = main()函數執(zhí)行之后到AppDelegate 類中的applicationDidFinishLaunching:withOptions:方法執(zhí)行結束前這段時間。
所以對APP啟動時間的獲取和優(yōu)化都是從這兩個階段著手,下面先看看main()函數執(zhí)行之前如何獲取啟動時間。
衡量main()函數執(zhí)行之前的耗時
對于衡量main()之前也就是time1的耗時,蘋果官方提供了一種方法,即在真機調試的時候,勾選DYLD_PRINT_STATISTICS 選項(如果想獲取更詳細的信息可以使用DYLD_PRINT_STATISTICS_DETAILS ),如下圖:

輸出結果如下:
Total pre-main time: 34.22 milliseconds (100.0%)
dylib loading time: 14.43 milliseconds (42.1%)
rebase/binding time: 1.82 milliseconds (5.3%)
ObjC setup time: 3.89 milliseconds (11.3%)
initializer time: 13.99 milliseconds (40.9%)
slowest intializers :
libSystem.B.dylib : 2.20 milliseconds (6.4%)
libBacktraceRecording.dylib : 2.90 milliseconds (8.4%)
libMainThreadChecker.dylib : 6.55 milliseconds (19.1%)
libswiftCoreImage.dylib : 0.71 milliseconds (2.0%)
系統級別的動態(tài)鏈接庫,因為蘋果做了優(yōu)化,所以耗時并不多,而大多數時候,t1的時間大部分會消耗在自身App中的代碼上和鏈接第三方庫上。
所以應如何減少main()調用之前的耗時呢,可以優(yōu)化的點有:

  1. 減少不必要的framework ,特別是第三方的,因為動態(tài)鏈接比較耗時;
  2. check framework 應設為optional 和required ,如果該framework 在當前App支持的所有iOS系統版本都存在,那么就設為required ,否則就設為optional ,因為optional 會有些額外的檢查;
  3. 合并或者刪減一些OC類,關于清理項目中沒用到的類,可以借助AppCode代碼檢查工具:
    ? 刪減一些無用的靜態(tài)變量
    ? 刪減沒有被調用到或者已經廢棄的方法
    ? 將不必須在+load方法中做的事情延遲到+initialize中
    ? 盡量不要用C++虛函數(創(chuàng)建虛函數表有開銷)
    衡量main()函數執(zhí)行之后的耗時
    第二階段的耗時統計,認為是從main ()執(zhí)行之后到applicationDidFinishLaunching:withOptions:方法最后,那么可以通過打點的方式進行統計。 Objective-C項目因為有main文件,所以我么直接可以通過添加代碼獲取:
    // 1. 在 main.m 添加如下代碼:
    CFAbsoluteTime AppStartLaunchTime;

int main(int argc, char * argv[]) {
AppStartLaunchTime = CFAbsoluteTimeGetCurrent();

}

// 2. 在 AppDelegate.m 的開頭聲明
extern CFAbsoluteTime AppStartLaunchTime;

// 3. 最后在AppDelegate.m 的 didFinishLaunchingWithOptions 中添加
dispatch_async(dispatch_get_main_queue(), ^{
NSLog(@“App啟動時間–%f”,(CFAbsoluteTimeGetCurrent()-AppStartLaunchTime));
});
大家都知道Swift項目是沒有main文件,官方給了如下解釋:
In Xcode, Mac templates default to including a “main.swift” file, but for iOS apps the default for new iOS project templates is to add @UIApplicationMain to a regular Swift file. This causes the compiler to synthesize a mainentry point for your iOS app, and eliminates the need for a “main.swift” file.
也就是說,通過添加@UIApplicationMain標志的方式,幫添加了mian函數了。所以如果是需要在mian函數中做一些其它操作的話,需要自己來創(chuàng)建main.swift文件,這個也是蘋果允許的。
i. 刪除AppDelegate類中的 @UIApplicationMain標志;
ii. 自行創(chuàng)建main.swift文件,并添加程序入口:
import UIKit

var appStartLaunchTime: CFAbsoluteTime = CFAbsoluteTimeGetCurrent()

UIApplicationMain(
CommandLine.argc,
UnsafeMutableRawPointer(CommandLine.unsafeArgv)
.bindMemory(
to: UnsafeMutablePointer.self,
capacity: Int(CommandLine.argc)),
nil,
NSStringFromClass(AppDelegate.self)
)
iii. 在AppDelegate的didFinishLaunchingWithOptions :方法最后添加:
// APP啟動時間耗時,從mian函數開始到didFinishLaunchingWithOptions方法結束
DispatchQueue.main.async {
print(“APP啟動時間耗時,從mian函數開始到didFinishLaunchingWithOptions方法:(CFAbsoluteTimeGetCurrent() - appStartLaunchTime)。”)
}
main函數之后的優(yōu)化:
? 盡量使用純代碼編寫,減少xib的使用;
? 啟動階段的網絡請求,是否都放到異步請求;
? 一些耗時的操作是否可以放到后面去執(zhí)行,或異步執(zhí)行等。
4. FPS
通過維基百科知道,FPS 是Frames Per Second 的簡稱縮寫,意思是每秒傳輸幀數,也就是常說的“刷新率(單位為Hz)。
FPS 是測量用于保存、顯示動態(tài)視頻的信息數量。每秒鐘幀數愈多,所顯示的畫面就會愈流暢,FPS 值越低就越卡頓,所以這個值在一定程度上可以衡量應用在圖像繪制渲染處理時的性能。一般APP的FPS 只要保持在 50-60之間,用戶體驗都是比較流暢的。
蘋果手機屏幕的正常刷新頻率是每秒60次,即可以理解為FPS值為60。都知道CADisplayLink 是和屏幕刷新頻率保存一致,所以是否可以通過它來監(jiān)控FPS呢?!
首先CADisplayLink 是什么
CADisplayLink 是CoreAnimation 提供的另一個類似于NSTimer 的類,它總是在屏幕完成一次更新之前啟動,它的接口設計的和NSTimer 很類似,所以它實際上就是一個內置實現的替代,但是和timeInterval 以秒為單位不同,CADisplayLink 有一個整型的frameInterval 屬性,指定了間隔多少幀之后才執(zhí)行。默認值是1,意味著每次屏幕更新之前都會執(zhí)行一次。但是如果動畫的代碼執(zhí)行起來超過了六十分之一秒,你可以指定frameInterval 為2,就是說動畫每隔一幀執(zhí)行一次(一秒鐘30幀)。
使用CADisplayLink 監(jiān)控界面的FPS值,參考自YYFPSLabel:
// 詳情代碼可以clone demo查看
通過CADisplayLink 的實現方式,并真機測試之后,確實是可以在很大程度上滿足了監(jiān)控FPS的業(yè)務需求和為提高用戶體驗提供參考,但是和Instruments的值可能會有些出入。下面來討論下使用CADisplayLink 的方式,可能存在的問題。
? (1). 和Instruments值對比有出入,原因如下:
CADisplayLink 運行在被添加的那個RunLoop 之中(一般是在主線程中),因此它只能檢測出當前RunLoop 下的幀率。RunLoop 中所管理的任務的調度時機,受任務所處的RunLoopMode 和CPU的繁忙程度所影響。所以想要真正定位到準確的性能問題所在,最好還是通過Instrument來確認。
? (2). 使用CADisplayLink 可能存在的循環(huán)引用問題。
例如以下寫法:
let link = CADisplayLink.init(target: self, selector: #selector(tick))

let timer = Timer.init(timeInterval: 1.0, target: self, selector: #selector(tick), userInfo: nil, repeats: true)
原因:以上兩種用法,都會對 self 強引用,此時 timer持有 self,self 也持有 timer,循環(huán)引用導致頁面 dismiss 時,雙方都無法釋放,造成循環(huán)引用。此時使用 weak 也不能有效解決:
weak var weakSelf = self
let link = CADisplayLink.init(target: weakSelf, selector: #selector(tick))
那么應該怎樣解決這個問題,有人會說在deinit (或dealloc )中調用定時器的invalidate方法,但是這是無效的,因為已經造成循環(huán)引用了,不會走到這個方法的。
YYKit作者提供的解決方案是使用 YYWeakProxy,這個YYWeakProxy 不是繼承自NSObject而是繼承NSProxy 。
NSProxy
An abstract superclass defining an API for objects that act as stand-ins for other objects or for objects that don’t exist yet.
NSProxy 是一個為對象定義接口的抽象父類,并且為其它對象或者一些不存在的對象扮演了替身角色。具體的可以看下NSProxy的官方文檔 修改后代碼如下,親測定時器如愿釋放,LSLWeakProxy 的具體實現代碼已經同步到github中。
let link = CADisplayLink.init(target: LSLWeakProxy(target: self), selector: #selector(tick))
5. 卡頓
在了解卡頓產生的原因之前,先看下屏幕顯示圖像的原理。
屏幕顯示圖像的原理:

現在的手機設備基本都是采用雙緩存+垂直同步(即V-Sync)屏幕顯示技術。
如上圖所示,系統內CPU 、GPU 和顯示器是協同完成顯示工作的。其中CPU 負責計算顯示的內容,例如視圖創(chuàng)建、布局計算、圖片解碼、文本繪制等等。隨后CPU 將計算好的內容提交給GPU ,由GPU 進行變換、合成、渲染。GPU 會預先渲染好一幀放入一個緩沖區(qū)內,讓視頻控制器讀取,當下一幀渲染好后,GPU 會直接將視頻控制器的指針指向第二個容器(雙緩存原理)。這里,GPU 會等待顯示器的VSync (即垂直同步)信號發(fā)出后,才進行新的一幀渲染和緩沖區(qū)更新(這樣能解決畫面撕裂現象,也增加了畫面流暢度,但需要消費更多的計算資源,也會帶來部分延遲)。
卡頓的原因:

由上面屏幕顯示的原理,采用了垂直同步機制的手機設備。如果在一個VSync 時間內,CPU 或GPU 沒有完成內容提交,則那一幀就會被丟棄,等待下一次機會再顯示,而這時顯示屏會保留之前的內容不變。例如在主線程里添加了阻礙主線程去響應點擊、滑動事件、以及阻礙主線程的UI繪制等的代碼,都是造成卡頓的常見原因。
卡頓監(jiān)控:
卡頓監(jiān)控一般有兩種實現方案:
? (1). 主線程卡頓監(jiān)控。通過子線程監(jiān)測主線程的runLoop ,判斷兩個狀態(tài)區(qū)域之間的耗時是否達到一定閾值。
? (2). FPS監(jiān)控。要保持流暢的UI交互,App 刷新率應該當努力保持在 60fps。FPS的監(jiān)控實現原理,上面已經探討過這里略過。
在使用FPS 監(jiān)控性能的實踐過程中,發(fā)現 FPS 值抖動較大,造成偵測卡頓比較困難。為了解決這個問題,通過采用檢測主線程每次執(zhí)行消息循環(huán)的時間,當這一時間大于規(guī)定的閾值時,就記為發(fā)生了一次卡頓的方式來監(jiān)控。 這也是美團的移動端采用的性能監(jiān)控Hertz 方案,微信團隊也在實踐過程中提出來類似的方案–微信讀書 iOS 性能優(yōu)化總結。

方案的提出,是根據滾動引發(fā)的Sources事件或其它交互事件總是被快速的執(zhí)行完成,然后進入到kCFRunLoopBeforeWaiting狀態(tài)下;假如在滾動過程中發(fā)生了卡頓現象,那么RunLoop必然會保持kCFRunLoopAfterWaiting或者kCFRunLoopBeforeSources這兩個狀態(tài)之一。
所以監(jiān)控主線程卡頓的方案一:
開辟一個子線程,然后實時計算 kCFRunLoopBeforeSources 和 kCFRunLoopAfterWaiting 兩個狀態(tài)區(qū)域之間的耗時是否超過某個閥值,來斷定主線程的卡頓情況。 但是由于主線程的RunLoop在閑置時基本處于Before Waiting狀態(tài),這就導致了即便沒有發(fā)生任何卡頓,這種檢測方式也總能認定主線程處在卡頓狀態(tài)。
為了解決這個問題寒神(南梔傾寒)給出了自己的解決方案,Swift的卡頓檢測第三方ANREye。這套卡頓監(jiān)控方案大致思路為:創(chuàng)建一個子線程進行循環(huán)檢測,每次檢測時設置標記位為YES,然后派發(fā)任務到主線程中將標記位設置為NO。接著子線程沉睡超時闕值時長,判斷標志位是否成功設置成NO,如果沒有說明主線程發(fā)生了卡頓。
結合這套方案,當主線程處在Before Waiting狀態(tài)的時候,通過派發(fā)任務到主線程來設置標記位的方式處理常態(tài)下的卡頓檢測:
#define lsl_SEMAPHORE_SUCCESS 0
static BOOL lsl_is_monitoring = NO;
static dispatch_semaphore_t lsl_semaphore;
static NSTimeInterval lsl_time_out_interval = 0.05;

@implementation LSLAppFluencyMonitor

static inline dispatch_queue_t __lsl_fluecy_monitor_queue() {
static dispatch_queue_t lsl_fluecy_monitor_queue;
static dispatch_once_t once;
dispatch_once(&once, ^{
lsl_fluecy_monitor_queue = dispatch_queue_create(“com.dream.lsl_monitor_queue”, NULL);
});
return lsl_fluecy_monitor_queue;
}

static inline void __lsl_monitor_init() {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
lsl_semaphore = dispatch_semaphore_create(0);
});
}

#pragma mark - Public

  • (instancetype)monitor {
    return [LSLAppFluencyMonitor new];
    }
  • (void)startMonitoring {
    if (lsl_is_monitoring) { return; }
    lsl_is_monitoring = YES;
    __lsl_monitor_init();
    dispatch_async(__lsl_fluecy_monitor_queue(), ^{
    while (lsl_is_monitoring) {
    __block BOOL timeOut = YES;
    dispatch_async(dispatch_get_main_queue(), ^{
    timeOut = NO;
    dispatch_semaphore_signal(lsl_semaphore);
    });
    [NSThread sleepForTimeInterval: lsl_time_out_interval];
    if (timeOut) {
    [LSLBacktraceLogger lsl_logMain]; // 打印主線程調用棧
    // [LSLBacktraceLogger lsl_logCurrent]; // 打印當前線程的調用棧
    // [LSLBacktraceLogger lsl_logAllThread]; // 打印所有線程的調用棧
    }
    dispatch_wait(lsl_semaphore, DISPATCH_TIME_FOREVER);
    }
    });
    }

  • (void)stopMonitoring {
    if (!lsl_is_monitoring) { return; }
    lsl_is_monitoring = NO;
    }

@end
其中LSLBacktraceLogger 是獲取堆棧信息的類,詳情見代碼Github。
demo卡頓堆棧打印日志如下:
2018-08-16 12:36:33.910491+0800 AppPerformance[4802:171145] Backtrace of Thread 771:

libsystem_kernel.dylib 0x10d089bce __semwait_signal + 10
libsystem_c.dylib 0x10ce55d10 usleep + 53
AppPerformance 0x108b8b478 $S14AppPerformance25LSLFPSTableViewControllerC05tableD0_12cellForRowAtSo07UITableD4CellCSo0kD0C_10Foundation9IndexPathVtF + 1144
AppPerformance 0x108b8b60b $S14AppPerformance25LSLFPSTableViewControllerC05tableD0_12cellForRowAtSo07UITableD4CellCSo0kD0C_10Foundation9IndexPathVtFTo + 155
UIKitCore 0x1135b104f -[_UIFilteredDataSource tableView:cellForRowAtIndexPath:] + 95
UIKitCore 0x1131ed34d -[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 765
UIKitCore 0x1131ed8da -[UITableView _createPreparedCellForGlobalRow:willDisplay:] + 73
UIKitCore 0x1131b4b1e -[UITableView _updateVisibleCellsNow:isRecursive:] + 2863
UIKitCore 0x1131d57eb -[UITableView layoutSubviews] + 165
UIKitCore 0x1133921ee -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1501
QuartzCore 0x10ab72eb1 -[CALayer layoutSublayers] + 175
QuartzCore 0x10ab77d8b _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 395
QuartzCore 0x10aaf3b45 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 349
QuartzCore 0x10ab285b0 _ZN2CA11Transaction6commitEv + 576
QuartzCore 0x10ab29374 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 76
CoreFoundation 0x109dc3757 CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION + 23
CoreFoundation 0x109dbdbde __CFRunLoopDoObservers + 430
CoreFoundation 0x109dbe271 __CFRunLoopRun + 1537
CoreFoundation 0x109dbd931 CFRunLoopRunSpecific + 625
GraphicsServices 0x10f5981b5 GSEventRunModal + 62
UIKitCore 0x112c812ce UIApplicationMain + 140
AppPerformance 0x108b8c1f0 main + 224
libdyld.dylib 0x10cd4dc9d start + 1

======================================================================================
方案二是結合CADisplayLink 的方式實現
在檢測FPS值的時候,就詳細介紹了CADisplayLink 的使用方式,在這里也可以通過FPS值是否連續(xù)低于某個值開進行監(jiān)控。
參考鏈接:
https://github.com/SilongLi/AppPerformance
https://www.jianshu.com/p/95df83780c8f

總結

以上是生活随笔為你收集整理的App性能分析数据监控的全部內容,希望文章能夠幫你解決所遇到的問題。

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

亚洲精品乱码 | 亚洲国产成人在线 | 欧美男同视频网站 | av黄色免费在线观看 | 久久成人国产 | 69视频网站 | www黄色com| 亚洲视屏一区 | 中文字幕在线观看免费高清电影 | 激情综合网在线观看 | 主播av在线 | 91精品视频在线看 | 日韩欧美视频 | 欧美日韩激情视频8区 | 国产伦精品一区二区三区… | 爱色婷婷| 欧美激情视频一区二区三区免费 | 五月婷婷综 | 蜜臀av性久久久久av蜜臀三区 | 亚洲电影影音先锋 | 少妇搡bbbb搡bbb搡忠贞 | 欧美国产高清 | 天天曰天天爽 | 91精品播放| 96国产精品视频 | 狠狠网亚洲精品 | 欧美专区日韩专区 | 久久不射电影院 | 日韩网站在线免费观看 | 国产日产高清dvd碟片 | a在线免费 | 久久99国产精品自在自在app | 久久6精品| 亚洲精品一区二区18漫画 | 亚洲综合在线观看视频 | 日韩欧美极品 | 久久精品久久精品久久精品 | 99tvdz@gmail.com| 精品国产免费看 | 欧洲视频一区 | 91成人欧美| 韩日精品在线 | 国产最新在线 | 在线观看中文字幕第一页 | 岛国精品一区二区 | 麻豆视频在线看 | 美女在线国产 | 日韩av中文在线 | 亚洲黄色一级视频 | 日本高清dvd| 色丁香久久 | 亚洲精品2区 | 久久精品爱视频 | 国产97超碰 | 国产精品久久久久永久免费观看 | 精品美女在线视频 | 精品欧美日韩 | 91视频久久久久久 | 欧美日韩国产二区 | 免费观看国产成人 | 国产精品久免费的黄网站 | 天天爽夜夜爽人人爽一区二区 | 亚洲黄色av一区 | 国产精品久久人 | 中文字幕在线看视频国产中文版 | 麻豆激情电影 | 99re8这里有精品热视频免费 | 色婷婷97| 国产精品久久麻豆 | 尤物九九久久国产精品的分类 | 国产精品一区二区久久久 | 丁香六月网 | 亚洲国产网址 | 精品国产三级a∨在线欧美 免费一级片在线观看 | 人人看人人艹 | 国产色综合天天综合网 | 日日碰狠狠躁久久躁综合网 | 欧美日韩视频 | 在线免费观看视频一区二区三区 | 狠狠色伊人亚洲综合网站野外 | 三级av小说| 999超碰 | 日韩精品一区二区三区水蜜桃 | 超碰个人在线 | 国产精品久久久视频 | 国产污视频在线观看 | 超碰免费久久 | 精品国产中文字幕 | 亚洲国产高清在线 | 最近日本韩国中文字幕 | 天天综合网天天综合色 | 欧美亚洲国产一卡 | 人人干,人人爽 | 中国一级片在线 | 日日干日日 | 国产剧情在线一区 | 日日干美女 | 最近中文字幕 | 狠狠色香婷婷久久亚洲精品 | 日韩在线精品视频 | 日一日干一干 | 天堂在线视频中文网 | a天堂免费 | 国产欧美精品在线观看 | 久久五月天综合 | 免费黄色在线网址 | 色综合婷婷 | 国产一区二区三区在线免费观看 | 四虎成人精品在永久免费 | 欧美在线观看视频 | 91在线观 | 婷婷丁香av| 日韩一区二区免费播放 | 成人av一区二区兰花在线播放 | 麻花传媒mv免费观看 | 91大神电影 | 91视频国产免费 | 天天狠狠操| 久久久久久美女 | 成人久久18免费网站麻豆 | 美女黄频网站 | 久久久久草 | 九九热.com| 国产精品美女久久久久久免费 | 日韩精品久久一区二区 | 久久国产女人 | 正在播放国产一区 | 欧美精品被 | a天堂在线看 | 婷婷六月激情 | 亚洲精品黄色在线观看 | 九月婷婷人人澡人人添人人爽 | 国产精品第72页 | 成年人天堂com | 日韩欧美精品在线观看视频 | 狠狠五月婷婷 | 日韩高清av | av在线最新 | 日本免费一二三区 | 日本高清免费中文字幕 | av中文字幕免费在线观看 | 日韩欧美在线综合网 | 免费精品 | 国产精品成人一区 | 最新成人av| 国产在线观看99 | 亚洲免费国产视频 | 欧美大片在线观看一区 | 右手影院亚洲欧美 | 干亚洲少妇| 国产视频一区二区在线 | 九九在线视频免费观看 | 人人舔人人干 | 久久成年人网站 | 免费人做人爱www的视 | 2021国产在线 | 亚洲一区 影院 | 久久资源总站 | 在线视频app| 国产乱码精品一区二区蜜臀 | 中文字幕在线播放一区二区 | 天天玩夜夜操 | 91麻豆免费看 | 国产成人精品av久久 | 激情综合五月天 | 超碰在线9 | 亚洲视频在线观看 | 久草国产精品 | 91av视屏| 亚洲国产mv | 国产精品乱码久久久久久1区2区 | av电影在线免费 | 中文字幕日韩一区二区三区不卡 | 久久久精品网站 | av怡红院| 国产精品欧美久久久久久 | 四虎永久网站 | 日韩视频免费看 | 国产精品videoxxxx | 日韩在线| 97色综合| 性色在线视频 | 中文字幕在线观看免费观看 | 欧美成人高清 | 91麻豆视频网站 | 久久手机免费观看 | 热久久最新地址 | 免费中文字幕视频 | 午夜色站 | 国产精品久久久777 成人手机在线视频 | 99久久精品国产一区二区三区 | 国产亚洲精品av | 最近的中文字幕大全免费版 | 国产精品毛片一区二区 | 久草免费在线观看 | 日韩成人看片 | 国产精品尤物视频 | 欧美乱码精品一区二区 | 日韩欧美一区视频 | 在线观看免费成人 | 欧美精品xxx | 久久久精品福利视频 | 成人在线播放免费观看 | 天天操天天干天天玩 | 91插插插免费视频 | 日韩在线观看a | 国产精品久久久久久一区二区 | 最近中文国产在线视频 | 亚洲影音先锋 | 激情xxxx| 色综合久久88色综合天天免费 | 天海翼一区二区三区免费 | 精品一区在线 | 在线精品视频在线观看高清 | 一区二区三区精品在线视频 | 中文字幕av一区二区三区四区 | 97天堂网| 婷婷国产精品 | 天天鲁天天干天天射 | 日本中文字幕在线一区 | 狠狠天天 | 亚洲综合激情 | 不卡视频国产 | 亚洲精品免费在线视频 | 成人免费看片98欧美 | 99在线精品观看 | 黄色三级免费观看 | 日本三级中文字幕在线观看 | 超碰人人在 | 久久精品视频中文字幕 | 99久久综合国产精品二区 | 亚洲第一中文字幕 | 国内揄拍国内精品 | 黄色片免费电影 | 婷婷色综合网 | 国产精品一区二区在线观看免费 | 欧美91精品国产自产 | 久久久久亚洲a | 91精品视频观看 | 成人免费一区二区三区在线观看 | 日本中文字幕高清 | 免费三级黄| 99精品一区二区三区 | 日韩精品aaa | 国产精品一区二区三区在线免费观看 | 精品久久一 | 午夜视频在线观看一区二区 | 91精品视频播放 | 欧美一级欧美一级 | 中文字幕精品一区久久久久 | 香蕉影院在线播放 | 在线视频app | 一区 二区电影免费在线观看 | 99自拍视频在线观看 | 欧美伦理电影一区二区 | 国产成人精品久久久 | 91片在线观看 | 久久不射电影网 | 免费看黄色91 | 99精品视频网 | 精品在线观看一区二区 | 国产在线精 | 国产精品免费在线播放 | 欧美日韩一区二区视频在线观看 | 日韩一区二区在线免费观看 | 久久综合五月 | 成人免费在线电影 | 精品久久网站 | 成人久久18免费网站 | 久久精品99视频 | v片在线看 | 日本大片免费观看在线 | www.香蕉视频在线观看 | 欧美另类重口 | 日韩免费av片 | 波多野结衣在线视频一区 | 成年美女黄网站色大片免费看 | 国产精品中文字幕在线播放 | 97电影在线看视频 | 国产日韩精品一区二区三区在线 | 日韩av不卡在线观看 | 亚洲a色| 在线 国产 亚洲 欧美 | 久久福利 | 久久久久国产精品免费 | 婷婷久久一区二区三区 | www.狠狠操| 欧洲精品码一区二区三区免费看 | 日本韩国精品一区二区在线观看 | 午夜视频一区二区 | 精品久久免费 | 亚洲激情av | 亚洲成a人片在线观看网站口工 | 久久精品久久久久电影 | 免费色网 | 国产在线不卡视频 | 亚洲精品视频在线观看免费视频 | 热久久免费视频 | 国产成人精品a | 国产视频在线观看免费 | 国产麻豆剧传媒免费观看 | 黄色特一级片 | 亚洲视频 在线观看 | 国产在线无 | 亚洲天堂精品视频在线观看 | 99久久日韩精品视频免费在线观看 | 伊人导航| 婷婷久久久久 | 亚洲精品国产精品久久99 | 1024久久 | 在线播放精品一区二区三区 | 人人澡人摸人人添学生av | 日韩电影一区二区在线 | 国产一区二区在线播放视频 | 天天在线免费视频 | 99超碰在线观看 | 涩涩伊人| www.黄色片网站 | 国产一区二区在线观看免费 | 人人爽人人片 | 婷婷久久久久 | 99爱视频| 五月婷婷开心 | 亚洲一区二区天堂 | 天躁狠狠躁 | 精品久久久久久亚洲综合网 | 久久久免费看 | 久久久国产精品人人片99精片欧美一 | 99久久久久 | 国产精品丝袜 | 91精品免费视频 | 日b视频国产 | 三级小视频在线观看 | 天天操天天艹 | 日本中文字幕网站 | 亚洲视频精品在线 | 怡红院成人在线 | 狠狠网 | 欧美精品一区二区在线播放 | 久久久久免费精品国产 | 91精品一区二区三区久久久久久 | 91视频在线网址 | se视频网址 | 欧美亚洲免费在线一区 | 亚洲一区二区视频在线播放 | 最新av在线网站 | 欧美在线观看视频免费 | 亚洲黄色在线观看 | 五月天久久婷 | 996久久国产精品线观看 | 国产麻豆精品传媒av国产下载 | 91精品国产91久久久久久三级 | 天天碰天天操视频 | 99国产视频在线 | 在线免费观看黄色 | 激情九九| 国产69久久 | 婷婷av资源| 91视频在线观看免费 | 欧美视频一区二 | 天天躁天天操 | 在线有码中文字幕 | 国产精品123 | 亚洲精品视频在线观看视频 | 久久久久久视频 | 狠狠狠色丁香婷婷综合久久五月 | av蜜桃在线| 成 人 a v天堂 | 人人艹人人 | 日韩四虎 | 激情五月av | 亚洲欧美国产日韩在线观看 | 99国产高清 | 日本一区二区三区视频在线播放 | 久久伊人精品一区二区三区 | 四虎成人精品永久免费av九九 | 成人三级av| 97日日 | 成人av免费在线播放 | av电影 一区二区 | 中文字幕在线视频网站 | 天堂网中文在线 | a级一a一级在线观看 | 丁香网婷婷 | 久久精品亚洲国产 | 久久久精品欧美 | 亚洲视频大全 | 91禁在线观看 | 综合天堂av久久久久久久 | 久草在线久草在线2 | 国产精品久久久久久久久费观看 | 久久精品国产一区二区三区 | 精品久久久99 | 久久久久久久久久久久国产精品 | 欧美一二三在线 | 日日日视频 | a级片久久久 | 欧美性超爽 | 视频在线观看入口黄最新永久免费国产 | 免费看av在线 | 天天射综合 | 欧美一二区视频 | 国产一区二区三区高清播放 | 久草在线视频在线观看 | 成人毛片网| 国产黄色播放 | 91丨porny丨九色| 国产一区二区在线播放视频 | 久久国产综合视频 | 日韩av成人 | 久久av福利| 成人三级网站在线观看 | 狠狠操狠狠干天天操 | 人人超碰97 | 国产亚洲精品久久 | 日韩伦理片一区二区三区 | 久久99热这里只有精品国产 | 狠狠色免费 | 日日日网 | 精品国产精品久久一区免费式 | 精品免费视频123区 午夜久久成人 | 中文区中文字幕免费看 | 亚洲国产综合在线 | 国产一二三四在线观看视频 | 人人插人人做 | 欧美日韩精品区 | 成人久久精品视频 | av看片在线| 天天爽夜夜爽精品视频婷婷 | 久久99国产精品视频 | 久久婷婷色综合 | 国产高清免费在线播放 | 国产精品久久久久久久久久久久午夜 | 日韩av电影中文字幕在线观看 | 在线视频精品 | 黄色三级免费片 | 日韩激情av在线 | 成人av资源站 | 久久影院一区 | 久久污视频 | 香蕉视频免费在线播放 | 91丨九色丨国产丨porny精品 | 久久这里只有精品久久 | 麻豆国产精品一区二区三区 | 久久国内视频 | 久久丁香 | 国产精品入口传媒 | 久久99久国产精品黄毛片入口 | 天天综合网在线观看 | 激情五月看片 | 欧美大片在线观看一区 | 丁香六月五月婷婷 | 成人中文字幕+乱码+中文字幕 | 国产h在线播放 | 美女国产 | 免费一区在线 | 99久久久国产精品免费99 | 国产亚洲va综合人人澡精品 | 在线中文字幕av观看 | 日本精品免费看 | 久久久久久亚洲精品 | 色偷偷av男人天堂 | 日韩丝袜视频 | 欧美一二三在线 | 成人v| 五月婷婷综 | 国产精品美女久久久久久 | 国产亚洲精品女人久久久久久 | 91在线免费播放视频 | 亚洲精品一区二区三区四区高清 | 国产精品免费大片视频 | 国产免费久久精品 | 色综合天天综合网国产成人网 | 91精品国产乱码 | 久久国产精品99久久久久久老狼 | 女人18毛片90分钟 | 国产五月色婷婷六月丁香视频 | 国产精品视频一二三 | 99视频精品视频高清免费 | 蜜臀久久99精品久久久无需会员 | 亚洲国产最新 | 手机av在线网站 | 亚洲国产无 | 在线观看岛国 | 色婷婷综合久色 | 99国产成+人+综合+亚洲 欧美 | 一级精品视频在线观看宜春院 | 免费观看一级特黄欧美大片 | 天天射综合网站 | 亚洲日韩中文字幕 | 亚洲国产最新 | av千婊在线免费观看 | 在线观看久久久久久 | 中文字幕在线视频免费播放 | 精品a级片| 天天操天天添 | 中文字幕在线观看免费高清完整版 | 色99导航| 久久精品国产一区 | 黄色www在线观看 | 色网免费观看 | 在线免费黄色av | 国产精品一区二区三区免费视频 | 久久精品视频免费 | 欧美日韩在线观看不卡 | 91精品网站在线观看 | 97成人在线观看视频 | 中文字幕在线一区观看 | 四虎成人在线 | 国产精品一区二区久久精品爱微奶 | 天天射综合网视频 | 少妇性bbb搡bbb爽爽爽欧美 | 中文字幕在线观看第二页 | 玖玖999 | 亚洲最大av | 五月开心婷婷 | 在线 你懂 | 亚洲午夜精品福利 | 丁香亚洲 | 高清日韩一区二区 | 国产精品99久久久久久人免费 | 福利久久久 | 国产伦精品一区二区三区高清 | 亚洲理论电影 | 高清国产午夜精品久久久久久 | 精品久久网站 | 色姑娘综合 | 久久免费久久 | 欧美日韩高清一区二区 | 天天玩天天干天天操 | 久久久久中文字幕 | 日韩专区在线观看 | 亚洲欧美国产日韩在线观看 | 天天色成人网 | 超碰日韩| 国产精品普通话 | 久久久精品国产免费观看同学 | 亚洲精品在线免费播放 | 精品久久综合 | 综合久久久| 色噜噜日韩精品一区二区三区视频 | 婷婷资源站 | www.天堂av| 国产精品理论片 | 国产日韩欧美综合在线 | 国产精品18久久久久久不卡孕妇 | 日本丶国产丶欧美色综合 | 亚洲精品国产精品国产 | 欧美日韩精品在线 | 正在播放国产一区二区 | 国产成人精品亚洲日本在线观看 | 久久国产精品成人免费浪潮 | 国产午夜精品一区二区三区四区 | 成人久久久久 | 国产精品一区二区三区免费视频 | 免费福利在线播放 | 精品国偷自产国产一区 | 久草国产在线观看 | 国产精品99久久免费观看 | 热久久免费视频精品 | 国产九九九视频 | 成人午夜电影免费在线观看 | 欧美日韩亚洲国产一区 | 国产中文伊人 | 久久久九色精品国产一区二区三区 | 欧美日韩一区二区三区不卡 | 在线播放视频一区 | 日本黄区免费视频观看 | 免费三级骚 | 亚洲一二三在线 | 亚洲国产精品va在线 | 国产精品一区二区三区四 | 欧美日韩国产精品爽爽 | 国产超碰在线 | 久久免费视频观看 | 久久久久亚洲天堂 | 手机成人在线电影 | 日韩精品一区二区三区免费观看 | 国产精品久久久久一区二区 | 日韩精品一区二区在线观看视频 | 国产性天天综合网 | 久久久久久久影院 | 免费成人av | 国产精品免费在线观看视频 | 亚洲另类视频在线 | 色视频在线 | 黄色三级网站在线观看 | a级片网站 | 国产在线精品一区二区 | 国产精品麻豆一区二区三区 | 六月激情 | www.伊人网| 国产很黄很色的视频 | 欧美日韩国产一区二区在线观看 | 成人av一区二区兰花在线播放 | 视频一区二区精品 | 日韩激情视频 | 天天操天天吃 | 999日韩 | 国产区在线 | 精品久久1| 一级黄色免费 | 亚洲第一色 | 国产午夜麻豆影院在线观看 | 日本中文在线观看 | 国产丝袜高跟 | 日韩资源在线播放 | 永久中文字幕 | 亚洲人在线7777777精品 | 成在线播放 | 色五月激情五月 | 国产精品一区二区三区在线播放 | 亚洲精品美女视频 | 一级淫片在线观看 | 国产黄色精品在线观看 | 中文字幕av一区二区三区四区 | 狠狠干天天射 | 亚洲天天干 | 国产精品久久久久久婷婷天堂 | 91热爆视频| 日韩综合第一页 | 国产精品一区二区吃奶在线观看 | 精品国产91亚洲一区二区三区www | 三级av小说| 国产69精品久久99不卡的观看体验 | 色欧美日韩 | 国产淫片免费看 | 国产一区视频在线播放 | 久草视频免费在线观看 | 色综合久久99| 在线不卡中文字幕播放 | av高清影院 | 久久在线看 | 国产成人福利在线 | 国产香蕉97碰碰碰视频在线观看 | 精品久久久久久久 | 麻豆国产视频下载 | 人人射人人爽 | 99免费视频 | 色综合久久久网 | 狠狠操狠狠干2017 | 欧美亚洲精品一区 | 久久久久久国产精品久久 | 97国产大学生情侣酒店的特点 | 日韩网站在线免费观看 | 中文字幕在线观看第一区 | 91精品国产99久久久久 | 欧美日韩国产亚洲乱码字幕 | 少妇搡bbbb搡bbb搡aa | 国产精品久久久久久久久久直播 | 亚洲精品乱码白浆高清久久久久久 | 亚州av成人 | 久视频在线 | 国产久视频 | 日日夜夜天天久久 | 亚洲视频一级 | 九九九在线观看 | 九九久久成人 | 韩日在线一区 | 国产精品久久久久av | 久久久免费av | 国产精品久久久久久久久久免费 | 久艹在线播放 | 黄色国产高清 | 成人免费在线播放 | 日本韩国欧美在线观看 | 成人午夜免费剧场 | 日韩免费视频一区二区 | 444av| 5月丁香婷婷综合 | 久久久国产精品网站 | 久久久久久久久久久免费视频 | 天天干,天天射,天天操,天天摸 | 成人影片在线免费观看 | 久久97超碰 | 国产一区二区不卡在线 | 这里只有精品视频在线 | 成人免费在线视频观看 | 91亚洲精品久久久 | 一级黄色电影网站 | 国产黄色成人 | 国产成人精品一区二区三区在线观看 | 久久成视频 | .国产精品成人自产拍在线观看6 | 国产精品高清在线观看 | 国产专区一 | 操操操com | 亚洲国产中文字幕在线观看 | 精品一区二区免费在线观看 | 成年人黄色大片在线 | 久久激情视频网 | 国内久久久 | www.天天射.com | 国产精品 亚洲精品 | 精品久久福利 | 中文字幕在线视频国产 | 手机看片99 | 日韩精品一区二区免费视频 | 9i看片成人免费看片 | 久久久久国产成人精品亚洲午夜 | 国产精品中文字幕在线观看 | 久久九九国产视频 | 婷婷深爱 | 日韩影片在线观看 | 欧美性大胆 | 伊人天天干 | 久久99精品热在线观看 | 日本少妇久久久 | 在线精品视频免费播放 | 高清av影院 | 91亚洲精品久久久久图片蜜桃 | 中文字幕在线观看91 | 久久香蕉电影 | 久久毛片网站 | 99久久99久久精品免费 | 91亚洲视频在线观看 | 久久不卡视频 | 日韩电影在线一区二区 | 美女网站色 | 天天干天天操天天射 | 日韩av免费大片 | 婷婷av综合 | 国产高清视频在线 | 日韩欧美高清在线观看 | 美女久久99| 久久99久久99免费视频 | 三级av在线播放 | 久久久久久福利 | 青草视频网 | 日韩中文字幕网站 | 天天综合网国产 | 韩国精品视频在线观看 | 亚洲欧美视频 | 日本aaaa级毛片在线看 | 综合av在线 | 黄色毛片一级 | 国产精品乱码久久久久久1区2区 | 99精品美女 | 久久精品中文字幕少妇 | 国产一二区免费视频 | 狠狠干狠狠色 | 婷婷六月在线 | 在线观看亚洲电影 | 日日干夜夜骑 | 日韩国产欧美在线视频 | 男女精品久久 | 色中射 | 91亚洲成人 | 日韩精品一区二区三区免费观看视频 | 少妇激情久久 | 久草久草在线 | 天天艹天天操 | 欧美日韩超碰 | 国产麻豆电影 | 97成人在线视频 | 婷婷成人综合 | 日韩在线资源 | 久热色超碰| 日韩av进入| 黄色91在线观看 | 91精品视频网站 | 亚洲自拍自偷 | 久色伊人 | 99热手机在线观看 | 一区二区三区动漫 | 一区二区三区四区久久 | 国产午夜亚洲精品 | 91豆花在线观看 | 亚洲精品在线观看免费 | 亚洲精品在线免费观看视频 | 久久久久免费精品视频 | 免费福利视频网站 | 欧美日韩国产在线一区 | 91视频com| 美女精品在线观看 | 成年人在线看视频 | 韩国在线一区 | 免费的成人av | 西西444www大胆高清图片 | 国产精品久久久久久久婷婷 | 国产99久久久精品 | 日韩av黄 | 在线看岛国av | 久久精品一区二区三 | 色全色在线资源网 | 精品视频在线看 | 日本一区二区三区免费看 | 西西444www大胆无视频 | 国产美女在线精品免费观看 | 久久国产亚洲精品 | 午夜精品在线看 | 香蕉视频免费在线播放 | www.色午夜 | 亚洲视频久久久 | 欧美午夜一区二区福利视频 | 超碰在线人人97 | 91色蜜桃 | 99久久99久国产黄毛片 | 天天操福利视频 | 最新极品jizzhd欧美 | 911在线| 日韩网| 啪啪精品 | 亚洲精品视频免费观看 | 91久久偷偷做嫩草影院 | 六月丁香婷婷网 | 二区中文字幕 | 欧美成人猛片 | 免费a网站| 日韩天堂网 | 99综合视频| 日韩在线高清 | 午夜影视剧场 | 亚洲精品国产精品国自产观看 | 免费看污片 | 中文字幕成人在线观看 | 夜夜视频 | 久久国产剧场电影 | av电影av在线| 久久伦理电影 | 国产亚洲精品久久久久久电影 | 国产91成人在在线播放 | 00av视频| 97免费在线观看视频 | 久久a免费视频 | 久久久久99精品成人片三人毛片 | 欧美日韩性生活 | 亚洲国产三级在线 | 西西人体4444www高清视频 | 久久高清国产视频 | 亚洲手机av| 婷婷丁香自拍 | 欧美色噜噜噜 | 国产一级免费观看 | 国产精品久久一 | 欧美成人xxxx | 婷婷中文在线 | 亚洲国产精品资源 | 日韩中文字幕在线 | 亚洲无在线 | 久久久久久久久久久免费视频 | 九九免费观看全部免费视频 | 在线观看午夜av | 啪啪激情网| 五月天色站 | 最新精品视频在线 | 国产婷婷视频在线 | 日韩欧美电影 | 精品视频免费观看 | 国产高清在线精品 | 日日夜夜操操操操 | 丁香九月激情 | 欧美在线视频一区二区 | 日韩色综合网 | 精品99免费视频 | 99久久99视频 | 久久大视频 | 婷婷六月天在线 | 久久99热这里只有精品 | 国产大片免费久久 | 国产裸体永久免费视频网站 | 91亚色在线观看 | 人人插人人艹 | 免费观看国产精品视频 | 午夜在线观看 | 免费一级特黄毛大片 | 日韩久久久 | 亚洲色图av | 免费在线观看国产精品 | 精品免费观看视频 | 久久综合免费视频 | 日韩免费区 | 久久久免费精品 | 国产精品久久久久9999 | 免费看一及片 | 成人一区电影 | 久久男人免费视频 | 九月婷婷综合网 | 国产综合香蕉五月婷在线 | 久热超碰 | 在线视频一二三 | 色综合久久66 | 91久久精品日日躁夜夜躁国产 | 精品一区免费 | 国际精品久久 | 男女拍拍免费视频 | 91成人精品一区在线播放69 | 免费成人看片 | 欧美一级欧美一级 | 久久男女视频 | 91福利社区在线观看 | 久久黄色网页 | 天天se天天cao天天干 | 亚洲国产精品传媒在线观看 | 国产精品12 | 国产二区av | 91精品欧美一区二区三区 | 国产精品久久久久婷婷 | 中文字幕有码在线 | 久草在线国产 | 欧美日韩国产一二 | 91精品网站 | 婷婷精品国产一区二区三区日韩 | 久久天天综合网 | 亚洲成人资源在线 | 国产精品一区二区三区在线看 | 狠狠躁夜夜a产精品视频 | 人人澡人人爽欧一区 | 狠狠操欧美 | 久久99国产精品免费网站 | 国产婷婷精品av在线 | 91看片在线播放 | 伊人国产在线观看 | 午夜精品久久久久久久久久久久 | 大胆欧美gogo免费视频一二区 | 国产中文字幕视频在线观看 | 国产免费成人 | 亚洲国产精品视频 | 亚洲天天看 | 中文字幕在线不卡国产视频 | 日本在线观看中文字幕 | 97视频人人澡人人爽 | 久久久久久久电影 | 午夜精品一区二区三区在线视频 | 久久成人一区 | 狠狠操影视 | 欧美一级片免费 | 亚洲精品久久在线 | 亚洲视频电影在线 | 天天操天天操 | 中文字幕日韩在线播放 | 国产成人精品一区二区三区福利 | 亚洲精品午夜aaa久久久 | 日韩在线精品视频 | 青草视频在线免费 | 精品久久国产精品 | 国产在线观看91 | 五月天开心| 天天操天天能 | 亚洲永久av | a'aaa级片在线观看 | 日韩成年视频 | 亚洲欧美日本国产 | 国产精品久久久久四虎 | 欧美日韩中文在线观看 | 国产一卡在线 | 国产日韩精品在线观看 | 成人一级电影在线观看 | 欧洲成人av | 日韩精品高清不卡 | 国产第一二区 | 欧美日韩中文在线观看 | 久久乐九色婷婷综合色狠狠182 | 国产精品白丝jk白祙 | 天天综合精品 | 精精国产xxxx视频在线播放 | 伊人色综合久久天天 | 午夜在线免费观看视频 | 久久激情小视频 | 高清日韩一区二区 | 97香蕉久久国产在线观看 | 国产黄视频在线观看 | 日韩高清在线看 | 国产精品久久久久久久久久妇女 | 2019免费中文字幕 | 天天操人人干 | 一级片在线 | 天天天色综合a | 久久夜色精品国产欧美一区麻豆 | 97色国产 | 天天干中文字幕 | 久99久中文字幕在线 | 日韩在线观看视频免费 | 国产91电影在线观看 | 二区三区在线观看 | 久久免费视频在线观看 | 久久久蜜桃一区二区 | 精品免费国产一区二区三区四区 | 中文字幕日韩国产 | 久久久久久久久久久久久9999 | 国产在线播放一区二区三区 | 亚洲精品1区2区3区 超碰成人网 | 久久影视一区二区 | 亚洲精品午夜一区人人爽 | 亚洲japanese制服美女 | 中文字幕av日韩 | 国产免费叼嘿网站免费 | 91精品啪在线观看国产线免费 | 久久久精品影视 | 中文字幕网站 | 日韩精品免费在线播放 | 日日爽视频| 免费a视频| 视频国产在线 | 色操插 | av综合av | 婷婷丁香激情五月 | 精品高清视频 |