{"id":21513234,"url":"https://github.com/patrickfav/under-the-hood","last_synced_at":"2025-08-20T02:32:41.289Z","repository":{"id":57714966,"uuid":"74857438","full_name":"patrickfav/under-the-hood","owner":"patrickfav","description":"Under the Hood is a flexible and powerful Android debug view library. It uses a modular template system that can be easily extended to your needs, although coming with many useful elements built-in.","archived":false,"fork":false,"pushed_at":"2020-11-29T19:18:14.000Z","size":9902,"stargazers_count":220,"open_issues_count":2,"forks_count":18,"subscribers_count":8,"default_branch":"master","last_synced_at":"2025-06-10T11:12:09.893Z","etag":null,"topics":["android","android-debug","android-library","noop","shake-detection"],"latest_commit_sha":null,"homepage":"https://favr.dev/opensource/under-the-hood","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/patrickfav.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2016-11-27T00:02:11.000Z","updated_at":"2024-12-30T08:44:21.000Z","dependencies_parsed_at":"2022-09-02T22:01:10.213Z","dependency_job_id":null,"html_url":"https://github.com/patrickfav/under-the-hood","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"purl":"pkg:github/patrickfav/under-the-hood","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickfav%2Funder-the-hood","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickfav%2Funder-the-hood/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickfav%2Funder-the-hood/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickfav%2Funder-the-hood/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/patrickfav","download_url":"https://codeload.github.com/patrickfav/under-the-hood/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/patrickfav%2Funder-the-hood/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":271254665,"owners_count":24727383,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-20T02:00:09.606Z","response_time":69,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["android","android-debug","android-library","noop","shake-detection"],"created_at":"2024-11-23T22:55:06.005Z","updated_at":"2025-08-20T02:32:40.493Z","avatar_url":"https://github.com/patrickfav.png","language":"Java","funding_links":[],"categories":["Debug"],"sub_categories":[],"readme":"# Under the Hood - Android App Debug View Library\n\nUnder the Hood is a flexible and powerful Android debug view library. It\nuses a modular template system that can be easily extended to your needs,\nalthough coming with many useful elements built-in. There is a lot of\n\"default\" debug data that can be easily embedded (e.g. current runtime-permission\nstatus, app version and device info). There are 2 basic themes (dark and light)\nwhich can be customized to your needs.\nThe lib is divided into 2 modules: `hood-core` containing the basic view that\ncan be embedded anywhere and `hood-extended` which comes with a ready-to-use\nactivity with a lot of convenience features. The lib has also a null-safe\n[no-op](https://en.wikipedia.org/wiki/NOP) flavor indented to be used in release builds, disabling all debug features\nwithout error-prone if-debug chains.\n\n[![Download](https://api.bintray.com/packages/patrickfav/maven/hood/images/download.svg) ](https://bintray.com/patrickfav/maven/hood/_latestVersion)\n[![Build Status](https://travis-ci.com/patrickfav/under-the-hood.svg?branch=master)](https://travis-ci.com/patrickfav/under-the-hood)\n[![Maintainability](https://api.codeclimate.com/v1/badges/f18559eddd85f814944f/maintainability)](https://codeclimate.com/github/patrickfav/under-the-hood/maintainability)\n[![Javadocs](https://www.javadoc.io/badge/at.favre.lib.hood/hood-core.svg)](https://www.javadoc.io/doc/at.favre.lib.hood/hood-core)\n[![API 14+](https://img.shields.io/badge/API-14%2B-blue.svg?style=flat)](https://android-arsenal.com/api?level=14)\n[![Method Cound](https://img.shields.io/badge/Methods%20and%20size-core:%201128%20%7C%20167%20KB-e91e63.svg)](http://www.methodscount.com/?lib=at.favre.lib.hood%3Ahood-core%3A%2B)\n[![play store banner](doc/playstore_badge_new_sm.png)](https://play.google.com/store/apps/details?id=at.favre.app.hood.demo)\n\nTo check it out, [download the demo app from the Playstore](https://play.google.com/store/apps/details?id=at.favre.app.hood.demo) . Lib and demo app require SDK 14+.\n\n## Features\n\n* Extensible template based view including property, button, switch and spinner views\n* Extensible dark and light theme\n* Plentiful default debug data (app version, permissions, system features, etc.)\n* Use as activity or standalone view embeddable into your layouts\n* Lightweight and uses minimal dependencies using core module\n* [No-op](https://en.wikipedia.org/wiki/NOP) flavor of the lib for your release build\n* Shake listener and Multi Click Listener\n\n![screenshot gallery](doc/screenshot_gallery.png)\n\n## Quick Start\n\nAdd the following to your dependencies ([add jcenter to your repositories](https://developer.android.com/studio/build/index.html#top-level) if you haven't)\n\n```groovy\ncompile 'at.favre.lib.hood:hood-extended:x.y.z'\n```\n\nCreate an activity and extend `PopHoodActivity`. Define it in your `AndroidManifest`:\n\n```xml\n\u003cactivity\n    android:name=\"com.example.your.MyDebugActivity\"\n    android:theme=\"@style/HoodThemeDark\"\u003e\n\u003c/activity\u003e\n```\nImplement the config and page setter in the `Activity`:\n\n```java\npublic class MyDebugActivity extends PopHoodActivity {\n    @Override\n    public Pages getPageData(@NonNull Pages pages) {\n        Page firstPage = pages.addNewPage();\n        firstPage.add(Hood.get().createHeaderEntry(\"System Features\"));\n        firstPage.add(Hood.get().createPropertyEntry(\"The Key\", \"The value\"));\n        firstPage.add(DefaultProperties.createSectionBasicDeviceInfo());\n        firstPage.add(Hood.get().createActionEntry(DefaultButtonDefinitions.getGlobalSettingsAction()));\n        firstPage.add(new PackageInfoAssembler(PackageInfoAssembler.Type.PERMISSIONS, PackageInfoAssembler.USES_FEATURE).createSection(this, true));\n\n         return pages;\n    }\n\n    @Override\n    public Config getConfig() {\n        return Config.newBuilder().setLogTag(\"MyDebugActivity\").build();\n    }\n}\n```\n\nSee demo app for extended samples.\n\n### Using only the View\n\nAdd the view to your layout:\n\n```xml\n\u003cat.favre.lib.hood.view.HoodDebugPageView\n        android:id=\"@+id/debug_view\"\n        android:layout_width=\"match_parent\"\n        android:layout_height=\"match_parent\"\n        android:theme=\"@style/CustomHoodViewOverlayDark\" /\u003e\n```\n\nCreate the following style:\n\n```xml\n\u003cstyle name=\"CustomHoodViewOverlayDark\" parent=\"ThemeOverlay.AppCompat.Dark\"\u003e\n     \u003citem name=\"android:background\"\u003e?android:windowBackground\u003c/item\u003e\n    \u003citem name=\"hoodZebraColor\"\u003e@color/hoodlib_zebra_color_dark\u003c/item\u003e\n    \u003citem name=\"hoodTextSizeNormal\"\u003e@dimen/hoodlib_standard_text_size\u003c/item\u003e\n    \u003citem name=\"hoodTextSizeHeader\"\u003e@dimen/hoodlib_header_text_size\u003c/item\u003e\n    \u003citem name=\"hoodViewpagerTabTextColor\"\u003e@android:color/primary_text_dark\u003c/item\u003e\n    \u003citem name=\"hoodViewpagerTabBackgroundColor\"\u003e?attr/colorPrimary\u003c/item\u003e\n\u003c/style\u003e\n```\n\nSet up in your controller (`Activity` or `Fragment`):\n\n```java\nHoodDebugPageView debugView = (HoodDebugPageView) findViewById(R.id.debug_view);\n\nPages pages = Hood.get().createPages(Config.newBuilder().setShowHighlightContent(false).build());\nPage firstPage = pages.addNewPage(\"Debug Info\");\nfirstPage.add(Hood.get().createActionEntry(DefaultButtonDefinitions.getCrashAction()));\n...\nPage secondPage = pages.addNewPage(\"Debug Features\");\nsecondPage.add(DefaultProperties.createSectionConnectivityStatusInfo(this));\nsecondPage.add(new PackageInfoAssembler(PackageInfoAssembler.Type.APK_INSTALL_INFO, PackageInfoAssembler.Type.PERMISSIONS).createSection(this, true));\n...\ndebugView.setPageData(pages);\n```\n\n### Showcase Demo App\n\n![animation of ui](doc/showcase.gif)\n\n\n## The HoodAPI\n\nThe main interface of the App is the `HoodAPI` or `HoodAPI.Extension` accessed\nthrough the `Hood` singleton. It is required to use these interfaces to take\nadvantage of using the no-op flavor.\n\nThe interface is used with the `Hood` singleton:\n\n    Hood.get().*\n    Hood.ext().*\n\nFor default properties/actions/etc checkout the classes in\n\n    at.favre.lib.hood.util.defaults.*\n\nas well as `PackageInfoAssembler`.\n\n### The DebugView\n\nResponsible for rendering and the main interface for the Activity/Fragment\nto the debug pages is the `HoodDebugPageView`. Define it in your view\n\n    \u003cat.favre.lib.hood.view.HoodDebugPageView\n        ...\n    /\u003e\n\nFor themes see section below.\n\nTo initialize the view it needs a `Pages` object:\n\n    debugView.setPageData(pages);\n\nIf there is more than 1 page the pages are rendered in a `ViewPager` with\nsimple tabs on top, otherwise it will just show as a single page.\n\nWith\n\n    debugView.refresh()\n\nthe entries can be refreshed (see `DynamicValue`). To block the view and\nshow a progress bar you can use:\n\n    debugView.setProgressBarVisible(true)\n\nNote that your Activity should implement `IHoodDebugController` to enable\nall features. This is necessary so external ui elements (like DialogFragments)\ncan communicate with the debug view.\n\n### Config\n\nThe config object must be created with the provided builder:\n\n    Config.newBuilder() (...) .build()\n\nFollowing configs can be changed:\n\n* showing zebra pattern in ui (coloring every odd row)\n* automatically log all of the entries in the view\n* automatically refresh the view after x ms\n* set your log tag for all logging features\n* show tab indicator if more than 1 page\n\n### Template Concept\n\nThe template has the following main components\n\n* `Pages` is responsible for creating and managing a collection of `Page`\nand contains the main config\n* `Page` is responsible for managing a list of `PageEntry`\n* `PageEntry` is a row displaying content in a `Page`. PageEntry is\nresponsible for how its data is rendered in the UI.\n\n![adiagram showing how the template works](doc/template_system.png)\n\nAdditionally there is an element that groups a bunch of `PageEntry` entries\nwith additional convenience logic, like displaying an optional error message.\n\nCreating a simple page is easy:\n\n```java\n    Pages pages = Hood.get().createPages(Config.newBuilder().build());\n    Page firstPage = pages.addNewPage(\"Title Page 1\");\n    firstPage.add(...);\n    ...\n\n    Page secondPage = pages.addNewPage(\"Title Page 2\");\n    secondPage.add(...);\n    ...\n```\n\n`PageEntry` elements, that can be added to a `Page` can be created like this:\n\n```java\n    page.add(Hood.get().createHeaderEntry(...))\n    page.add(Hood.get().createPropertyEntry(...))\n    page.add(Hood.get().createActionEntry(...))\n    page.add(Hood.get().createSwitchEntry(...))\n    page.add(Hood.get().createSpinnerEntry(...))\n```\n\n### Built-In PageEntry Elements\n\n#### Property Entry\n\n![example in the ui](doc/example_property.png)\n\nCreate with:\n\n```java\n    Hood.get().createPropertyEntry(\"The Key\", \"The value\")\n```\nWill render a row with a the key string on the one side and the value on\nthe other. Supports dynamic values (ie. every refresh will be reevaluated),\nmulti-line layout for longer values and custom on-tap-actions and background\n evaluating values.\n\nFor example a property element that will show the uptime (which will get\n update if the DebugView will be refreshed) and a toast message\nwhen the user clicks on it:\n\n```java\n    Hood.get().createPropertyEntry(\"uptime\", new DynamicValue\u003cString\u003e() {\n            @Override\n            public String getValue() {\n                return HoodUtil.millisToDaysHoursMinString(SystemClock.elapsedRealtime());\n            }\n        }, Hood.ext().createOnClickActionToast(),false);\n```\nIf you want the lib to evaluate the value in background instead of the main\nthread use `DynamicValue.Async` instead of `DynamicValue`\n\nDefault actions are: Toast, Dialog, Start-Intent and ask runtime permission.\n\nFor a lot of default data, e.g. device info, set permissions and build data,\nsee `DefaultProperties.*` and `PackageInfoAssembler`\n\n#### ActionEntry\n\n![example in the ui](doc/example_buttons.png)\n\nWill be rendered as a simple button starting a custom action on click.\nSupports single and double column actions (ie. having two buttons in the same row)\n\nHere is a simple example:\n\n```java\n    Hood.get().createActionEntry(new ButtonDefinition(\"Click me\", new OnClickAction() {\n            @Override\n            public void onClick(View v, Map.Entry\u003cCharSequence, String\u003e value) {\n                Toast.makeText(v.getContext(), \"On button clicked\", Toast.LENGTH_SHORT).show();\n            }\n        }));\n```\nFor a lot of default actions, e.g. android settings, app-info or uninstall\nand kill process, see `DefaultButtonDefinitions` class.\n\n#### ConfigBoolEntry \u0026 ConfigSpinnerEntry\n\nFor interactive debug features the standard implementations for switches\nand spinner can be used. The logic for the switch can be anything that\nimplements the `ChangeableValue` interface. Spinner can also be customized\nto your demands.\n\nFor a simple switch that changes a boolean in the shared preference see\nthis example:\n\n```java\n    Hood.get().createSwitchEntry(\n        DefaultConfigActions.getBoolSharedPreferencesConfigAction(\n            getPreferences(MODE_PRIVATE),\n            \"SHARED_PREF_KEY\", \"Enable debug feat#1\", false));\n```\n![example in the ui](doc/example_switch.png)\n\n\nThis code will create a simple backend switcher:\n\n```java\n    Hood.get().createSpinnerEntry(\n        DefaultConfigActions.getDefaultSharedPrefBackedSpinnerAction(\n        \"Backend\", getPreferences(MODE_PRIVATE),\n        \"BACKEND_ID\", null, getBackendElements())));\n\n    private List\u003cSpinnerElement\u003e getBackendElements() {\n       //return your backends\n    }\n```\n![example in the ui](doc/example_spinner.png)\n\nThere is a standard implementation for `ConfigBoolEntry` in `DefaultConfigActions`\n backed by shared preferences.\n\n#### Header and Message\n\nGroup your entries with a header\n\n```java\n    Hood.get().createHeaderEntry(\"App Version\")\n```\n![example in the ui](doc/example_header.png)\n\nTo display a simple message use the following:\n\n```java\n    Hood.get().createSimpleMessageEntry(\"This is a simple message shown in ui\")\n```\n### Custom PageEntries\n\nA `PageEntry` must implement the interface with the same name. It holds\na distinct value, can be refreshed and returns a loggable string. The most\nimportant part, though, is the `ViewTemplate` that defines how this entry\nis rendered. The `constructView` and `setContent` are similar to the\n`onCreateViewHolder` and `onBindViewHolder` in a `RecyclerView`. It is important\nthat `ViewTemplate` must return a distinct type as int (values over 65536 are\nreserved by the lib)\n\n## Library Modules and Flavours\n\nThe library comes in 2 modules:\n\n### Module `hood-core`\nContains only the base code without the default implementation of the debug activity.\nThe advantage is that there is only minimal dependencies on `support*` libraries and\ntherefore very lightweight, not adding too much methods or `res` to your app.\n\nThe core module comes in 2 flavours (or classifier):\n\n#### `release`\nThe standard version of the lib with all features. You could use this\nversion in only in your debug builds with:\n```groovy\n    compile(\"at.favre.lib.hood:hood-core:x.x.x\")\n```\n#### `noop`\nThe [no-op version](https://en.wikipedia.org/wiki/NOP) of the lib internally using null-safe no-op versions of the\nmain template system. All creator methods of `HoodAPI` (`Hood.get()`) and `HoodAPI.Extension`\n(`Hood.ext()`) support the no-op switch and return dummy implementations.\nIf you use implementation from `at.favre.lib.hood.page.**` directly this will have no effect.\n\nHere is a piratical example to use default flavor in debug and noop in release:\n```groovy\n    debugCompile('at.favre.lib.hood:hood-core:x.x.x')\n    releaseCompile(group: 'at.favre.lib.hood', name: 'hood-core', version: 'x.x.x', classifier: 'noop', ext: 'aar', transitive: true)\n```\nThe `PopHoodActivity` will also respect the no-op switch and just finish.\n The no-op state can be checked with `Hood.isLibEnabled()` from any caller.\n\nHere is a example of a noop view being rendered\n\n![example image](doc/noop_example.png)\n\n### Module `hood-extended`\n\nExtends the `hood-core` with a default implementation of a debug activity\nusing `appcompat-v7` support library.\n\nIf you want to use the noop version in release use something like this:\n```groovy\n    debugCompile('at.favre.lib.hood:hood-extended:x.x.x')\n    releaseCompile('at.favre.lib.hood:hood-extended:x.x.x') {\n            exclude group: 'at.favre.lib.hood', module: 'hood-core'\n            releaseCompile(group: 'at.favre.lib.hood', name: 'hood-core', version: 'x.x.x',\n            classifier: 'noop', ext: 'aar', transitive: true)\n    }\n```\n## Theme\n\nThe lib defines some required attributes, so they need to be set in order\nto be able to render the view. The easiest way is to use the build-in themes\n(`hood-extended`) for Activities (which extend from `Theme.AppCompat`)\n\n* `HoodThemeLight`\n* `HoodThemeDark`\n\nand overlays for standalone views:\n\n* `HoodLibThemeOverlay.Dark`\n* `HoodLibThemeOverlay.Light`\n* `HoodLibThemeOverlay.Dark.Small`\n* `HoodLibThemeOverlay.Light.Small`\n\nYou can also define your own theme (extending `Theme.AppCompat` or `ThemeOverlay.AppCompat`)\nbut you must define the following attributes in it:\n\n* `hoodToolbarTextColor`: toolbar text and icon color\n* `hoodZebraColor`: highlighting color for odd rows\n* `hoodTextSizeNormal`: default text size\n* `hoodTextSizeHeader`: header text size\n* `hoodViewpagerTabTextColor`: text color pager tabs labels (only relevant for 2+ pages)\n* `hoodViewpagerTabBackgroundColor`: background of pager tabs (only relevant for 2+ pages)\n\nHere is an example with useful defaults:\n```xml\n    \u003cstyle name=\"HoodThemeDark\" parent=\"Theme.AppCompat.NoActionBar\"\u003e\n        ...\n        \u003citem name=\"hoodToolbarTextColor\"\u003e@android:color/primary_text_dark\u003c/item\u003e\n        \u003citem name=\"hoodZebraColor\"\u003e@color/hoodlib_zebra_color_dark\u003c/item\u003e\n        \u003citem name=\"hoodTextSizeNormal\"\u003e@dimen/hoodlib_standard_text_size\u003c/item\u003e\n        \u003citem name=\"hoodTextSizeHeader\"\u003e@dimen/hoodlib_header_text_size\u003c/item\u003e\n        \u003citem name=\"hoodViewpagerTabTextColor\"\u003e@android:color/primary_text_dark\u003c/item\u003e\n        \u003citem name=\"hoodViewpagerTabBackgroundColor\"\u003e?attr/colorPrimary\u003c/item\u003e\n    \u003c/style\u003e\n```\n## Additional Features\n\n### Using the Shake Detector to open the Debug View\n\nUse the HoodAPI.Extension interface to register your intent:\n```java\n    shakeControl = Hood.ext().registerShakeToOpenDebugActivity(this,\n        PopHoodActivity.createIntent(this, MyDebugActivity.class));\n```\nThen start/stop the detector `onResume()`/`onPause()`\n```java\n    @Override\n    protected void onResume() {\n        super.onResume();\n        shakeControl.start();\n    }\n\n    @Override\n    protected void onPause() {\n        super.onPause();\n        shakeControl.stop();\n    }\n```\n### Using the Arbitrary Tap ClickListener\n\nIf you want to obfuscate the access point of your debug view with e.g.\na triple click on a view that does not look clickable use the following code:\n```java\n    myView.setOnTouchListener(Hood.ext().createArbitraryTapListener(3, new View.OnClickListener() {\n            @Override\n            public void onClick(View v) {\n                PopHoodActivity.start(WrappingActivity.this, MyDebugActivity.class);\n            }\n     }));\n```\n\n## Possible conflicts and things to mind\n\nThis lib uses [Timber](https://github.com/JakeWharton/timber) for logging, but will\nnever plant a `Tree`, so to not interfere with the root app's desired logging\nbehaviour. If you like to see the lib's logging output just plant a DebugTree\n\n    Timber.plant(new Timber.DebugTree());\n\nAll `res` assets are prefixed with `hoodlib_` so there should be no conflict\nwhen merging the resources.\n\n## Proguard\n\nThe lib includes it's own proguard consumer rules and should work out of\nthe box with obfuscated builds.\n\n## Recipes\n\n### Suggestions on what Properties/Actions to add to your Page\n\nApart from `DefaultProperties` the following could be useful:\n\n\u003e git-hash, git-branch, CI build no, build time, login-data, internal states\n\nThe following debug actions might be useful:\n\n\u003e clear (image) caches, manually calling requests, updating ui, changing shared pref states, directly open activities\n\n### Start your debug activity through adb\n\nAdd `android:exported=\"true\"` to your activity definition and use the following adb call:\n\n     adb shell am start -n com.example.your.app-id/com.example.your.app.pacakge.DebugActivity\n\n### Have certain debug features only in debug builds\n\nUse a static boolean (e.g. `BuildConfig.DEBUG`) in an if like\n\n    if(BuildConfig.DEBUG) {\n        page.addAction(...)\n    }\n    \nAlthough verbose, the advantage is that the compiler will remove the unreachable code in release builds similar to using C macros.\n\n## Build\n\nAssemble the lib with the following command\n\n    ./gradlew :hood-core:assemble\n    ./gradlew :hood-extended:assemble\n    \nThe `.aar` files can then be found in `/hood-*/build/outputs/aar` folder\n\n## Libraries \u0026 Credits\n\n* [Timber](https://github.com/JakeWharton/timber)\n* [Seismic](https://github.com/square/seismic)\n* [Icon by Freepik](http://www.flaticon.com/free-icon/nut_264316#term=nut\u0026page=1\u0026position=8)\n\n## Similar Projects:\n\n* [Bee - Debug and QA tool for android](https://github.com/orhanobut/bee)\n* [DebugDrawer - Android Debug Drawer for faster development](https://github.com/palaima/DebugDrawer)\n* [debugdrawer - Debug Drawer for android debug builds](https://github.com/williamwebb/debugdrawer)\n\n# License\n\nCopyright 2017 Patrick Favre-Bulle\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n    http://www.apache.org/licenses/LICENSE-2.0\n\nUnless required by applicable law or agreed to in writing, software\ndistributed under the License is distributed on an \"AS IS\" BASIS,\nWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\nSee the License for the specific language governing permissions and\nlimitations under the License.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpatrickfav%2Funder-the-hood","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fpatrickfav%2Funder-the-hood","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fpatrickfav%2Funder-the-hood/lists"}