Repository files navigation

Chinese README

Android Performance Monitor Maven Central

A transparent ui-block detection library for Android, app only needs one-line-code to setup.

The naming is to pay respect to the great library LeakCanary, ui-related codes are modified from leakcanary's ui part.

  • 1.3.0 Add white-list and concern-package feature.
  • 1.3.1 Enable configuration of label and icon.

Getting started

You may choose how to assemble them as you like.

dependencies {
// most often used way, enable notification to notify block event
compile 'com.github.moduth:blockcanary-android:1.3.1'// this way you only enable BlockCanary in debug package// debugCompile 'com.github.moduth:blockcanary-android:1.3.1'// releaseCompile 'com.github.moduth:blockcanary-no-op:1.3.0'
}

As this library uses getMainLooper().setMessageLogging(), please check if you set it in your app (related issue markzhai#27)

Usage

Maximum log count is set to 500, you can rewrite it in your app int.xml.

<integername="block_canary_max_stored_count">1000</integer>

Monitor app's label and icon can be configured by placing a block_canary_icon drawable in your xhdpi drawable directory and in strings.xml:

<stringname="block_canary_display_activity_label">Blocks</string>
publicclassDemoApplicationextendsApplication {
@OverridepublicvoidonCreate() {
// ...// Do it on main processBlockCanary.install(this, newAppBlockCanaryContext()).start();
}
}

Implement your application BlockCanaryContext context (strongly recommend you to check all these configs):

publicclassAppBlockCanaryContextextendsBlockCanaryContext {
/** * Implement in your project. * * @return Qualifier which can specify this installation, like version + flavor. */publicStringprovideQualifier() {
return"unknown";
}
/** * Implement in your project. * * @return user id */publicStringprovideUid() {
return"uid";
}
/** * Network type * * @return {@link String} like 2G, 3G, 4G, wifi, etc. */publicStringprovideNetworkType() {
return"unknown";
}
/** * Config monitor duration, after this time BlockCanary will stop, use * with {@code BlockCanary}'s isMonitorDurationEnd * * @return monitor last duration (in hour) */publicintprovideMonitorDuration() {
return -1;
}
/** * Config block threshold (in millis), dispatch over this duration is regarded as a BLOCK. You may set it * from performance of device. * * @return threshold in mills */publicintprovideBlockThreshold() {
return1000;
}
/** * Thread stack dump interval, use when block happens, BlockCanary will dump on main thread * stack according to current sample cycle. * <p> * Because the implementation mechanism of Looper, real dump interval would be longer than * the period specified here (especially when cpu is busier). * </p> * * @return dump interval (in millis) */publicintprovideDumpInterval() {
returnprovideBlockThreshold();
}
/** * Path to save log, like "/blockcanary/", will save to sdcard if can. * * @return path of log files */publicStringprovidePath() {
return"/blockcanary/";
}
/** * If need notification to notice block. * * @return true if need, else if not need. */publicbooleandisplayNotification() {
returntrue;
}
/** * Implement in your project, bundle files into a zip file. * * @param src files before compress * @param dest files compressed * @return true if compression is successful */publicbooleanzip(File[] src, Filedest) {
returnfalse;
}
/** * Implement in your project, bundled log files. * * @param zippedFile zipped file */publicvoidupload(FilezippedFile) {
thrownewUnsupportedOperationException();
}
/** * Packages that developer concern, by default it uses process name, * put high priority one in pre-order. * * @return null if simply concern only package with process name. */publicList<String> concernPackages() {
returnnull;
}
/** * Filter stack without any in concern package, used with @{code concernPackages}. * * @return true if filter, false it not. */publicbooleanfilterNonConcernStack() {
returnfalse;
}
/** * Provide white list, entry in white list will not be shown in ui list. * * @return return null if you don't need white-list filter. */publicList<String> provideWhiteList() {
LinkedList<String> whiteList = newLinkedList<>();
whiteList.add("org.chromium");
returnwhiteList;
}
/** * Whether to delete files whose stack is in white list, used with white-list. * * @return true if delete, false it not. */publicbooleandeleteFilesInWhiteList() {
returntrue;
}
}

How does it work?

Blog in Chinese: BlockCanary.

Principle flow picture:

flow

Screenshot

Block detailBlock list

Contributors

This library is initially created by markzhai, and maintained under the organization moduth with nimengbo and zzz40500.

Special thanks to android-cjj, Mr.Bao, chiahaolu to contribute.

Change Log

Check CHANGELOG

Contribute

If you would like to contribute code to BlockCanary you can do so through GitHub by forking the repository and sending a pull request.

License

Copyright (C) 2016 MarkZhai (http://zhaiyifan.cn).
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

A transparent ui-block detection library for Android. (known as BlockCanary)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

Chinese README

Android Performance Monitor Maven Central

A transparent ui-block detection library for Android, app only needs one-line-code to setup.

The naming is to pay respect to the great library LeakCanary, ui-related codes are modified from leakcanary's ui part.

  • 1.3.0 Add white-list and concern-package feature.
  • 1.3.1 Enable configuration of label and icon.

Getting started

You may choose how to assemble them as you like.

dependencies {
// most often used way, enable notification to notify block event
compile 'com.github.moduth:blockcanary-android:1.3.1'// this way you only enable BlockCanary in debug package// debugCompile 'com.github.moduth:blockcanary-android:1.3.1'// releaseCompile 'com.github.moduth:blockcanary-no-op:1.3.0'
}

As this library uses getMainLooper().setMessageLogging(), please check if you set it in your app (related issue markzhai#27)

Usage

Maximum log count is set to 500, you can rewrite it in your app int.xml.

<integername="block_canary_max_stored_count">1000</integer>

Monitor app's label and icon can be configured by placing a block_canary_icon drawable in your xhdpi drawable directory and in strings.xml:

<stringname="block_canary_display_activity_label">Blocks</string>
publicclassDemoApplicationextendsApplication {
@OverridepublicvoidonCreate() {
// ...// Do it on main processBlockCanary.install(this, newAppBlockCanaryContext()).start();
}
}

Implement your application BlockCanaryContext context (strongly recommend you to check all these configs):

publicclassAppBlockCanaryContextextendsBlockCanaryContext {
/** * Implement in your project. * * @return Qualifier which can specify this installation, like version + flavor. */publicStringprovideQualifier() {
return"unknown";
}
/** * Implement in your project. * * @return user id */publicStringprovideUid() {
return"uid";
}
/** * Network type * * @return {@link String} like 2G, 3G, 4G, wifi, etc. */publicStringprovideNetworkType() {
return"unknown";
}
/** * Config monitor duration, after this time BlockCanary will stop, use * with {@code BlockCanary}'s isMonitorDurationEnd * * @return monitor last duration (in hour) */publicintprovideMonitorDuration() {
return -1;
}
/** * Config block threshold (in millis), dispatch over this duration is regarded as a BLOCK. You may set it * from performance of device. * * @return threshold in mills */publicintprovideBlockThreshold() {
return1000;
}
/** * Thread stack dump interval, use when block happens, BlockCanary will dump on main thread * stack according to current sample cycle. * <p> * Because the implementation mechanism of Looper, real dump interval would be longer than * the period specified here (especially when cpu is busier). * </p> * * @return dump interval (in millis) */publicintprovideDumpInterval() {
returnprovideBlockThreshold();
}
/** * Path to save log, like "/blockcanary/", will save to sdcard if can. * * @return path of log files */publicStringprovidePath() {
return"/blockcanary/";
}
/** * If need notification to notice block. * * @return true if need, else if not need. */publicbooleandisplayNotification() {
returntrue;
}
/** * Implement in your project, bundle files into a zip file. * * @param src files before compress * @param dest files compressed * @return true if compression is successful */publicbooleanzip(File[] src, Filedest) {
returnfalse;
}
/** * Implement in your project, bundled log files. * * @param zippedFile zipped file */publicvoidupload(FilezippedFile) {
thrownewUnsupportedOperationException();
}
/** * Packages that developer concern, by default it uses process name, * put high priority one in pre-order. * * @return null if simply concern only package with process name. */publicList<String> concernPackages() {
returnnull;
}
/** * Filter stack without any in concern package, used with @{code concernPackages}. * * @return true if filter, false it not. */publicbooleanfilterNonConcernStack() {
returnfalse;
}
/** * Provide white list, entry in white list will not be shown in ui list. * * @return return null if you don't need white-list filter. */publicList<String> provideWhiteList() {
LinkedList<String> whiteList = newLinkedList<>();
whiteList.add("org.chromium");
returnwhiteList;
}
/** * Whether to delete files whose stack is in white list, used with white-list. * * @return true if delete, false it not. */publicbooleandeleteFilesInWhiteList() {
returntrue;
}
}

How does it work?

Blog in Chinese: BlockCanary.

Principle flow picture:

flow

Screenshot

Block detailBlock list

Contributors

This library is initially created by markzhai, and maintained under the organization moduth with nimengbo and zzz40500.

Special thanks to android-cjj, Mr.Bao, chiahaolu to contribute.

Change Log

Check CHANGELOG

Contribute

If you would like to contribute code to BlockCanary you can do so through GitHub by forking the repository and sending a pull request.

License

Copyright (C) 2016 MarkZhai (http://zhaiyifan.cn).
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

A transparent ui-block detection library for Android. (known as BlockCanary)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Chinese README

Android Performance Monitor Maven Central

A transparent ui-block detection library for Android, app only needs one-line-code to setup.

The naming is to pay respect to the great library LeakCanary, ui-related codes are modified from leakcanary's ui part.

  • 1.3.0 Add white-list and concern-package feature.
  • 1.3.1 Enable configuration of label and icon.

Getting started

You may choose how to assemble them as you like.

dependencies {
// most often used way, enable notification to notify block event
compile 'com.github.moduth:blockcanary-android:1.3.1'// this way you only enable BlockCanary in debug package// debugCompile 'com.github.moduth:blockcanary-android:1.3.1'// releaseCompile 'com.github.moduth:blockcanary-no-op:1.3.0'
}

As this library uses getMainLooper().setMessageLogging(), please check if you set it in your app (related issue markzhai#27)

Usage

Maximum log count is set to 500, you can rewrite it in your app int.xml.

<integername="block_canary_max_stored_count">1000</integer>

Monitor app's label and icon can be configured by placing a block_canary_icon drawable in your xhdpi drawable directory and in strings.xml:

<stringname="block_canary_display_activity_label">Blocks</string>
publicclassDemoApplicationextendsApplication {
@OverridepublicvoidonCreate() {
// ...// Do it on main processBlockCanary.install(this, newAppBlockCanaryContext()).start();
}
}

Implement your application BlockCanaryContext context (strongly recommend you to check all these configs):

publicclassAppBlockCanaryContextextendsBlockCanaryContext {
/** * Implement in your project. * * @return Qualifier which can specify this installation, like version + flavor. */publicStringprovideQualifier() {
return"unknown";
}
/** * Implement in your project. * * @return user id */publicStringprovideUid() {
return"uid";
}
/** * Network type * * @return {@link String} like 2G, 3G, 4G, wifi, etc. */publicStringprovideNetworkType() {
return"unknown";
}
/** * Config monitor duration, after this time BlockCanary will stop, use * with {@code BlockCanary}'s isMonitorDurationEnd * * @return monitor last duration (in hour) */publicintprovideMonitorDuration() {
return -1;
}
/** * Config block threshold (in millis), dispatch over this duration is regarded as a BLOCK. You may set it * from performance of device. * * @return threshold in mills */publicintprovideBlockThreshold() {
return1000;
}
/** * Thread stack dump interval, use when block happens, BlockCanary will dump on main thread * stack according to current sample cycle. * <p> * Because the implementation mechanism of Looper, real dump interval would be longer than * the period specified here (especially when cpu is busier). * </p> * * @return dump interval (in millis) */publicintprovideDumpInterval() {
returnprovideBlockThreshold();
}
/** * Path to save log, like "/blockcanary/", will save to sdcard if can. * * @return path of log files */publicStringprovidePath() {
return"/blockcanary/";
}
/** * If need notification to notice block. * * @return true if need, else if not need. */publicbooleandisplayNotification() {
returntrue;
}
/** * Implement in your project, bundle files into a zip file. * * @param src files before compress * @param dest files compressed * @return true if compression is successful */publicbooleanzip(File[] src, Filedest) {
returnfalse;
}
/** * Implement in your project, bundled log files. * * @param zippedFile zipped file */publicvoidupload(FilezippedFile) {
thrownewUnsupportedOperationException();
}
/** * Packages that developer concern, by default it uses process name, * put high priority one in pre-order. * * @return null if simply concern only package with process name. */publicList<String> concernPackages() {
returnnull;
}
/** * Filter stack without any in concern package, used with @{code concernPackages}. * * @return true if filter, false it not. */publicbooleanfilterNonConcernStack() {
returnfalse;
}
/** * Provide white list, entry in white list will not be shown in ui list. * * @return return null if you don't need white-list filter. */publicList<String> provideWhiteList() {
LinkedList<String> whiteList = newLinkedList<>();
whiteList.add("org.chromium");
returnwhiteList;
}
/** * Whether to delete files whose stack is in white list, used with white-list. * * @return true if delete, false it not. */publicbooleandeleteFilesInWhiteList() {
returntrue;
}
}

How does it work?

Blog in Chinese: BlockCanary.

Principle flow picture:

flow

Screenshot

Block detailBlock list

Contributors

This library is initially created by markzhai, and maintained under the organization moduth with nimengbo and zzz40500.

Special thanks to android-cjj, Mr.Bao, chiahaolu to contribute.

Change Log

Check CHANGELOG

Contribute

If you would like to contribute code to BlockCanary you can do so through GitHub by forking the repository and sending a pull request.

License

Copyright (C) 2016 MarkZhai (http://zhaiyifan.cn).
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

A transparent ui-block detection library for Android. (known as BlockCanary)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Chinese README

Android Performance Monitor Maven Central

A transparent ui-block detection library for Android, app only needs one-line-code to setup.

The naming is to pay respect to the great library LeakCanary, ui-related codes are modified from leakcanary's ui part.

  • 1.3.0 Add white-list and concern-package feature.
  • 1.3.1 Enable configuration of label and icon.

Getting started

You may choose how to assemble them as you like.

dependencies {
// most often used way, enable notification to notify block event
compile 'com.github.moduth:blockcanary-android:1.3.1'// this way you only enable BlockCanary in debug package// debugCompile 'com.github.moduth:blockcanary-android:1.3.1'// releaseCompile 'com.github.moduth:blockcanary-no-op:1.3.0'
}

As this library uses getMainLooper().setMessageLogging(), please check if you set it in your app (related issue markzhai#27)

Usage

Maximum log count is set to 500, you can rewrite it in your app int.xml.

<integername="block_canary_max_stored_count">1000</integer>

Monitor app's label and icon can be configured by placing a block_canary_icon drawable in your xhdpi drawable directory and in strings.xml:

<stringname="block_canary_display_activity_label">Blocks</string>
publicclassDemoApplicationextendsApplication {
@OverridepublicvoidonCreate() {
// ...// Do it on main processBlockCanary.install(this, newAppBlockCanaryContext()).start();
}
}

Implement your application BlockCanaryContext context (strongly recommend you to check all these configs):

publicclassAppBlockCanaryContextextendsBlockCanaryContext {
/** * Implement in your project. * * @return Qualifier which can specify this installation, like version + flavor. */publicStringprovideQualifier() {
return"unknown";
}
/** * Implement in your project. * * @return user id */publicStringprovideUid() {
return"uid";
}
/** * Network type * * @return {@link String} like 2G, 3G, 4G, wifi, etc. */publicStringprovideNetworkType() {
return"unknown";
}
/** * Config monitor duration, after this time BlockCanary will stop, use * with {@code BlockCanary}'s isMonitorDurationEnd * * @return monitor last duration (in hour) */publicintprovideMonitorDuration() {
return -1;
}
/** * Config block threshold (in millis), dispatch over this duration is regarded as a BLOCK. You may set it * from performance of device. * * @return threshold in mills */publicintprovideBlockThreshold() {
return1000;
}
/** * Thread stack dump interval, use when block happens, BlockCanary will dump on main thread * stack according to current sample cycle. * <p> * Because the implementation mechanism of Looper, real dump interval would be longer than * the period specified here (especially when cpu is busier). * </p> * * @return dump interval (in millis) */publicintprovideDumpInterval() {
returnprovideBlockThreshold();
}
/** * Path to save log, like "/blockcanary/", will save to sdcard if can. * * @return path of log files */publicStringprovidePath() {
return"/blockcanary/";
}
/** * If need notification to notice block. * * @return true if need, else if not need. */publicbooleandisplayNotification() {
returntrue;
}
/** * Implement in your project, bundle files into a zip file. * * @param src files before compress * @param dest files compressed * @return true if compression is successful */publicbooleanzip(File[] src, Filedest) {
returnfalse;
}
/** * Implement in your project, bundled log files. * * @param zippedFile zipped file */publicvoidupload(FilezippedFile) {
thrownewUnsupportedOperationException();
}
/** * Packages that developer concern, by default it uses process name, * put high priority one in pre-order. * * @return null if simply concern only package with process name. */publicList<String> concernPackages() {
returnnull;
}
/** * Filter stack without any in concern package, used with @{code concernPackages}. * * @return true if filter, false it not. */publicbooleanfilterNonConcernStack() {
returnfalse;
}
/** * Provide white list, entry in white list will not be shown in ui list. * * @return return null if you don't need white-list filter. */publicList<String> provideWhiteList() {
LinkedList<String> whiteList = newLinkedList<>();
whiteList.add("org.chromium");
returnwhiteList;
}
/** * Whether to delete files whose stack is in white list, used with white-list. * * @return true if delete, false it not. */publicbooleandeleteFilesInWhiteList() {
returntrue;
}
}

How does it work?

Blog in Chinese: BlockCanary.

Principle flow picture:

flow

Screenshot

Block detailBlock list

Contributors

This library is initially created by markzhai, and maintained under the organization moduth with nimengbo and zzz40500.

Special thanks to android-cjj, Mr.Bao, chiahaolu to contribute.

Change Log

Check CHANGELOG

Contribute

If you would like to contribute code to BlockCanary you can do so through GitHub by forking the repository and sending a pull request.

License

Copyright (C) 2016 MarkZhai (http://zhaiyifan.cn).
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

A transparent ui-block detection library for Android. (known as BlockCanary)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

Chinese README

Android Performance Monitor Maven Central

A transparent ui-block detection library for Android, app only needs one-line-code to setup.

The naming is to pay respect to the great library LeakCanary, ui-related codes are modified from leakcanary's ui part.

  • 1.3.0 Add white-list and concern-package feature.
  • 1.3.1 Enable configuration of label and icon.

Getting started

You may choose how to assemble them as you like.

dependencies {
// most often used way, enable notification to notify block event
compile 'com.github.moduth:blockcanary-android:1.3.1'// this way you only enable BlockCanary in debug package// debugCompile 'com.github.moduth:blockcanary-android:1.3.1'// releaseCompile 'com.github.moduth:blockcanary-no-op:1.3.0'
}

As this library uses getMainLooper().setMessageLogging(), please check if you set it in your app (related issue markzhai#27)

Usage

Maximum log count is set to 500, you can rewrite it in your app int.xml.

<integername="block_canary_max_stored_count">1000</integer>

Monitor app's label and icon can be configured by placing a block_canary_icon drawable in your xhdpi drawable directory and in strings.xml:

<stringname="block_canary_display_activity_label">Blocks</string>
publicclassDemoApplicationextendsApplication {
@OverridepublicvoidonCreate() {
// ...// Do it on main processBlockCanary.install(this, newAppBlockCanaryContext()).start();
}
}

Implement your application BlockCanaryContext context (strongly recommend you to check all these configs):

publicclassAppBlockCanaryContextextendsBlockCanaryContext {
/** * Implement in your project. * * @return Qualifier which can specify this installation, like version + flavor. */publicStringprovideQualifier() {
return"unknown";
}
/** * Implement in your project. * * @return user id */publicStringprovideUid() {
return"uid";
}
/** * Network type * * @return {@link String} like 2G, 3G, 4G, wifi, etc. */publicStringprovideNetworkType() {
return"unknown";
}
/** * Config monitor duration, after this time BlockCanary will stop, use * with {@code BlockCanary}'s isMonitorDurationEnd * * @return monitor last duration (in hour) */publicintprovideMonitorDuration() {
return -1;
}
/** * Config block threshold (in millis), dispatch over this duration is regarded as a BLOCK. You may set it * from performance of device. * * @return threshold in mills */publicintprovideBlockThreshold() {
return1000;
}
/** * Thread stack dump interval, use when block happens, BlockCanary will dump on main thread * stack according to current sample cycle. * <p> * Because the implementation mechanism of Looper, real dump interval would be longer than * the period specified here (especially when cpu is busier). * </p> * * @return dump interval (in millis) */publicintprovideDumpInterval() {
returnprovideBlockThreshold();
}
/** * Path to save log, like "/blockcanary/", will save to sdcard if can. * * @return path of log files */publicStringprovidePath() {
return"/blockcanary/";
}
/** * If need notification to notice block. * * @return true if need, else if not need. */publicbooleandisplayNotification() {
returntrue;
}
/** * Implement in your project, bundle files into a zip file. * * @param src files before compress * @param dest files compressed * @return true if compression is successful */publicbooleanzip(File[] src, Filedest) {
returnfalse;
}
/** * Implement in your project, bundled log files. * * @param zippedFile zipped file */publicvoidupload(FilezippedFile) {
thrownewUnsupportedOperationException();
}
/** * Packages that developer concern, by default it uses process name, * put high priority one in pre-order. * * @return null if simply concern only package with process name. */publicList<String> concernPackages() {
returnnull;
}
/** * Filter stack without any in concern package, used with @{code concernPackages}. * * @return true if filter, false it not. */publicbooleanfilterNonConcernStack() {
returnfalse;
}
/** * Provide white list, entry in white list will not be shown in ui list. * * @return return null if you don't need white-list filter. */publicList<String> provideWhiteList() {
LinkedList<String> whiteList = newLinkedList<>();
whiteList.add("org.chromium");
returnwhiteList;
}
/** * Whether to delete files whose stack is in white list, used with white-list. * * @return true if delete, false it not. */publicbooleandeleteFilesInWhiteList() {
returntrue;
}
}

How does it work?

Blog in Chinese: BlockCanary.

Principle flow picture:

flow

Screenshot

Block detailBlock list

Contributors

This library is initially created by markzhai, and maintained under the organization moduth with nimengbo and zzz40500.

Special thanks to android-cjj, Mr.Bao, chiahaolu to contribute.

Change Log

Check CHANGELOG

Contribute

If you would like to contribute code to BlockCanary you can do so through GitHub by forking the repository and sending a pull request.

License

Copyright (C) 2016 MarkZhai (http://zhaiyifan.cn).
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

A transparent ui-block detection library for Android. (known as BlockCanary)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Chinese README

Android Performance Monitor Maven Central

A transparent ui-block detection library for Android, app only needs one-line-code to setup.

The naming is to pay respect to the great library LeakCanary, ui-related codes are modified from leakcanary's ui part.

  • 1.3.0 Add white-list and concern-package feature.
  • 1.3.1 Enable configuration of label and icon.

Getting started

You may choose how to assemble them as you like.

dependencies {
// most often used way, enable notification to notify block event
compile 'com.github.moduth:blockcanary-android:1.3.1'// this way you only enable BlockCanary in debug package// debugCompile 'com.github.moduth:blockcanary-android:1.3.1'// releaseCompile 'com.github.moduth:blockcanary-no-op:1.3.0'
}

As this library uses getMainLooper().setMessageLogging(), please check if you set it in your app (related issue markzhai#27)

Usage

Maximum log count is set to 500, you can rewrite it in your app int.xml.

<integername="block_canary_max_stored_count">1000</integer>

Monitor app's label and icon can be configured by placing a block_canary_icon drawable in your xhdpi drawable directory and in strings.xml:

<stringname="block_canary_display_activity_label">Blocks</string>
publicclassDemoApplicationextendsApplication {
@OverridepublicvoidonCreate() {
// ...// Do it on main processBlockCanary.install(this, newAppBlockCanaryContext()).start();
}
}

Implement your application BlockCanaryContext context (strongly recommend you to check all these configs):

publicclassAppBlockCanaryContextextendsBlockCanaryContext {
/** * Implement in your project. * * @return Qualifier which can specify this installation, like version + flavor. */publicStringprovideQualifier() {
return"unknown";
}
/** * Implement in your project. * * @return user id */publicStringprovideUid() {
return"uid";
}
/** * Network type * * @return {@link String} like 2G, 3G, 4G, wifi, etc. */publicStringprovideNetworkType() {
return"unknown";
}
/** * Config monitor duration, after this time BlockCanary will stop, use * with {@code BlockCanary}'s isMonitorDurationEnd * * @return monitor last duration (in hour) */publicintprovideMonitorDuration() {
return -1;
}
/** * Config block threshold (in millis), dispatch over this duration is regarded as a BLOCK. You may set it * from performance of device. * * @return threshold in mills */publicintprovideBlockThreshold() {
return1000;
}
/** * Thread stack dump interval, use when block happens, BlockCanary will dump on main thread * stack according to current sample cycle. * <p> * Because the implementation mechanism of Looper, real dump interval would be longer than * the period specified here (especially when cpu is busier). * </p> * * @return dump interval (in millis) */publicintprovideDumpInterval() {
returnprovideBlockThreshold();
}
/** * Path to save log, like "/blockcanary/", will save to sdcard if can. * * @return path of log files */publicStringprovidePath() {
return"/blockcanary/";
}
/** * If need notification to notice block. * * @return true if need, else if not need. */publicbooleandisplayNotification() {
returntrue;
}
/** * Implement in your project, bundle files into a zip file. * * @param src files before compress * @param dest files compressed * @return true if compression is successful */publicbooleanzip(File[] src, Filedest) {
returnfalse;
}
/** * Implement in your project, bundled log files. * * @param zippedFile zipped file */publicvoidupload(FilezippedFile) {
thrownewUnsupportedOperationException();
}
/** * Packages that developer concern, by default it uses process name, * put high priority one in pre-order. * * @return null if simply concern only package with process name. */publicList<String> concernPackages() {
returnnull;
}
/** * Filter stack without any in concern package, used with @{code concernPackages}. * * @return true if filter, false it not. */publicbooleanfilterNonConcernStack() {
returnfalse;
}
/** * Provide white list, entry in white list will not be shown in ui list. * * @return return null if you don't need white-list filter. */publicList<String> provideWhiteList() {
LinkedList<String> whiteList = newLinkedList<>();
whiteList.add("org.chromium");
returnwhiteList;
}
/** * Whether to delete files whose stack is in white list, used with white-list. * * @return true if delete, false it not. */publicbooleandeleteFilesInWhiteList() {
returntrue;
}
}

How does it work?

Blog in Chinese: BlockCanary.

Principle flow picture:

flow

Screenshot

Block detailBlock list

Contributors

This library is initially created by markzhai, and maintained under the organization moduth with nimengbo and zzz40500.

Special thanks to android-cjj, Mr.Bao, chiahaolu to contribute.

Change Log

Check CHANGELOG

Contribute

If you would like to contribute code to BlockCanary you can do so through GitHub by forking the repository and sending a pull request.

License

Copyright (C) 2016 MarkZhai (http://zhaiyifan.cn).
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

A transparent ui-block detection library for Android. (known as BlockCanary)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

Chinese README

Android Performance Monitor Maven Central

A transparent ui-block detection library for Android, app only needs one-line-code to setup.

The naming is to pay respect to the great library LeakCanary, ui-related codes are modified from leakcanary's ui part.

  • 1.3.0 Add white-list and concern-package feature.
  • 1.3.1 Enable configuration of label and icon.

Getting started

You may choose how to assemble them as you like.

dependencies {
// most often used way, enable notification to notify block event
compile 'com.github.moduth:blockcanary-android:1.3.1'// this way you only enable BlockCanary in debug package// debugCompile 'com.github.moduth:blockcanary-android:1.3.1'// releaseCompile 'com.github.moduth:blockcanary-no-op:1.3.0'
}

As this library uses getMainLooper().setMessageLogging(), please check if you set it in your app (related issue markzhai#27)

Usage

Maximum log count is set to 500, you can rewrite it in your app int.xml.

<integername="block_canary_max_stored_count">1000</integer>

Monitor app's label and icon can be configured by placing a block_canary_icon drawable in your xhdpi drawable directory and in strings.xml:

<stringname="block_canary_display_activity_label">Blocks</string>
publicclassDemoApplicationextendsApplication {
@OverridepublicvoidonCreate() {
// ...// Do it on main processBlockCanary.install(this, newAppBlockCanaryContext()).start();
}
}

Implement your application BlockCanaryContext context (strongly recommend you to check all these configs):

publicclassAppBlockCanaryContextextendsBlockCanaryContext {
/** * Implement in your project. * * @return Qualifier which can specify this installation, like version + flavor. */publicStringprovideQualifier() {
return"unknown";
}
/** * Implement in your project. * * @return user id */publicStringprovideUid() {
return"uid";
}
/** * Network type * * @return {@link String} like 2G, 3G, 4G, wifi, etc. */publicStringprovideNetworkType() {
return"unknown";
}
/** * Config monitor duration, after this time BlockCanary will stop, use * with {@code BlockCanary}'s isMonitorDurationEnd * * @return monitor last duration (in hour) */publicintprovideMonitorDuration() {
return -1;
}
/** * Config block threshold (in millis), dispatch over this duration is regarded as a BLOCK. You may set it * from performance of device. * * @return threshold in mills */publicintprovideBlockThreshold() {
return1000;
}
/** * Thread stack dump interval, use when block happens, BlockCanary will dump on main thread * stack according to current sample cycle. * <p> * Because the implementation mechanism of Looper, real dump interval would be longer than * the period specified here (especially when cpu is busier). * </p> * * @return dump interval (in millis) */publicintprovideDumpInterval() {
returnprovideBlockThreshold();
}
/** * Path to save log, like "/blockcanary/", will save to sdcard if can. * * @return path of log files */publicStringprovidePath() {
return"/blockcanary/";
}
/** * If need notification to notice block. * * @return true if need, else if not need. */publicbooleandisplayNotification() {
returntrue;
}
/** * Implement in your project, bundle files into a zip file. * * @param src files before compress * @param dest files compressed * @return true if compression is successful */publicbooleanzip(File[] src, Filedest) {
returnfalse;
}
/** * Implement in your project, bundled log files. * * @param zippedFile zipped file */publicvoidupload(FilezippedFile) {
thrownewUnsupportedOperationException();
}
/** * Packages that developer concern, by default it uses process name, * put high priority one in pre-order. * * @return null if simply concern only package with process name. */publicList<String> concernPackages() {
returnnull;
}
/** * Filter stack without any in concern package, used with @{code concernPackages}. * * @return true if filter, false it not. */publicbooleanfilterNonConcernStack() {
returnfalse;
}
/** * Provide white list, entry in white list will not be shown in ui list. * * @return return null if you don't need white-list filter. */publicList<String> provideWhiteList() {
LinkedList<String> whiteList = newLinkedList<>();
whiteList.add("org.chromium");
returnwhiteList;
}
/** * Whether to delete files whose stack is in white list, used with white-list. * * @return true if delete, false it not. */publicbooleandeleteFilesInWhiteList() {
returntrue;
}
}

How does it work?

Blog in Chinese: BlockCanary.

Principle flow picture:

flow

Screenshot

Block detailBlock list

Contributors

This library is initially created by markzhai, and maintained under the organization moduth with nimengbo and zzz40500.

Special thanks to android-cjj, Mr.Bao, chiahaolu to contribute.

Change Log

Check CHANGELOG

Contribute

If you would like to contribute code to BlockCanary you can do so through GitHub by forking the repository and sending a pull request.

License

Copyright (C) 2016 MarkZhai (http://zhaiyifan.cn).
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

A transparent ui-block detection library for Android. (known as BlockCanary)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

Chinese README

Android Performance Monitor Maven Central

A transparent ui-block detection library for Android, app only needs one-line-code to setup.

The naming is to pay respect to the great library LeakCanary, ui-related codes are modified from leakcanary's ui part.

  • 1.3.0 Add white-list and concern-package feature.
  • 1.3.1 Enable configuration of label and icon.

Getting started

You may choose how to assemble them as you like.

dependencies {
// most often used way, enable notification to notify block event
compile 'com.github.moduth:blockcanary-android:1.3.1'// this way you only enable BlockCanary in debug package// debugCompile 'com.github.moduth:blockcanary-android:1.3.1'// releaseCompile 'com.github.moduth:blockcanary-no-op:1.3.0'
}

As this library uses getMainLooper().setMessageLogging(), please check if you set it in your app (related issue markzhai#27)

Usage

Maximum log count is set to 500, you can rewrite it in your app int.xml.

<integername="block_canary_max_stored_count">1000</integer>

Monitor app's label and icon can be configured by placing a block_canary_icon drawable in your xhdpi drawable directory and in strings.xml:

<stringname="block_canary_display_activity_label">Blocks</string>
publicclassDemoApplicationextendsApplication {
@OverridepublicvoidonCreate() {
// ...// Do it on main processBlockCanary.install(this, newAppBlockCanaryContext()).start();
}
}

Implement your application BlockCanaryContext context (strongly recommend you to check all these configs):

publicclassAppBlockCanaryContextextendsBlockCanaryContext {
/** * Implement in your project. * * @return Qualifier which can specify this installation, like version + flavor. */publicStringprovideQualifier() {
return"unknown";
}
/** * Implement in your project. * * @return user id */publicStringprovideUid() {
return"uid";
}
/** * Network type * * @return {@link String} like 2G, 3G, 4G, wifi, etc. */publicStringprovideNetworkType() {
return"unknown";
}
/** * Config monitor duration, after this time BlockCanary will stop, use * with {@code BlockCanary}'s isMonitorDurationEnd * * @return monitor last duration (in hour) */publicintprovideMonitorDuration() {
return -1;
}
/** * Config block threshold (in millis), dispatch over this duration is regarded as a BLOCK. You may set it * from performance of device. * * @return threshold in mills */publicintprovideBlockThreshold() {
return1000;
}
/** * Thread stack dump interval, use when block happens, BlockCanary will dump on main thread * stack according to current sample cycle. * <p> * Because the implementation mechanism of Looper, real dump interval would be longer than * the period specified here (especially when cpu is busier). * </p> * * @return dump interval (in millis) */publicintprovideDumpInterval() {
returnprovideBlockThreshold();
}
/** * Path to save log, like "/blockcanary/", will save to sdcard if can. * * @return path of log files */publicStringprovidePath() {
return"/blockcanary/";
}
/** * If need notification to notice block. * * @return true if need, else if not need. */publicbooleandisplayNotification() {
returntrue;
}
/** * Implement in your project, bundle files into a zip file. * * @param src files before compress * @param dest files compressed * @return true if compression is successful */publicbooleanzip(File[] src, Filedest) {
returnfalse;
}
/** * Implement in your project, bundled log files. * * @param zippedFile zipped file */publicvoidupload(FilezippedFile) {
thrownewUnsupportedOperationException();
}
/** * Packages that developer concern, by default it uses process name, * put high priority one in pre-order. * * @return null if simply concern only package with process name. */publicList<String> concernPackages() {
returnnull;
}
/** * Filter stack without any in concern package, used with @{code concernPackages}. * * @return true if filter, false it not. */publicbooleanfilterNonConcernStack() {
returnfalse;
}
/** * Provide white list, entry in white list will not be shown in ui list. * * @return return null if you don't need white-list filter. */publicList<String> provideWhiteList() {
LinkedList<String> whiteList = newLinkedList<>();
whiteList.add("org.chromium");
returnwhiteList;
}
/** * Whether to delete files whose stack is in white list, used with white-list. * * @return true if delete, false it not. */publicbooleandeleteFilesInWhiteList() {
returntrue;
}
}

How does it work?

Blog in Chinese: BlockCanary.

Principle flow picture:

flow

Screenshot

Block detailBlock list

Contributors

This library is initially created by markzhai, and maintained under the organization moduth with nimengbo and zzz40500.

Special thanks to android-cjj, Mr.Bao, chiahaolu to contribute.

Change Log

Check CHANGELOG

Contribute

If you would like to contribute code to BlockCanary you can do so through GitHub by forking the repository and sending a pull request.

License

Copyright (C) 2016 MarkZhai (http://zhaiyifan.cn).
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

About

A transparent ui-block detection library for Android. (known as BlockCanary)

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages