1"use strict";(self.webpackChunkshake=self.webpackChunkshake||[]).push([[1768],{1470:(e,a,t)=>{t.d(a,{A:()=>w});var n=t(6540),r=t(4164),i=t(7559),l=t(3104),s=t(6347),o=t(205),c=t(7485),u=t(1682),d=t(679);function h(e){return n.Children.toArray(e).filter(e=>"\n"!==e).map(e=>{if(!e||(0,n.isValidElement)(e)&&function(e){const{props:a}=e;return!!a&&"object"==typeof a&&"value"in a}(e))return e;throw new Error(`Docusaurus error: Bad <Tabs> child <${"string"==typeof e.type?e.type:e.type.name}>: all children of the <Tabs> component should be <TabItem>, and every <TabItem> should have a unique "value" prop.`)})?.filter(Boolean)??[]}function p(e){const{values:a,children:t}=e;return(0,n.useMemo)(()=>{const e=a??function(e){return h(e).map(e=>{let{props:{value:a,label:t,attributes:n,default:r}}=e;return{value:a,label:t,attributes:n,default:r}})}(t);return function(e){const a=(0,u.XI)(e,(e,a)=>e.value===a.value);if(a.length>0)throw new Error(`Docusaurus error: Duplicate values "${a.map(e=>e.value).join(", ")}" found in <Tabs>. Every value needs to be unique.`)}(e),e},[a,t])}function v(e){let{value:a,tabValues:t}=e;return t.some(e=>e.value===a)}function m(e){let{queryString:a=!1,groupId:t}=e;const r=(0,s.W6)(),i=function(e){let{queryString:a=!1,groupId:t}=e;if("string"==typeof a)return a;if(!1===a)return null;if(!0===a&&!t)throw new Error('Docusaurus error: The <Tabs> component groupId prop is required if queryString=true, because this value is used as the search param name. You can also provide an explicit value such as queryString="my-search-param".');return t??null}({queryString:a,groupId:t});return[(0,c.aZ)(i),(0,n.useCallback)(e=>{if(!i)return;const a=new URLSearchParams(r.location.search);a.set(i,e),r.replace({...r.location,search:a.toString()})},[i,r])]}function b(e){const{defaultValue:a,queryString:t=!1,groupId:r}=e,i=p(e),[l,s]=(0,n.useState)(()=>function(e){let{defaultValue:a,tabValues:t}=e;if(0===t.length)throw new Error("Docusaurus error: the <Tabs> component requires at least one <TabItem> children component");if(a){if(!v({value:a,tabValues:t}))throw new Error(`Docusaurus error: The <Tabs> has a defaultValue "${a}" but none of its children has the corresponding value. Available values are: ${t.map(e=>e.value).join(", ")}. If you intend to show no default tab, use defaultValue={null} instead.`);return a}const n=t.find(e=>e.default)??t[0];if(!n)throw new Error("Unexpected error: 0 tabValues");return n.value}({defaultValue:a,tabValues:i})),[c,u]=m({queryString:t,groupId:r}),[h,b]=function(e){let{groupId:a}=e;const t=function(e){return e?`docusaurus.tab.${e}`:null}(a),[r,i]=(0,d.Dv)(t);return[r,(0,n.useCallback)(e=>{t&&i.set(e)},[t,i])]}({groupId:r}),f=(()=>{const e=c??h;return v({value:e,tabValues:i})?e:null})();(0,o.A)(()=>{f&&s(f)},[f]);return{selectedValue:l,selectValue:(0,n.useCallback)(e=>{if(!v({value:e,tabValues:i}))throw new Error(`Can't select invalid tab value=${e}`);s(e),u(e),b(e)},[u,b,i]),tabValues:i}}var f=t(2303);const x={tabList:"tabList__CuJ",tabItem:"tabItem_LNqP"};var g=t(4848);function y(e){let{className:a,block:t,selectedValue:n,selectValue:i,tabValues:s}=e;const o=[],{blockElementScrollPositionUntilNextRender:c}=(0,l.a_)(),u=e=>{const a=e.currentTarget,t=o.indexOf(a),r=s[t].value;r!==n&&(c(a),i(r))},d=e=>{let a=null;switch(e.key){case"Enter":u(e);break;case"ArrowRight":{const t=o.indexOf(e.currentTarget)+1;a=o[t]??o[0];break}case"ArrowLeft":{const t=o.indexOf(e.currentTarget)-1;a=o[t]??o[o.length-1];break}}a?.focus()};return(0,g.jsx)("ul",{role:"tablist","aria-orientation":"horizontal",className:(0,r.A)("tabs",{"tabs--block":t},a),children:s.map(e=>{let{value:a,label:t,attributes:i}=e;return(0,g.jsx)("li",{role:"tab",tabIndex:n===a?0:-1,"aria-selected":n===a,ref:e=>{o.push(e)},onKeyDown:d,onClick:u,...i,className:(0,r.A)("tabs__item",x.tabItem,i?.className,{"tabs__item--active":n===a}),children:t??a},a)})})}function j(e){let{lazy:a,children:t,selectedValue:i}=e;const l=(Array.isArray(t)?t:[t]).filter(Boolean);if(a){const e=l.find(e=>e.props.value===i);return e?(0,n.cloneElement)(e,{className:(0,r.A)("margin-top--md",e.props.className)}):null}return(0,g.jsx)("div",{className:"margin-top--md",children:l.map((e,a)=>(0,n.cloneElement)(e,{key:a,hidden:e.props.value!==i}))})}function k(e){const a=b(e);return(0,g.jsxs)("div",{className:(0,r.A)(i.G.tabs.container,"tabs-container",x.tabList),
1children:[(0,g.jsx)(y,{...a,...e}),(0,g.jsx)(j,{...a,...e})]})}function w(e){const a=(0,f.A)();return(0,g.jsx)(k,{...e,children:h(e.children)},String(a))}},8321:(e,a,t)=>{t.r(a),t.d(a,{assets:()=>u,contentTitle:()=>c,default:()=>p,frontMatter:()=>o,metadata:()=>n,toc:()=>d});const n=JSON.parse('{"id":"android/configuration-and-data/black-box","title":"Black box","description":"Just like before an airplane crash, Shake records a detailed environment","source":"@site/docs/android/configuration-and-data/black-box.md","sourceDirName":"android/configuration-and-data","slug":"/android/configuration-and-data/black-box","permalink":"/docs/android/configuration-and-data/black-box","draft":false,"unlisted":false,"tags":[],"version":"current","frontMatter":{"id":"black-box","title":"Black box"},"sidebar":"androidSidebar","previous":{"title":"Activity history","permalink":"/docs/android/configuration-and-data/activity-history"},"next":{"title":"Ticket metadata","permalink":"/docs/android/configuration-and-data/ticket-metadata"}}');var r=t(4848),i=t(8453),l=(t(6025),t(1470)),s=t(9365);const o={id:"black-box",title:"Black box"},c=void 0,u={},d=[{value:"Automatically recorded charts",id:"automatically-recorded-charts",level:2},{value:"Device memory usage",id:"device-memory-usage",level:3},{value:"App memory usage",id:"app-memory-usage",level:3},{value:"Disk space usage",id:"disk-space-usage",level:3},{value:"Network",id:"network",level:3},{value:"Device orientation",id:"device-orientation",level:3},{value:"Battery level",id:"battery-level",level:3},{value:"Disable",id:"disable",level:2}];function h(e){const a={a:"a",blockquote:"blockquote",code:"code",h2:"h2",h3:"h3",li:"li",p:"p",pre:"pre",ul:"ul",...(0,i.R)(),...e.components};return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsxs)(a.blockquote,{children:["\n",(0,r.jsx)(a.p,{children:"Just like before an airplane crash, Shake records a detailed environment\nprofile giving you an insight into the last 60 seconds before the ticket was submitted."}),"\n"]}),"\n",(0,r.jsx)("p",{class:"p2 mt-40",children:(0,r.jsxs)(a.p,{children:["You're viewing the Android docs. Other platforms \u2192\xa0\n",(0,r.jsx)("a",{href:"/docs/ios/configuration-and-data/black-box",children:"iOS"}),"\xa0\n",(0,r.jsx)("a",{href:"/docs/react/configuration-and-data/black-box",children:"React Native"}),"\xa0\n",(0,r.jsx)("a",{href:"/docs/flutter/configuration-and-data/black-box",children:"Flutter"}),"\xa0"]})}),"\n",(0,r.jsx)(a.h2,{id:"automatically-recorded-charts",children:"Automatically recorded charts"}),"\n",(0,r.jsx)(a.h3,{id:"device-memory-usage",children:"Device memory usage"}),"\n",(0,r.jsxs)(a.p,{children:["This line chart (visible in every ticket on your ",(0,r.jsx)(a.a,{href:"https://app.shakebugs.com/",children:"Shake dashboard"}),") shows\nthe device's total memory usage.\nWhen you hover over the chart, the usage percentage\nand the exact memory usage over the total amount of memory available\nare shown. For example:"]}),"\n",(0,r.jsxs)(a.ul,{children:["\n",(0,r.jsx)(a.li,{children:"9% \u2022 224 out of 2464 MB"}),"\n"]}),"\n",(0,r.jsx)(a.p,{children:"Device memory usage is captured every 0.5 seconds."}),"\n",(0,r.jsx)(a.h3,{id:"app-memory-usage",children:"App memory usage"}),"\n",(0,r.jsx)(a.p,{children:"This line chart shows your app's memory usage. When you hover over the chart,\nthe total memory usage of your app is shown. For example:"}),"\n",(0,r.jsxs)(a.ul,{children:["\n",(0,r.jsx)(a.li,{children:"122 MB"}),"\n"]}),"\n",(0,r.jsx)(a.p,{children:"Your app's memory usage is captured every 0.5 seconds."}),"\n",(0,r.jsx)(a.h3,{id:"disk-space-usage",children:"Disk space usage"}),"\n",(0,r.jsx)(a.p,{children:"This line chart shows your device's disk space usage. When you hover over the chart,\nthe percentage of free disk space on your device is shown. For example:"}),"\n",(0,r.jsxs)(a.ul,{children:["\n",(0,r.jsx)(a.li,{children:"51%"}),"\n"]}),"\n",(0,r.jsx)(a.p,{children:"Your device's disk space usage is captured every 0.5 seconds."}),"\n",(0,r.jsx)(a.h3,{id:"network",children:"Network"}),"\n",(0,r.jsx)(a.p,{children:"This chart shows the connectivity details of the device.\nWhen you hover over the chart, connectivity details are shown. For example:"}),"\n",(0,r.jsxs)(a.ul,{children:["\n",(0,r.jsx)(a.li,{children:"WiFi \u2022 Office_Network_Name"}),"\n",(0,r.jsx)(a.li,{children:"Cellular 3G"}),"\n",(0,r.jsx)(a.li,{children:"Offline"}),"\n"]}),"\n",(0,r.jsx)(a.p,{children:"Device connectivity details are captured every 2 seconds."}),"\n",(0,r.jsx)(a.h3,{id:"device-orientation",children:"Device orientation"}),"\n",(0,r.jsx)(a.p,{children:"This chart shows the orientation state of your app.\nWhen you hover over the chart, the exact state is shown. For example:"}),"\n",(0,r.jsxs)(a.ul,{children:["\n",(0,r.jsx)(a.li,{children:"Portrait"}),"\n",(0,r.jsx)(a.li,{children:"Landscape"}),"\n"]}),"\n",(0,r.jsx)(a.p,{children:"App orientation is captured every 2 seconds."}),"\n",(0,r.jsx)(a.h3,{id:"battery-level",children:"Battery level"}),"\n",(0,r.jsx)(a.p,{children:"This chart shows the battery level of your app.\nWhen you hover over the chart, the exact level is shown. For example:"}),"\n",(0,r.jsxs)(a.ul,{children:["\n",(0,r.jsx)(a.li,{children:"50%"}),"\n"]}),"\n",(0,r.jsx)(a.p,{children:"Battery level is captured every 2 seconds."}),"\n",(0,r.jsx)(a.h2,{id:"disable",children:"Disable"}),"\n",(0,r.jsx)(a.p,{children:"The Black box is enabled by default. Use the method below to disable it, if you prefer:"}),"\n","\n",(0,r.jsxs)(l.A,{groupId:"android",defaultValue:"kotlin",values:[{label:"Java",value:"java"},{label:"Kotlin",value:"kotlin"}],children:[(0,r.jsx)(s.A,{value:"java",children:(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-java",metastring:'title="Ap
1p.java"',children:"// highlight-next-line\nShake.getReportConfiguration().setEnableBlackBox(false);\n"})})}),(0,r.jsx)(s.A,{value:"kotlin",children:(0,r.jsx)(a.pre,{children:(0,r.jsx)(a.code,{className:"language-kotlin",metastring:'title="App.kt"',children:"// highlight-next-line\nShake.getReportConfiguration().isEnableBlackBox = false\n"})})})]})]})}function p(e={}){const{wrapper:a}={...(0,i.R)(),...e.components};return a?(0,r.jsx)(a,{...e,children:(0,r.jsx)(h,{...e})}):h(e)}},8453:(e,a,t)=>{t.d(a,{R:()=>l,x:()=>s});var n=t(6540);const r={},i=n.createContext(r);function l(e){const a=n.useContext(i);return n.useMemo(function(){return"function"==typeof e?e(a):{...a,...e}},[a,e])}function s(e){let a;return a=e.disableParentContext?"function"==typeof e.components?e.components(r):e.components||r:l(e.components),n.createElement(i.Provider,{value:a},e.children)}},9365:(e,a,t)=>{t.d(a,{A:()=>l});t(6540);var n=t(4164);const r={tabItem:"tabItem_Ymn6"};var i=t(4848);function l(e){let{children:a,hidden:t,className:l}=e;return(0,i.jsx)("div",{role:"tabpanel",className:(0,n.A)(r.tabItem,l),hidden:t,children:a})}}}]);
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.