iOS后臺(tái)任務(wù)的影響

afengmian1.png

背景

App后臺(tái)存活時(shí)間長(zhǎng)短直接對(duì)用戶體驗(yàn)、業(yè)務(wù)功能、用戶卸載幾個(gè)方面都有較大的影響。如果存活時(shí)間過短,用戶每次退到后臺(tái)后都需要重啟App,對(duì)于用戶來說都是非常不友好的,非常有可能導(dǎo)致用戶卸載App,這將是非常大的損失。因此我們著重調(diào)研了影響App后臺(tái)存活時(shí)間的具體因素。經(jīng)過調(diào)研發(fā)現(xiàn),除了設(shè)備性能影響,后臺(tái)任務(wù)是一個(gè)比較重要的方面,大家可能平時(shí)并沒有重點(diǎn)關(guān)注過后臺(tái)任務(wù)對(duì)后臺(tái)存活時(shí)間的影響,對(duì)后臺(tái)任務(wù)相關(guān)的內(nèi)容并不了解。為了搞清楚后臺(tái)任務(wù)對(duì)存活時(shí)間的影響和后臺(tái)任務(wù)的使用場(chǎng)景筆者做了深入的調(diào)研,一方面是為了解決上面的兩個(gè)問題,另一方面也是為了對(duì)這塊的知識(shí)做儲(chǔ)備。下面筆者將主要介紹一下后臺(tái)任務(wù)使用時(shí)存在的坑,以及我們是如何模擬此類場(chǎng)景的。希望這篇文章結(jié)能夠?qū)δ阌袔椭?/p>

后臺(tái)任務(wù)介紹

什么是后臺(tái)任務(wù)

正常情況下,當(dāng)App進(jìn)入后臺(tái),會(huì)立即變?yōu)閽炱馉顟B(tài),App中的任何執(zhí)行都會(huì)停止。但是由于需求原因我們并不希望進(jìn)入后臺(tái)后馬上停止我們的App中的操作,而是讓我們的操作執(zhí)行完成后在變?yōu)閽炱馉顟B(tài)。此時(shí)就用到了后臺(tái)任務(wù),開啟后臺(tái)任務(wù)后系統(tǒng)會(huì)繼續(xù)讓你的App保持活躍狀態(tài),直到任務(wù)結(jié)束后變?yōu)閽炱馉顟B(tài)。因此通過一句話總結(jié)就是,后臺(tái)任務(wù)是系統(tǒng)提供給的讓App在后臺(tái)短暫保持活躍狀態(tài)的功能。

后臺(tái)任務(wù)與后臺(tái)常駐App的區(qū)別

后臺(tái)任務(wù)只是短暫的讓App在后臺(tái)保持活躍狀態(tài),任務(wù)結(jié)束后App會(huì)變?yōu)閽炱馉顟B(tài),不用額外的權(quán)限申請(qǐng)。而后臺(tái)常駐App是在后臺(tái)一直保持活躍狀態(tài),例如音頻類App、地圖類App,即使進(jìn)入后臺(tái),App一致是活躍狀態(tài)。此類型App屬于特殊類型,需要申請(qǐng)?zhí)厥鈾?quán)限。

后臺(tái)任務(wù)使用

正確開啟后臺(tái)任務(wù)

  • api介紹
//Marks the start of a task that should continue if the app enters the background.
- (UIBackgroundTaskIdentifier)beginBackgroundTaskWithExpirationHandler:(void (^)(void))handler;
}

//Marks the end of a specific long-running background task.
- (void)endBackgroundTask:(UIBackgroundTaskIdentifier)identifier;
  • 任務(wù)開啟和結(jié)束
UIApplication *app;
UIBackgroundTaskIdentifier wbTaskID;
- (void)WBStartTask{
    bgTaskID = [app beginBackgroundTaskWithExpirationHandler:^{
        NSLog(@"wb__==: %lu", (unsigned long)wbTaskID);
        [app endBackgroundTask:wbTaskID];
    }];
}

- (void)WBEndTask{
    [app endBackgroundTask:wbTaskID];
}
  • 注意事項(xiàng)
    beginBackgroundTaskWithExpirationHandler:、endBackgroundTask:必須成對(duì)出現(xiàn),否則會(huì)觸發(fā)存后臺(tái)任務(wù)泄漏。

