Repository Analysis

kivy/python-for-android

Turn your Python application into an Android APK

11.6 Low AI signal View on GitHub

Analysis Overview

This report presents the forensic synthetic code analysis of kivy/python-for-android, a Python project with 8,904 GitHub stars. SynthScan v2.0 examined 33,366 lines of code across 323 source files, recording 330 pattern matches distributed across 15 syntactic categories. The overall adjusted score of 11.6 places this repository in the Low AI signal band.

The scanner applied 160+ deterministic lexical heuristics, multi-line block detectors, abstract syntax tree depth profilers, and a cross-file Jaccard similarity matrix to construct a statistically normalised synthetic code estimate. All matches are individually weighted by severity coefficient and contextual multiplier before summation, and the resulting headline score is temporally discounted to account for the repository's development history relative to the commercial emergence of large language model coding tooling (November 2022 onward).

11.6
Adjusted Score
11.6
Raw Score
100%
Time Factor
2026-08-02
Last Push
8.9K
Stars
Python
Language
33.4K
Lines of Code
323
Files
330
Pattern Hits
2026-08-02
Scan Date
0.00
HC Hit Rate

What These Metrics Mean

Adjusted Score
Primary synthetic code indicator. Raw score normalised per 1,000 lines of code and multiplied by the temporal discount factor. This is the definitive comparative metric — use it to rank repositories by AI authorship density.
Raw Score
The unmodified sum of all severity-weighted, context-multiplied pattern match scores before temporal discounting. Reflects the absolute signal strength independent of when the repository was last active.
Time Factor
The temporal discount multiplier (0–100%) applied to the raw score. Repositories last updated before ChatGPT's launch (Nov 2022) receive a 5% factor. Full signal is only assigned to repositories active in the post-adoption era (Jan 2024+).
Pattern Hits
Total count of individual pattern matches across all files and categories. A high hit count with a low score may indicate a very large codebase with isolated AI snippets; a low count with a high score indicates dense, concentrated AI signatures.
HC Hit Rate
High+Critical pattern hits per file, averaged across the repository. This orthogonal signal catches repositories where a few files are densely packed with high-severity AI tells — a strong indicator even when the normalised score appears moderate due to codebase size.
Lines of Code / Files
Total lines and files analysed. The scanner examines 94 file extensions. These denominators are used to normalise the score, enabling fair comparison between repositories of vastly different sizes.

Score History

Longitudinal tracking requires multiple scan runs. Once this repository is re-scanned after new commits land, this chart will visualise how the synthetic code signal evolves over time — enabling you to detect whether AI authorship is growing, stabilising, or being actively corrected by human engineers.

No multi-scan history yet — run the scanner again to build trend data.

Severity Breakdown

Classifies detected patterns by their diagnostic confidence and structural impact. CRITICAL patterns (coefficient 10) represent definitive synthetic signatures — hallucinated imports, explicit LLM attribution metadata — virtually never produced by human authors. HIGH (5) indicates strong structural tells such as cross-file repetition or cross-linguistic idioms. MEDIUM (2) covers recognisable conversational padding and AI-specific vocabulary. LOW (1) captures subtle indicators like tautological comments and generic boilerplate that require density to carry independent signal.

CRITICAL 0HIGH 1MEDIUM 19LOW 310

Directory Score Breakdown

This horizontal bar chart decomposes the repository's raw synthetic code score by top-level directory, allowing you to pinpoint precisely which modules or components carry the highest AI authorship density. Directories with disproportionately high scores relative to their size warrant targeted manual review: concentrated AI signatures often trace back to mass-generated configuration layers, auto-ported test suites, LLM-scaffolded boilerplate classes, or entire subsystems authored under heavy copilot assistance. Use this view to prioritise your human code-review effort.

Pattern Findings

The scanner identified 330 distinct pattern matches across 15 syntactic categories. Each entry below represents a discrete location in the source code where the engine recorded a statistically significant AI authorship indicator. Expand any category row to inspect the individual file paths, line numbers, code snippets, and the lexical context (CODE, COMMENT, or STRING) in which each match was detected.

Reading the findings table: The Severity column indicates the diagnostic confidence level (CRITICAL / HIGH / MEDIUM / LOW). The Context column identifies whether the match occurred inside executable code, an inline comment, or a string literal — comment-context matches receive a ×1.5 weight because LLMs systematically over-annotate. The ⚡ bolt icon marks clustered matches: three or more patterns within a 10-line window, each receiving an additional ×1.5 density multiplier as dense clusters constitute far stronger evidence of synthetic authorship than isolated hits.

