{"schema_version":"2","scorer_version":"0.1.0","scoring_version":"prov-5+qual-2+sec-2","generated_at":"2026-11-14T14:52:06.179944Z","repo":{"ref":{"host":"github.com","owner":"luojilab","name":"DDComponentForAndroid"},"default_branch":"master","clone_url":"https://github.com/luojilab/DDComponentForAndroid.git","html_url":"https://github.com/luojilab/DDComponentForAndroid","description":"一套完整有效的android组件化方案，支持组件的组件完全隔离、单独调试、集成调试、组件交互、UI跳转、动态加载卸载等功能","stars":3310,"forks":560,"is_fork":false,"is_archived":false,"is_private":false,"size_kb":1060,"primary_language":"Java","license_spdx":"MIT","created_at":"2017-09-07T05:48:44Z","pushed_at":"2020-08-05T03:14:22Z","security_policy_url":null,"distribution":{"owner_created_at":"2016-03-21T10:11:30Z","owner_type":"Organization","release_assets":[]}},"commit_sha":"328377b2fdfc43dabca00d96f058573fd28b989d","profile":{"lines_by_language":{"Java":2730,"Kotlin":89},"files_by_category":{"source":47,"config":42,"other":36,"binary":14,"docs":5,"test":5},"source_lines":2716,"test_lines":103},"pillars":{"ai_provenance":{"score":0.0,"confidence":0.65,"coverage":1.0,"label":"none-detected","breakdown":{"attributed_share":0.0,"suspected_share":0.0,"estimated_share":0.0,"ai_artifacts":0.0,"flagged_work_units":0.0,"flagged_releases":0.0,"style_index":0.0},"summary":"No AI attribution or AI-consistent velocity signals detected."},"quality":{"score":73.3,"confidence":0.9,"coverage":1.0,"label":"adequate","breakdown":{"complexity":93.3,"duplication":95.1,"lint":100.0,"testing":31.4,"docs":65.0,"type_safety":null,"process":null},"summary":"Code quality is adequate: test-to-source ratio 0.04, no CI test run detected; 2% of function code in complex or long functions; 1% duplicated lines. Weakest area: testing."},"security":{"score":68.9,"confidence":0.85,"coverage":1.0,"label":"weak","breakdown":{"secrets":100.0,"sast":64.5,"dependencies":null,"ci_actions":null,"posture":0.0,"scorecard":null},"summary":"Security posture is weak: no high-impact findings. Weakest area: posture."}},"analyzer_results":[{"analyzer":"sec-scorecard","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no published OpenSSF Scorecard result for this repo"},{"analyzer":"sec-registry","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":"no registry dependencies declared"},{"analyzer":"ai-attribution","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"commits":111.0,"attributed_commits":0.0,"attributed_commit_share":0.0,"effective_loc":4980.0,"attributed_loc":0.0,"attributed_loc_share":0.0,"tools_detected":0.0},"findings":[],"evidence":[],"data":{"attributed_loc_by_commit":{},"tools":{},"monthly":{"2017-09":{"loc":3414,"attributed_loc":0},"2017-10":{"loc":0,"attributed_loc":0},"2017-11":{"loc":0,"attributed_loc":0},"2017-12":{"loc":1275,"attributed_loc":0},"2018-01":{"loc":254,"attributed_loc":0},"2018-02":{"loc":37,"attributed_loc":0},"2018-03":{"loc":0,"attributed_loc":0},"2020-08":{"loc":0,"attributed_loc":0}}},"error":null},{"analyzer":"ai-artifacts","pillar":"ai_provenance","status":"ok","tool_version":"signatures-v1","metrics":{"artifacts":0.0,"workflow_agents":0.0,"tools_configured":0.0},"findings":[],"evidence":[],"data":{"artifacts":[],"workflows":[],"tools":[]},"error":null},{"analyzer":"ai-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"work_units":33.0,"flagged_units":0.0,"pre_ai_era_bursts":0.0,"pre_ai_era_measured_loc":4980.0,"pre_ai_era_burst_loc":0.0,"measured_loc":4980.0,"flagged_loc":0.0,"flagged_loc_share":0.0,"max_loc_per_hour":1368.0,"median_loc_per_hour":126.5,"pr_timed_units":1.0,"excluded_import_loc":0.0},"findings":[],"evidence":[],"data":{"flagged_loc_by_commit":{},"excluded_import_commits":[]},"error":null},{"analyzer":"ai-release-velocity","pillar":"ai_provenance","status":"ok","tool_version":"prov-4","metrics":{"releases":3.0,"flagged_releases":0.0,"max_loc_per_day":10.1},"findings":[],"evidence":[],"data":{"releases":[{"from":"v1.0.0","to":"build-gradle1.1.0","loc":254,"days":25.18,"loc_per_day":10.1,"flagged":false},{"from":"build-gradle1.1.0","to":"build-gradle1.2.0","loc":0,"days":21.06,"loc_per_day":0.0,"flagged":false},{"from":"build-gradle1.2.0","to":"componentlib1.3.0","loc":17,"days":2.75,"loc_per_day":6.2,"flagged":false}]},"error":null},{"analyzer":"ai-stylometry","pillar":"ai_provenance","status":"ok","tool_version":null,"metrics":{"lines_scanned":2716.0,"index":0.0,"count:narrated_steps":0.0,"per_kloc:narrated_steps":0.0,"files:narrated_steps":0.0,"count:placeholder":0.0,"per_kloc:placeholder":0.0,"files:placeholder":0.0,"count:emoji_in_code":0.0,"per_kloc:emoji_in_code":0.0,"files:emoji_in_code":0.0,"count:assistant_voice":0.0,"per_kloc:assistant_voice":0.0,"files:assistant_voice":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-secrets","pillar":"security","status":"ok","tool_version":"gitleaks 8.30.1","metrics":{"secrets_current":0.0,"secrets_history":0.0,"secrets_nonprod":0.0,"secrets_low_confidence":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-sast","pillar":"security","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":8.0,"findings_high":0.0,"findings_medium":8.0,"findings_low":0.0,"weighted_findings":3.4,"scanned_lines":2716.0,"parse_errors":0.0},"findings":[{"rule_id":"opengrep/java.android.security.exported_activity","severity":"medium","message":"The application exports an activity. Any application on the device can launch the exported activity which may compromise the integrity of your application or its data.  Ensure that any exported activities do not have privileged access to your application's control plane. [confidence medium]","path":"app/src/main/AndroidManifest.xml","line":15,"fingerprint":"java.android.security.exported_activity:app/src/main/AndroidManifest.xml:15"},{"rule_id":"opengrep/java.lang.security.audit.unsafe-reflection","severity":"medium","message":"If an attacker can supply values that the application then uses to determine which class to instantiate or which method to invoke, the potential exists for the attacker to create control flow paths through the application that were not intended by the application developers. This attack vector may a [confidence low]","path":"componentlib/src/main/java/com/luojilab/component/componentlib/router/Router.java","line":71,"fingerprint":"java.lang.security.audit.unsafe-reflection:componentlib/src/main/java/com/luojilab/component/componentlib/router/Router.java:71"},{"rule_id":"opengrep/java.lang.security.audit.unsafe-reflection","severity":"medium","message":"If an attacker can supply values that the application then uses to determine which class to instantiate or which method to invoke, the potential exists for the attacker to create control flow paths through the application that were not intended by the application developers. This attack vector may a [confidence low]","path":"componentlib/src/main/java/com/luojilab/component/componentlib/router/Router.java","line":95,"fingerprint":"java.lang.security.audit.unsafe-reflection:componentlib/src/main/java/com/luojilab/component/componentlib/router/Router.java:95"},{"rule_id":"opengrep/java.lang.security.audit.unsafe-reflection","severity":"medium","message":"If an attacker can supply values that the application then uses to determine which class to instantiate or which method to invoke, the potential exists for the attacker to create control flow paths through the application that were not intended by the application developers. This attack vector may a [confidence low]","path":"componentlib/src/main/java/com/luojilab/component/componentlib/router/ui/UIRouter.java","line":175,"fingerprint":"java.lang.security.audit.unsafe-reflection:componentlib/src/main/java/com/luojilab/component/componentlib/router/ui/UIRouter.java:175"},{"rule_id":"opengrep/java.lang.security.audit.unsafe-reflection","severity":"medium","message":"If an attacker can supply values that the application then uses to determine which class to instantiate or which method to invoke, the potential exists for the attacker to create control flow paths through the application that were not intended by the application developers. This attack vector may a [confidence low]","path":"componentlib/src/main/java/com/luojilab/component/componentlib/service/AutowiredServiceImpl.java","line":36,"fingerprint":"java.lang.security.audit.unsafe-reflection:componentlib/src/main/java/com/luojilab/component/componentlib/service/AutowiredServiceImpl.java:36"},{"rule_id":"opengrep/java.android.security.exported_activity","severity":"medium","message":"The application exports an activity. Any application on the device can launch the exported activity which may compromise the integrity of your application or its data.  Ensure that any exported activities do not have privileged access to your application's control plane. [confidence medium]","path":"readercomponent/src/main/runalone/AndroidManifest.xml","line":13,"fingerprint":"java.android.security.exported_activity:readercomponent/src/main/runalone/AndroidManifest.xml:13"},{"rule_id":"opengrep/java.android.security.exported_activity","severity":"medium","message":"The application exports an activity. Any application on the device can launch the exported activity which may compromise the integrity of your application or its data.  Ensure that any exported activities do not have privileged access to your application's control plane. [confidence medium]","path":"sharecomponent/src/main/runalone/AndroidManifest.xml","line":13,"fingerprint":"java.android.security.exported_activity:sharecomponent/src/main/runalone/AndroidManifest.xml:13"},{"rule_id":"opengrep/java.android.security.exported_activity","severity":"medium","message":"The application exports an activity. Any application on the device can launch the exported activity which may compromise the integrity of your application or its data.  Ensure that any exported activities do not have privileged access to your application's control plane. [confidence medium]","path":"sharecomponentkotlin/src/main/runalone/AndroidManifest.xml","line":10,"fingerprint":"java.android.security.exported_activity:sharecomponentkotlin/src/main/runalone/AndroidManifest.xml:10"}],"evidence":[],"data":{"rulesets":["java","kotlin"]},"error":null},{"analyzer":"sec-deps","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-actions","pillar":"security","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-posture","pillar":"security","status":"ok","tool_version":null,"metrics":{"check:security_policy":0.0,"check:dependency_updates":0.0,"check:signed_commits":0.0,"check:lockfiles":1.0,"signed_commit_share":0.1712,"unpinned_manifests":0.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"sec-distribution","pillar":"security","status":"ok","tool_version":null,"metrics":{"signals":0.0,"binary_assets":0.0,"suspicious":0.0},"findings":[],"evidence":[],"data":{"signals":[],"suspicious":false,"unusual_traction":false,"metadata":true},"error":null},{"analyzer":"qual-complexity","pillar":"quality","status":"ok","tool_version":"lizard 1.25.1","metrics":{"functions":148.0,"function_nloc":1213.0,"mean_ccn":2.41,"p90_ccn":5.0,"complex_functions":1.0,"long_functions":0.0,"many_param_functions":0.0,"risky_nloc_share":0.0231},"findings":[],"evidence":[{"kind":"complex-function","description":"AutowiredProcessor::buildStatement in router-anno-compiler/src/main/java/com/luojilab/router/compiler/processor/AutowiredProcessor.java: complexity 24, 28 lines","ref":"router-anno-compiler/src/main/java/com/luojilab/router/compiler/processor/AutowiredProcessor.java","url":"https://github.com/luojilab/DDComponentForAndroid/blob/328377b2fdfc43dabca00d96f058573fd28b989d/router-anno-compiler/src/main/java/com/luojilab/router/compiler/processor/AutowiredProcessor.java#L231","weight":0.4}],"data":{},"error":null},{"analyzer":"qual-duplication","pillar":"quality","status":"ok","tool_version":"repotrust-dup-w6","metrics":{"compared_lines":1433.0,"duplicated_lines":12.0,"duplicated_share":0.0084,"files":47.0},"findings":[],"evidence":[{"kind":"duplicate-code","description":"6+ duplicated lines: componentlib/src/main/java/com/luojilab/component/componentlib/service/AutowiredService.java:22 and componentlib/src/main/java/com/luojilab/component/componentlib/service/JsonService.java:26","ref":"componentlib/src/main/java/com/luojilab/component/componentlib/service/AutowiredService.java","url":"https://github.com/luojilab/DDComponentForAndroid/blob/328377b2fdfc43dabca00d96f058573fd28b989d/componentlib/src/main/java/com/luojilab/component/componentlib/service/AutowiredService.java#L22","weight":0.3}],"data":{},"error":null},{"analyzer":"qual-lint","pillar":"quality","status":"ok","tool_version":"opengrep 1.33.1; rules f1d2b562b414","metrics":{"findings":0.0,"weighted_findings":0.0,"scanned_lines":2716.0},"findings":[],"evidence":[],"data":{},"error":null},{"analyzer":"qual-testing","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:has_tests":1.0,"check:test_ratio":0.0758,"check:ci_present":0.0,"check:ci_runs_tests":0.0,"check:ci_runs_lint":0.0,"check:tests_cochange":0.9524,"test_lines":103.0,"source_lines":2716.0,"test_ratio":0.0379,"ci_files":0.0,"cochange_share":0.2381,"cochange_commits":42.0},"findings":[],"evidence":[],"data":{"test_commands":[],"lint_commands":[]},"error":null},{"analyzer":"qual-docs","pillar":"quality","status":"ok","tool_version":null,"metrics":{"check:readme":1.0,"check:license":1.0,"check:contributing":0.0,"check:changelog":0.0,"readme_lines":68.0},"findings":[],"evidence":[{"kind":"docs","description":"README.md","ref":"README.md","url":null,"weight":0.0},{"kind":"docs","description":"LICENSE.md","ref":"LICENSE.md","url":null,"weight":0.0}],"data":{},"error":null},{"analyzer":"qual-type-safety","pillar":"quality","status":"skipped","tool_version":null,"metrics":{},"findings":[],"evidence":[],"data":{},"error":null}],"flags":[]}