后臺(tái)任務(wù)的執(zhí)行時(shí)間

不同版本的系統(tǒng)后臺(tái)任務(wù)執(zhí)行時(shí)間也不一樣,明細(xì)如下:

系統(tǒng) 理論時(shí)間(s) 實(shí)測(cè)時(shí)間(s)
<= iOS6 600 -
iOS7 - iOS12 180 176
>= iOS13 30 26

以上時(shí)間為打點(diǎn)測(cè)試,測(cè)試的是任務(wù)開始到結(jié)束的時(shí)間,并不是App由活躍到掛起的時(shí)間,掛起時(shí)間可以通過xcode控制臺(tái)進(jìn)行測(cè)試,這里就不詳細(xì)介紹了。

后臺(tái)任務(wù)對(duì)App后臺(tái)存活時(shí)間的影響

錯(cuò)誤的使用后臺(tái)任務(wù)都會(huì)導(dǎo)致App在后臺(tái)被系統(tǒng)強(qiáng)殺。主要包括兩個(gè)方面:后臺(tái)任務(wù)超時(shí)后臺(tái)任務(wù)泄漏。后臺(tái)任務(wù)超時(shí)是后臺(tái)任務(wù)規(guī)定時(shí)間內(nèi)沒有完成相關(guān)的耗時(shí)操作并且沒有結(jié)束任務(wù),導(dǎo)致超時(shí);而后臺(tái)任務(wù)泄露是由于開啟了后臺(tái)任務(wù),當(dāng)任務(wù)執(zhí)行完成后沒有將任務(wù)結(jié)束導(dǎo)致的。因此如果不合理的使用后臺(tái)任務(wù),App大概率會(huì)被系統(tǒng)殺死,大大降低了App在后臺(tái)的存活時(shí)間。

后臺(tái)任務(wù)超時(shí)

什么時(shí)后臺(tái)任務(wù)超時(shí)

一句話總結(jié)就是在后臺(tái)任務(wù)中執(zhí)行耗時(shí)操作,任務(wù)執(zhí)行結(jié)束后耗時(shí)操作仍然在執(zhí)行。

什么場(chǎng)景會(huì)導(dǎo)致后臺(tái)任務(wù)超時(shí)

蘋果已經(jīng)給出了任務(wù)超時(shí)不同場(chǎng)景,筆者對(duì)場(chǎng)景進(jìn)行了模擬,下面是筆者通過demo觸發(fā)任務(wù)超時(shí)后的crash日志,通過code碼進(jìn)行了歸類。

  • 0xbada5e47 開啟的后臺(tái)任務(wù)超過閾值,目前閾值為1000個(gè),如果開啟的后臺(tái)任務(wù)超過1000,進(jìn)入后臺(tái)后會(huì)被系統(tǒng)強(qiáng)殺。

復(fù)現(xiàn)場(chǎng)景:開啟大于1000個(gè)后臺(tái)任務(wù),demo驗(yàn)證后日志如下:

Incident Identifier: 58790B23-E0E9-4650-AC5E-4023A662C7BE
CrashReporter Key:   1610ccc74368b31360a22139adc06b185565627b
Hardware Model:      iPhone8,1
Process:             OOMTestProjcet [63403]
Path:                /private/var/containers/Bundle/Application/11D48709-CDFB-4A60-A730-FA84E8CFB989/OOMTestProjcet.app/OOMTestProjcet
Identifier:          wmm.OOMTestProjcet
Version:             1 (1.0)
Code Type:           ARM-64 (Native)
Role:                Foreground
Parent Process:      launchd [1]
Coalition:           wmm.OOMTestProjcet [6715]