Hyper-Verbose Identifiers217 hits · 231 pts
SeverityFileLineSnippetContext
LOWtestapps/on_device_unit_tests/test_app/tools.py19def run_test_suites_into_buffer(suites):CODE
LOWtestapps/on_device_unit_tests/test_app/tools.py26def get_images_with_extension(path=APP_PATH, extension='*.png'):CODE
LOWtestapps/on_device_unit_tests/test_app/tools.py63def get_failed_unittests_from(unittests_output, set_of_tests):CODE
LOWtestapps/on_device_unit_tests/test_app/tools.py72def skip_if_not_running_from_android_device(func):CODE
LOWtestapps/on_device_unit_tests/test_app/tools.py94def get_android_python_activity():CODE
LOWtestapps/on_device_unit_tests/test_app/tools.py166def setup_lifecycle_callbacks():CODE
LOWtestapps/on_device_unit_tests/test_app/app_flask.py39def get_html_for_tested_modules(tested_modules, failed_tests):CODE
LOWtestapps/on_device_unit_tests/test_app/app_kivy.py103 def set_color_for_tested_modules(self, restart=False):STRING
LOWtestapps/on_device_unit_tests/test_app/app_kivy.py136 def test_vibration_with_pyjnius(self, *args):STRING
LOWtests/test_toolchain.py14def patch_argparse_print_help():CODE
LOWtests/test_prerequisites.py28 def test_is_mandatory_on_darwin(self):CODE
LOWtests/test_prerequisites.py31 def test_is_mandatory_on_linux(self):CODE
LOWtests/test_prerequisites.py34 def test_installer_is_supported_on_darwin(self):CODE
LOWtests/test_prerequisites.py40 def test_installer_is_supported_on_linux(self):CODE
LOWtests/test_prerequisites.py46 def test_darwin_pkg_config_location(self):CODE
LOWtests/test_prerequisites.py49 def test_linux_pkg_config_location(self):CODE
LOWtests/test_prerequisites.py53 def test_pkg_config_location_property__darwin(self):CODE
LOWtests/test_prerequisites.py60 def test_pkg_config_location_property__linux(self):CODE
LOWtests/test_prerequisites.py351 def test_checker_calls_linux_checker(self, mock_linux_checker):CODE
LOWtests/test_prerequisites.py361 def test_checker_calls_darwin_checker(self, mock_darwin_checker):CODE
LOWtests/test_prerequisites.py370 def test_checker_raises_on_unsupported_platform(self):CODE
LOWtests/test_prerequisites.py382 def test_ask_to_install_user_accepts(self, mock_input):CODE
LOWtests/test_prerequisites.py392 def test_ask_to_install_user_declines(self, mock_input):CODE
LOWtests/test_prerequisites.py402 def test_ask_to_install_non_interactive(self, mock_info):CODE
LOWtests/test_prerequisites.py426 def test_install_when_user_accepts_darwin(self, mock_installer, mock_ask):CODE
LOWtests/test_prerequisites.py436 def test_install_when_user_declines(self, mock_info, mock_ask):CODE
LOWtests/test_prerequisites.py445 def test_install_is_supported(self):CODE
LOWtests/test_prerequisites.py132 def test_darwin_pkg_config_location(self, _darwin_get_brew_formula_location_prefix):CODE
LOWtests/test_prerequisites.py279 def test_default_darwin_prerequisites_set(self):CODE
LOWtests/test_prerequisites.py297 def test_default_linux_prerequisites_set(self):CODE
LOWtests/test_prerequisites.py324 def test_is_valid_when_not_met_non_mandatory(self, mock_checker, mock_warning):CODE
LOWtests/test_prerequisites.py338 def test_is_valid_when_not_met_mandatory(self, mock_checker, mock_error):CODE
LOWtests/test_prerequisites.py415 def test_install_when_user_accepts_linux(self, mock_info, mock_installer, mock_ask):CODE
LOWtests/test_prerequisites.py458 def test_darwin_jdk_is_supported_valid_version(self, mock_exists, mock_popen):CODE
LOWtests/test_prerequisites.py474 def test_darwin_jdk_is_supported_invalid_version(self, mock_exists, mock_popen):CODE
LOWtests/test_prerequisites.py488 def test_darwin_jdk_is_supported_no_javac(self, mock_exists):CODE
LOWtests/test_prerequisites.py496 def test_darwin_get_libexec_jdk_path(self, mock_run):CODE
LOWtests/test_prerequisites.py509 def test_darwin_checker_uses_java_home_env(self, mock_is_supported):CODE
LOWtests/test_prerequisites.py523 def test_darwin_get_brew_formula_location_prefix_success(self, mock_popen):CODE
LOWtests/test_prerequisites.py539 def test_darwin_get_brew_formula_location_prefix_failure(self, mock_error, mock_popen):CODE
LOWtests/test_prerequisites.py552 def test_darwin_get_brew_formula_location_prefix_with_installed_flag(self, mock_popen):CODE
LOWtests/test_prerequisites.py568 def test_check_and_install_all_met(self, mock_get_prereqs):CODE
LOWtests/test_prerequisites.py589 def test_check_and_install_some_not_met(self, mock_get_prereqs):CODE
LOWtests/test_pythonpackage_basic.py51def test__extract_info_from_package():CODE
LOWtests/test_pythonpackage_basic.py86def test_get_dep_names_of_package():STRING
LOWtests/test_pythonpackage_basic.py157def test_transform_dep_for_pip():STRING
LOWtests/test_pythonpackage_basic.py195def test_parse_as_folder_reference():STRING
LOWtests/test_pythonpackage_basic.py213def test_parse_as_folder_reference_edge_cases(input_ref, expected):STRING
LOWtests/test_pythonpackage_basic.py230def test_is_filesystem_path_edge_cases(path, expected):CODE
LOWtests/test_pythonpackage_basic.py241def test_transform_dep_for_pip_with_special_urls(input_dep, expected):CODE
LOWtests/test_pythonpackage_basic.py246def test_transform_dep_for_pip_passthrough():CODE
LOWtests/test_pythonpackage_basic.py252def test_get_package_name_with_error():CODE
LOWtests/test_pythonpackage_basic.py264def test_get_dep_names_error_handling():CODE
LOWtests/test_pythonpackage_basic.py276def test_extract_info_from_package_missing_metadata():CODE
LOWtests/test_pythonpackage_basic.py317 def run__get_system_python_executable(self, pybin):CODE
LOWtests/test_patching.py42 def test_is_platform_case_insensitive(self, mock_uname):CODE
LOWtests/test_patching.py49 def test_is_platform_mismatch(self, mock_uname):CODE
LOWtests/test_kivy_bootstrap.py56def test_get_activity_reflects_the_configured_class(kivy_bootstrap):CODE
LOWtests/test_kivy_bootstrap.py72def test_get_activity_honours_custom_activity_class_name():CODE
LOWtests/test_kivy_bootstrap.py81def test_get_activity_may_return_none(kivy_bootstrap):CODE
157 more matches not shown…
Self-Referential Comments14 hits · 44 pts
SeverityFileLineSnippetContext
MEDIUMdistribute.sh3# This file is just a shim to report an error messaage if some toolCOMMENT
MEDIUMtests/test_pythonpackage_basic.py268 # Create a setup.py that will failCOMMENT
MEDIUMtests/test_util.py240 # Create a test module fileCOMMENT
MEDIUMtests/test_logger.py142 # Create a mock error with required attributesCOMMENT
MEDIUMtests/test_logger.py187 # Create a proper exception class that mimics sh.ErrorReturnCodeCOMMENT
MEDIUMdoc/source/conf.py6# This file is execfile()d with the current directory set to itsCOMMENT
MEDIUMpythonforandroid/pythonpackage.py124 # This function is required by get_package_as_folder() to workCOMMENT
MEDIUMpythonforandroid/pythonpackage.py267 # Create a venv to install into:COMMENT
MEDIUMpythonforandroid/recipes/hostpython3/__init__.py159 # Create a subdirectory to actually perform the buildCOMMENT
MEDIUMpythonforandroid/recipes/hostpython3/__init__.py176 # Create the Setup file. This copying from Setup.dist isCOMMENT
MEDIUMpythonforandroid/recipes/python3/__init__.py350 # Create a subdirectory to actually perform the buildCOMMENT
MEDIUMpythonforandroid/recipes/android/src/android/mixer.py1# This module is, as much a possible, a clone of the pygameCOMMENT
MEDIUMpythonforandroid/recipes/librt/__init__.py23 # Create a temporary folder to add to link path with a fake librt.so:COMMENT
MEDIUMpythonforandroid/recipes/libpthread/__init__.py22 # Create a temporary folder to add to link path with a fake libpthread.so:COMMENT
Deep Nesting34 hits · 34 pts
SeverityFileLineSnippetContext
LOWtests/test_checkdependencies.py11CODE
LOWtests/test_checkdependencies.py21CODE
LOWpythonforandroid/bootstrap.py20CODE
LOWpythonforandroid/bootstrap.py453CODE
LOWpythonforandroid/bootstrap.py112CODE
LOWpythonforandroid/bootstrap.py251CODE
LOWpythonforandroid/build.py567CODE
LOWpythonforandroid/build.py822CODE
LOWpythonforandroid/build.py1037CODE
LOWpythonforandroid/bdistapk.py35CODE
LOWpythonforandroid/util.py51CODE
LOWpythonforandroid/graph.py146CODE
LOWpythonforandroid/logger.py131CODE
LOWpythonforandroid/toolchain.py198CODE
LOWpythonforandroid/toolchain.py942CODE
LOWpythonforandroid/toolchain.py1002CODE
LOWpythonforandroid/toolchain.py1073CODE
LOWpythonforandroid/recipe.py206CODE
LOWpythonforandroid/recipe.py324CODE
LOWpythonforandroid/recipe.py394CODE
LOWpythonforandroid/recipe.py459CODE
LOWpythonforandroid/recipe.py558CODE
LOWpythonforandroid/recipe.py711CODE
LOWpythonforandroid/recipe.py723CODE
LOWpythonforandroid/recipe.py1545CODE
LOWpythonforandroid/pythonpackage.py120CODE
LOWpythonforandroid/pythonpackage.py246CODE
LOWpythonforandroid/pythonpackage.py381CODE
LOWpythonforandroid/pythonpackage.py472CODE
LOWpythonforandroid/pythonpackage.py571CODE
LOW…thonforandroid/recipes/android/src/android/activity.py38CODE
LOW…thonforandroid/recipes/android/src/android/activity.py52CODE
LOWpythonforandroid/recipes/reportlab/__init__.py15CODE
LOWpythonforandroid/recipes/scipy/wrapper.py32CODE
Excessive Try-Catch Wrapping21 hits · 24 pts
SeverityFileLineSnippetContext
LOWtestapps/on_device_unit_tests/test_app/app_kivy.py161 except Exception as err:STRING
LOWpythonforandroid/build.py466 except Exception:CODE
LOWpythonforandroid/build.py707 except Exception:CODE
LOWpythonforandroid/build.py732 except Exception:CODE
LOWpythonforandroid/build.py760 except Exception as e:CODE
LOWpythonforandroid/build.py767 except Exception:CODE
LOWpythonforandroid/logger.py123 except Exception:CODE
MEDIUMpythonforandroid/logger.py112def get_console_width():CODE
LOWpythonforandroid/recipe.py201 except Exception as ex:CODE
LOWpythonforandroid/recipe.py1279 except Exception:CODE
LOWpythonforandroid/recipe.py1337 except Exception:CODE
LOWpythonforandroid/recipe.py1481 except Exception:CODE
LOW…randroid/recipes/android/src/android/display_cutout.py67 except Exception as e:CODE
LOW…randroid/recipes/android/src/android/display_cutout.py91 except Exception:CODE
LOW…randroid/recipes/android/src/android/display_cutout.py103 except Exception:CODE
LOW…randroid/recipes/android/src/android/display_cutout.py126 except Exception:CODE
LOW…randroid/recipes/android/src/android/display_cutout.py227 except Exception:CODE
MEDIUM…randroid/recipes/android/src/android/display_cutout.py55def onApplyWindowInsets(self, view, insets):CODE
LOW…honforandroid/recipes/android/src/android/broadcast.py88 except Exception as e:CODE
MEDIUM…honforandroid/recipes/android/src/android/broadcast.py84def stop(self):CODE
LOWpythonforandroid/recipes/primp/__init__.py27 except Exception:CODE
Over-Commented Block16 hits · 16 pts
SeverityFileLineSnippetContext
LOWdoc/source/conf.py1# -*- coding: utf-8 -*-COMMENT
LOWdoc/source/conf.py81version = get_version()COMMENT
LOWdoc/source/conf.py101COMMENT
LOWdoc/source/conf.py121#modindex_common_prefix = []COMMENT
LOWdoc/source/conf.py141# Add any paths that contain custom themes here, relative to this directory.COMMENT
LOWdoc/source/conf.py161# relative to this directory. They are copied after the builtin static files,COMMENT
LOWdoc/source/conf.py181# Additional templates that should be rendered to pages, maps page names toCOMMENT
LOWdoc/source/conf.py201#html_show_copyright = TrueCOMMENT
LOWdoc/source/conf.py221# The name of a javascript file (relative to the configuration directory) thatCOMMENT
LOWdoc/source/conf.py241#'figure_align': 'htbp',COMMENT
LOW…onforandroid/includes/arm64-v8a/machine/cpu-features.h1#ifndef _ARM64_CPU_FEATURESCOMMENT
LOWpythonforandroid/recipes/tflite-runtime/__init__.py1from pythonforandroid.recipe import PythonRecipe, current_directory, \COMMENT
LOWpythonforandroid/recipes/libxml2/glob.c81#include <dirent.h>COMMENT
LOWpythonforandroid/recipes/libxml2/glob.c101#define RBRACKET ']'COMMENT
LOWpythonforandroid/recipes/libxml2/glob.c121COMMENT
LOWpythonforandroid/recipes/libxml2/glob.h81#define GLOB_ABORTED (-2) /* Unignored error. */COMMENT
Unused Imports11 hits · 11 pts
SeverityFileLineSnippetContext
LOWtestapps/testapp_vispy/main.py14CODE
LOW…_device_unit_tests/test_app/tests/test_requirements.py20CODE
LOW…_device_unit_tests/test_app/tests/test_requirements.py61CODE
LOW…_device_unit_tests/test_app/tests/test_requirements.py103CODE
LOW…_device_unit_tests/test_app/tests/test_requirements.py262CODE
LOW…_device_unit_tests/test_app/tests/test_requirements.py273CODE
LOWtestapps/testapp_sqlite_openssl/main.py30CODE
LOWtestapps/testapp_sqlite_openssl/main.py32CODE
LOWtestapps/testapp_sqlite_openssl/main.py47CODE
LOWtests/test_pythonpackage_basic.py52CODE
LOW…thonforandroid/recipes/android/src/android/__init__.py8CODE
Redundant / Tautological Comments5 hits · 8 pts
SeverityFileLineSnippetContext
LOWci/run_emulator_tests.sh34 # Check if all success patterns are presentCOMMENT
LOWpythonforandroid/bootstrap.py266 # Check if the bootstap's dependencies have an internal conflict:COMMENT
LOWpythonforandroid/bootstrap.py272 # Check if bootstrap's dependencies conflict with chosenCOMMENT
LOWpythonforandroid/build.py852 # Output messages about what we're going to do:COMMENT
LOWpythonforandroid/pythonpackage.py462 # Check if this is either not an url, or a file URL:COMMENT
Slop Phrases5 hits · 6 pts
SeverityFileLineSnippetContext
LOWpythonforandroid/toolchain.py1067 # WARNING: We should make sure to clean the build directory before building.COMMENT
LOWpythonforandroid/recipe.py880 .. warning:: don't forget to call `super().__init__()` in any recipe'sSTRING
LOWpythonforandroid/recipes/freetype/__init__.py127 # we will make sure to only install it when the library existsCOMMENT
LOWpythonforandroid/recipes/librt/__init__.py31 # Set symlinks, and make sure to update them on every build run:COMMENT
LOWpythonforandroid/recipes/libpthread/__init__.py30 # Set symlinks, and make sure to update them on every build run:COMMENT
Docstring Block Structure1 hit · 5 pts
SeverityFileLineSnippetContext
HIGH…nforandroid/recipes/android/src/android/permissions.py564Requests Android permissions. Args: permissions (str): A list of permissions to requests (str) callSTRING
Decorative Section Separators1 hit · 3 pts
SeverityFileLineSnippetContext
MEDIUM…honforandroid/recipes/android/src/android/broadcast.py1# -------------------------------------------------------------------COMMENT
Dead Code1 hit · 2 pts
SeverityFileLineSnippetContext
MEDIUMpythonforandroid/recipes/pyzmq/__init__.py50CODE
Fake / Example Data1 hit · 1 pts
SeverityFileLineSnippetContext
LOWtests/test_pythonpackage_basic.py45 Lorem Ipsum"""CODE
Overly Generic Function Names1 hit · 1 pts
SeverityFileLineSnippetContext
LOWtests/test_util.py244 f.write("def test_function():\n")CODE
AI Structural Patterns1 hit · 1 pts
SeverityFileLineSnippetContext
LOW…nforandroid/recipes/android/src/android/permissions.py621CODE
Modern Structural Boilerplate1 hit · 1 pts
SeverityFileLineSnippetContext
LOW…thonforandroid/recipes/android/src/android/darkmode.py35def set_dark_mode_listener(on_dark_mode_changed: Callable[[bool], None] | None) -> None:CODE