Date/Time:           2019-08-29 11:02:07.5557 +0800
Launch Time:         2019-08-29 11:01:47.5072 +0800
OS Version:          iPhone OS 11.2.1 (15C153)
Baseband Version:    4.30.02
Report Version:      104
Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Termination Reason: Namespace ASSERTIOND, Code 0xbada5e47
Triggered by Thread:  0
Filtered syslog:
None found
Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x00000001824c17c4 kevent_id + 8
1   libdispatch.dylib               0x0000000182346498 _dispatch_kq_poll + 208
2   libdispatch.dylib               0x0000000182346e88 _dispatch_event_loop_wait_for_ownership$VARIANT$mp + 432
3   libdispatch.dylib               0x0000000182338b44 _dispatch_sync_wait + 416
4   AssertionServices               0x0000000184eeac54 -[BKSAssertion invalidate] + 84
5   UIKit                           0x000000018bedbfc4 -[_UIBackgroundTaskInfo invalidate] + 44
6   UIKit                           0x000000018c10d904 -[UIApplication _endBackgroundTask:] + 84
7   libdispatch.dylib               0x000000018232aa14 _dispatch_client_callout + 16
8   libdispatch.dylib               0x0000000182332200 _dispatch_block_invoke_direct$VARIANT$mp + 288
9   FrontBoardServices              0x00000001850a67f8 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 36
10  FrontBoardServices              0x00000001850a649c -[FBSSerialQueue _performNext] + 404
11  FrontBoardServices              0x00000001850a6a38 -[FBSSerialQueue _performNextFromRunLoopSource] + 56
12  CoreFoundation                  0x000000018295697c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
13  CoreFoundation                  0x00000001829568fc __CFRunLoopDoSource0 + 88

此外,還有一種場(chǎng)景會(huì)觸發(fā)0xbada5e47,當(dāng)在任務(wù)到期后執(zhí)行ExpirationHandler,如果此時(shí)ExpirationHandler中存在耗時(shí)操作,大概率會(huì)觸發(fā)被系統(tǒng)強(qiáng)殺,錯(cuò)誤碼同樣為0xbada5e47。因此要切記不要在到期ExpirationHandler中執(zhí)行耗時(shí)操作。

  • 0xdead10cc這個(gè)類型是App掛起之后仍然有訪問資源操作導(dǎo)致的,并且網(wǎng)上有人也反饋過此類型,如果掛起后,還存在數(shù)據(jù)庫訪問、系統(tǒng)資源訪問等,App會(huì)馬上被系統(tǒng)強(qiáng)殺。因此推測(cè)這應(yīng)該是蘋果為保護(hù)資源數(shù)據(jù)強(qiáng)制將App殺死的。

此類型筆者沒有模擬出來,有模擬出來的同學(xué)可以一起交流一下。

  • 0x8badf00d這個(gè)code碼大家都很熟悉了,這個(gè)是出發(fā)了蘋果的“看門狗”機(jī)制,導(dǎo)致App被強(qiáng)殺了,主要是因?yàn)橹骶€程卡住的時(shí)間太長(zhǎng)導(dǎo)致的。后臺(tái)任務(wù)中如果耗時(shí)太長(zhǎng)卡住時(shí)間太久,同樣也會(huì)觸發(fā)“看門狗”。

復(fù)現(xiàn)場(chǎng)景:1、在后臺(tái)任務(wù)中開啟信號(hào)量耗時(shí)操作,demo驗(yàn)證日志如下:

Incident Identifier: DDF069DB-99FE-4BC7-A21B-AE4D7B0F7EFE
CrashReporter Key:   1610ccc74368b31360a22139adc06b185565627b
Hardware Model:      iPhone8,1
Process:             OOMTestProjcet [64970]
Path:                /private/var/containers/Bundle/Application/07A24A30-F1BE-4816-9167-E71D3E9350B1/OOMTestProjcet.app/OOMTestProjcet
Identifier:          wmm.OOMTestProjcet
Version:             1 (1.0)
Code Type:           ARM-64 (Native)
Role:                Foreground
Parent Process:      launchd [1]
Coalition:           wmm.OOMTestProjcet [7485]

Date/Time:           2019-08-29 16:03:07.1169 +0800
Launch Time:         2019-08-29 16:01:50.2218 +0800
OS Version:          iPhone OS 11.2.1 (15C153)
Baseband Version:    4.30.02
Report Version:      104
Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Termination Reason: Namespace ASSERTIOND, Code 0x8badf00d
Triggered by Thread:  0
Filtered syslog:
None found
Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x000000018249f5a4 semaphore_wait_trap + 8
1   libdispatch.dylib               0x000000018232cf04 _dispatch_sema4_wait$VARIANT$mp + 24
2   libdispatch.dylib               0x000000018232d8b4 _dispatch_semaphore_wait_slow + 140
3   OOMTestProjcet                  0x00000001029a5440 0x1029a0000 + 21568
4   UIKit                           0x000000018bec46b4 -[UIApplication sendAction:to:from:forEvent:] + 96
5   UIKit                           0x000000018bec4634 -[UIControl sendAction:to:forEvent:] + 80
6   UIKit                           0x000000018beaf1dc -[UIControl _sendActionsForEvents:withEvent:] + 440
7   UIKit                           0x000000018bec3f28 -[UIControl touchesEnded:withEvent:] + 576
8   UIKit                           0x000000018bec3a48 -[UIWindow _sendTouchesForEvent:] + 2544
9   UIKit                           0x000000018bebef60 -[UIWindow sendEvent:] + 3208
10  UIKit                           0x000000018be8ff64 -[UIApplication sendEvent:] + 340
11  UIKit                           0x000000018c7e531c __dispatchPreprocessedEventFromEventQueue + 2364
12  UIKit                           0x000000018c7e78a8 __handleEventQueueInternal + 4760
13  UIKit                           0x000000018c7e07c0 __handleHIDEventFetcherDrain + 152
14  CoreFoundation                  0x000000018295697c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
15  CoreFoundation                  0x00000001829568fc __CFRunLoop

復(fù)現(xiàn)場(chǎng)景:2、開啟后臺(tái)任務(wù),進(jìn)入后臺(tái)開始在沙箱中寫大量數(shù)據(jù),保證寫操作超過3分鐘,日志如下:

Incident Identifier: 17143F71-7CB2-4A70-A7EA-1862B13C18AE
CrashReporter Key:   1610ccc74368b31360a22139adc06b185565627b
Hardware Model:      iPhone8,1
Process:             OOMTestProjcet [65618]
Path:                /private/var/containers/Bundle/Application/0C35DEAD-4D08-4F40-A0D3-B005580B3FE1/OOMTestProjcet.app/OOMTestProjcet
Identifier:          wmm.OOMTestProjcet
Version:             1 (1.0)
Code Type:           ARM-64 (Native)
Role:                Foreground
Parent Process:      launchd [1]
Coalition:           wmm.OOMTestProjcet [7875]

Date/Time:           2019-08-29 17:58:46.0048 +0800
Launch Time:         2019-08-29 17:55:42.5324 +0800
OS Version:          iPhone OS 11.2.1 (15C153)
Baseband Version:    4.30.02
Report Version:      104
Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Termination Reason: Namespace ASSERTIOND, Code 0x8badf00d
Triggered by Thread:  0
Filtered syslog:
None found
Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x00000001824a1014 write + 8
1   Foundation                      0x00000001832bf950 _NSWriteToFileDescriptorWithProgress + 216
2   Foundation                      0x000000018338ab34 ___NSWriteDataToFileWithExtendedAttributes_block_invoke + 76
3   Foundation                      0x00000001832bf864 -[NSData+ 141412 (NSData) enumerateByteRangesUsingBlock:] + 88
4   Foundation                      0x00000001832bdc08 _NSWriteDataToFileWithExtendedAttributes + 576
5   Foundation                      0x00000001833a7a24 writeStringToURLOrPath + 224
6   OOMTestProjcet                  0x0000000102665c5c 0x102660000 + 23644
7   OOMTestProjcet                  0x0000000102665960 0x102660000 + 22880
8   UIKit                           0x000000018c0f38f0 -[UIApplication workspaceNoteAssertionExpirationImminent:] + 284
9   libdispatch.dylib               0x000000018232aa14 _dispatch_client_callout + 16
10  libdispatch.dylib               0x0000000182332200 _dispatch_block_invoke_direct$VARIANT$mp + 288
11  FrontBoardServices              0x00000001850a67f8 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 36
12  FrontBoardServices              0x00000001850a649c -[FBSSerialQueue _performNext] + 404
13  FrontBoardServices              0x00000001850a6a38 -[FBSSerialQueue _performNextFromRunLoopSource] + 56
14  CoreFoundation                  0x000000018295697c __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24

以上兩種場(chǎng)景復(fù)現(xiàn)的都是ASSERTIOND類型的0x8badf00d

復(fù)現(xiàn)場(chǎng)景:3、開啟后臺(tái)任務(wù),在任務(wù)塊外執(zhí)行大量的寫文件操作,寫操作耗時(shí)超過3分鐘,日志如下:

Incident Identifier: 1AFADC47-B4ED-4E3A-9214-337A21980B76
CrashReporter Key:   1610ccc74368b31360a22139adc06b185565627b
Hardware Model:      iPhone8,1
Process:             CPUTestTwo [66835]
Path:                /private/var/containers/Bundle/Application/BCAC7616-0A9B-419F-BE1C-B4809BC06A01/CPUTestTwo.app/CPUTestTwo
Identifier:          wmm.CPUTestTwo
Version:             1 (1.0)
Code Type:           ARM-64 (Native)
Role:                Foreground
Parent Process:      launchd [1]
Coalition:           wmm.CPUTestTwo [8128]

Date/Time:           2019-08-30 11:37:11.3806 +0800
Launch Time:         2019-08-30 11:36:10.0978 +0800
OS Version:          iPhone OS 11.2.1 (15C153)
Baseband Version:    4.30.02
Report Version:      104
Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Termination Reason: Namespace SPRINGBOARD, Code 0x8badf00d
Termination Description: SPRINGBOARD, scene-update watchdog transgression: wmm.CPUTestTwo exhausted real (wall clock) time allowance of 10.00 seconds |  | ProcessVisibility: Foreground | ProcessState: Running | WatchdogEvent: scene-update | WatchdogVisibility: Foreground | WatchdogCPUStatistics: ( | "Elapsed total CPU time (seconds): 1.870 (user 1.870, system 0.000), 22% CPU", | "Elapsed application CPU time (seconds): 1.284, 15% CPU" | )
Triggered by Thread:  0
Filtered syslog:
None found
Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x00000001824a1014 write + 8
1   Foundation                      0x00000001832bf950 _NSWriteToFileDescriptorWithProgress + 216
2   Foundation                      0x000000018338ab34 ___NSWriteDataToFileWithExtendedAttributes_block_invoke + 76
3   Foundation                      0x00000001832bf864 -[NSData+ 141412 (NSData) enumerateByteRangesUsingBlock:] + 88
4   Foundation                      0x00000001832bdc08 

上面場(chǎng)景復(fù)現(xiàn)的是SPRINGBOARD類型的0x8badf00d

后臺(tái)任務(wù)泄露

什么是后臺(tái)任務(wù)泄露

后臺(tái)任務(wù)泄露是開啟后臺(tái)任務(wù)后當(dāng)任務(wù)執(zhí)行完成沒有執(zhí)行結(jié)束任務(wù)操作,導(dǎo)致開啟的任務(wù)無法結(jié)束,此時(shí)就出現(xiàn)了任務(wù)泄漏。

什么場(chǎng)景會(huì)導(dǎo)致后臺(tái)任務(wù)泄露

首先我們來先看一段代碼:

- (void)WBStartTask{
    self.wbtaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{
        NSLog(@"wbtaskid__==: %lu", (unsigned long)self.wbtaskId);
        [[UIApplication sharedApplication] endBackgroundTask:self.wbtaskId];
    }];
}

- (void)WBEndBgTask{
    [[UIApplication sharedApplication] endBackgroundTask:self.wbtaskId];
}

上面的代碼如果WBStartTask執(zhí)行兩次,就一定會(huì)出現(xiàn)后臺(tái)任務(wù)泄露,因?yàn)閟elf.wbtaskId第二次會(huì)被賦予一個(gè)新的id,之前的self.wbtaskId就丟失了,無法正確調(diào)用end。日志如下:

Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFYTermination
Reason: Namespace SPRINGBOARD,Code 0x8badf00d

可以看到日志code也是0x8badf00d, 那怎么判斷觸發(fā)0x8badf00d是“看門狗”導(dǎo)致的還是任務(wù)泄露導(dǎo)致的呢?這就要看主線程的崩潰日志了,如下:

Thread 0 Crashed:0  
libsystem_kernel.dylib         0x000000018472be08 0x18472b000 + 35921  
libsystem_kernel.dylib         0x000000018472bc80 0x18472b000 + 32002  
CoreFoundation                 0x0000000184c6ee40 0x184b81000 + 9744003  
CoreFoundation                 0x0000000184c6c908 0x184b81000 + 9648724  
CoreFoundation                 0x0000000184b8cda8 0x184b81000 + 485525  
GraphicsServices               0x0000000186b6f020 0x186b64000 + 450886  
UIKit                         0x000000018eb6d78c 0x18e850000 + 32664447  
Messenger                     0x0000000103015ee4 0x102ff8000 + 1225968   libdyld.dylib                 0x000000018461dfc0 0x18461d000 + 4032

這個(gè)日志表示當(dāng)前的UI線程處于閑置狀態(tài),這種狀態(tài)下被系統(tǒng)殺死,大概率就是因?yàn)楹笈_(tái)任務(wù)泄露導(dǎo)致的。注意:不是說所有的這種日志都是后臺(tái)任務(wù)導(dǎo)致的,而是錯(cuò)誤碼為0x8badf00d,此時(shí)被殺的原因大概率是后臺(tái)任務(wù)泄露,不是絕對(duì)的。下面我們來復(fù)現(xiàn)一下。

復(fù)現(xiàn)場(chǎng)景:1、多次開啟后臺(tái)任務(wù),并且沒有在后臺(tái)任務(wù)塊中執(zhí)行endBackgroundTask。2、開啟一個(gè)后臺(tái)任務(wù),在ExpirationHandler塊中開子線程做耗時(shí)操作,然后回到主線程執(zhí)行endBackgroundTask。3、開啟一個(gè)后臺(tái)任務(wù),然后開啟子線程執(zhí)行大量耗時(shí)操作,經(jīng)過demo驗(yàn)證日志如下:

Incident Identifier: 3E16AE66-9CBE-43EC-AABE-CB136E415BAA
CrashReporter Key:   1610ccc74368b31360a22139adc06b185565627b
Hardware Model:      iPhone8,1
Process:             OOMTestProjcet [65256]
Path:                /private/var/containers/Bundle/Application/6D8FA48B-6DCE-4E7B-821E-3A152ED47A04/OOMTestProjcet.app/OOMTestProjcet
Identifier:          wmm.OOMTestProjcet
Version:             1 (1.0)
Code Type:           ARM-64 (Native)
Role:                Foreground
Parent Process:      launchd [1]
Coalition:           wmm.OOMTestProjcet [7645]

Date/Time:           2019-08-29 16:57:19.0419 +0800
Launch Time:         2019-08-29 16:54:13.7964 +0800
OS Version:          iPhone OS 11.2.1 (15C153)
Baseband Version:    4.30.02
Report Version:      104
Exception Type:  EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note:  EXC_CORPSE_NOTIFY
Termination Reason: Namespace ASSERTIOND, Code 0x8badf00d
Triggered by Thread:  0
Filtered syslog:
None found
Thread 0 name:  Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0   libsystem_kernel.dylib          0x000000018249f568 mach_msg_trap + 8
1   libsystem_kernel.dylib          0x000000018249f3e0 mach_msg + 72
2   CoreFoundation                  0x0000000182956308 __CFRunLoopServiceMachPort + 196
3   CoreFoundation                  0x0000000182953ed4 __CFRunLoopRun + 1424
4   CoreFoundation                  0x0000000182873e58 CFRunLoopRunSpecific + 436
5   GraphicsServices                0x0000000184720f84 GSEventRunModal + 100
6   UIKit                           0x000000018bef367c UIApplicationMain + 236
7   OOMTestProjcet                  0x0000000100d3d838 0x100d38000 + 22584
8   libdyld.dylib                   0x000000018239056c start + 4

此外,在iOS11.0.2上,出現(xiàn)了“看門狗”相關(guān)的crash,該crash跟通知相關(guān),這是iOS11系統(tǒng)上的一個(gè)bug,在前臺(tái)收到通知后,進(jìn)入后臺(tái),短時(shí)間內(nèi)會(huì)被殺死。該問題蘋果官方解釋11.2系統(tǒng)上已解決。日志如下:

Exception Type: EXC_CRASH (SIGKILL)
Exception Codes: 0x0000000000000000, 0x0000000000000000
Exception Note: EXC_CORPSE_NOTIFY
Termination Reason: Namespace &#x3c;0xF&#x3e;, Code 0x8badf00d
Triggered by Thread: 0
Filtered syslog:
None found
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libsystem_kernel.dylib         0x0000000186554bc4 mach_msg_trap + 8
1 libsystem_kernel.dylib         0x0000000186554a3c mach_msg + 72
2 CoreFoundation                  0x0000000186a03ce4 __CFRunLoopServiceMachPort + 196
3 CoreFoundation                  0x0000000186a018b0 __CFRunLoopRun + 1424
4 CoreFoundation                  0x00000001869222d8 CFRunLoopRunSpecific + 436
5 GraphicsServices                0x00000001887b3f84 GSEventRunModal + 100
6 UIKit                                    0x000000018fecf880 UIApplicationMain + 208
7 TerminateTest                     0x0000000104d6096c 0x104d58000 + 35180
8 libdyld.dylib                         0x000000018644656c start + 4

總結(jié)

本文從后臺(tái)任務(wù)與后臺(tái)常駐App的區(qū)別慢慢引出了后臺(tái)任務(wù)的相關(guān)技術(shù),并且在后臺(tái)任務(wù)使用上和后臺(tái)任務(wù)存在的壁壘分析了不同場(chǎng)景下使用后臺(tái)任務(wù)存在的問題,以及不同場(chǎng)景下觸發(fā)的錯(cuò)誤日志。筆者希望這些場(chǎng)景分析以及錯(cuò)誤日志可以幫助大家更好的了解后臺(tái)任務(wù),能夠在平時(shí)使用后臺(tái)任務(wù)時(shí)引起警惕,當(dāng)然這里并不是強(qiáng)調(diào)后臺(tái)任務(wù)不好或者后臺(tái)任務(wù)存在風(fēng)險(xiǎn),只是讓大家快速了解并認(rèn)識(shí)后臺(tái)任務(wù),將來減少踩坑風(fēng)險(xiǎn),僅此而已。如有紕漏,敬請(qǐng)指正。

參考文獻(xiàn)

https://mp.weixin.qq.com/s/r0Q7um7P1p2gIb0aHldyNw 微信內(nèi)存監(jiān)控方案

http://www.itdecent.cn/p/deee6fedb510 iOS內(nèi)存分析下-前臺(tái)內(nèi)存耗盡閃退(FOOM)

https://satanwoo.github.io/2017/10/18/abort/ iOS內(nèi)存abort(Jetsam) 原理探究

http://www.cocoachina.com/articles/23281 基于 JetsamEvent 探究 APP 最大內(nèi)存占用上限

https://engineering.fb.com/ios/reducing-fooms-in-the-facebook-ios-app/ facebook內(nèi)存警告的處理方案

http://mrpeak.cn/blog/ios-hard-stall-detection/ 檢測(cè)內(nèi)存oom的分析

https://juejin.im/post/5c28646f5188257abf1d947d iOS Out-Of-Memory 原理闡述及方案調(diào)研

http://www.cocoachina.com/articles/23981 OOM探究:XNU 內(nèi)存狀態(tài)管理

https://juejin.im/post/5bec0efcf265da61273cf333 iOS 內(nèi)存管理研究

https://jinxuebin.cn/2019/07/OOM%E5%BA%95%E5%B1%82%E5%8E%9F%E7%90%86%E6%8E%A2%E7%A9%B6/ iOS中OOM底層原理探究

https://blog.csdn.net/u011146511/article/details/76653168 iOS 之蘋果運(yùn)行機(jī)制總結(jié)

http://www.itdecent.cn/p/7c0bec45f7c1 iOS App 后臺(tái)任務(wù)的坑!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容