{"id":13464097,"url":"https://github.com/Tencent/Shadow","last_synced_at":"2025-03-25T10:32:00.417Z","repository":{"id":37319182,"uuid":"191744942","full_name":"Tencent/Shadow","owner":"Tencent","description":"零反射全动态Android插件框架","archived":false,"fork":false,"pushed_at":"2024-12-25T12:49:34.000Z","size":3641,"stargazers_count":7553,"open_issues_count":40,"forks_count":1317,"subscribers_count":160,"default_branch":"master","last_synced_at":"2025-03-20T13:02:57.541Z","etag":null,"topics":["android"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-3-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Tencent.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-06-13T10:50:27.000Z","updated_at":"2025-03-20T06:21:02.000Z","dependencies_parsed_at":"2023-01-26T10:31:24.300Z","dependency_job_id":"809b4835-d754-4549-80e4-c0d20f9d6767","html_url":"https://github.com/Tencent/Shadow","commit_stats":{"total_commits":1461,"total_committers":42,"mean_commits":"34.785714285714285","dds":0.3271731690622861,"last_synced_commit":"09e7e0a677ed44a4e38ed5a0a18bad3265e02a5d"},"previous_names":[],"tags_count":6,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tencent%2FShadow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tencent%2FShadow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tencent%2FShadow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Tencent%2FShadow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Tencent","download_url":"https://codeload.github.com/Tencent/Shadow/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245444145,"owners_count":20616330,"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","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"],"created_at":"2024-07-31T14:00:34.192Z","updated_at":"2025-03-25T10:31:57.258Z","avatar_url":"https://github.com/Tencent.png","language":"Java","funding_links":[],"categories":["Java","Projects List"],"sub_categories":[],"readme":"# Shadow\n\n![Android CI](https://github.com/Tencent/Shadow/workflows/Android%20CI/badge.svg?event=push)\n[![PRs Welcome](https://img.shields.io/badge/PRs-welcome-brightgreen.svg?style=flat-square)](http://makeapullrequest.com)\n\n## 介绍\nShadow是一个腾讯自主研发的Android插件框架，经过线上亿级用户量检验。\nShadow不仅开源分享了插件技术的关键代码，还完整的分享了上线部署所需要的所有设计。\n\n与市面上其他插件框架相比，Shadow主要具有以下特点：\n\n* **复用独立安装App的源码**：插件App的源码原本就是可以正常安装运行的。\n* **零反射无Hack实现插件技术**：从理论上就已经确定无需对任何系统做兼容开发，更无任何隐藏API调用，和Google限制非公开SDK接口访问的策略完全不冲突。\n* **全动态插件框架**：一次性实现完美的插件框架很难，但Shadow将这些实现全部动态化起来，使插件框架的代码成为了插件的一部分。插件的迭代不再受宿主打包了旧版本插件框架所限制。\n* **宿主增量极小**：得益于全动态实现，真正合入宿主程序的代码量极小（15KB，160方法数左右）。\n* **Kotlin实现**：core.loader，core.transform核心代码完全用Kotlin实现，代码简洁易维护。\n\n### 支持特性\n* 四大组件\n* Fragment（代码添加和Xml添加）\n* DataBinding（无需特别支持，但已验证可正常工作）\n* 跨进程使用插件Service\n* 自定义Theme\n* 插件访问宿主类\n* So加载\n* 分段加载插件（多Apk分别加载或多Apk以此依赖加载）\n* 一个Activity中加载多个Apk中的View\n* 等等……\n\n## 编译与开发环境\n\n### 环境准备\n建议直接用最新的稳定版本Android Studio打开工程。目前项目已适配`Android Studio Arctic Fox | 2020.3.1`，\n低版本的Android Studio可能因为Gradle版本过高而无法正常打开项目。\n\n然后在IDE中选择`sample-app`或`sample-host`模块直接运行，分别体验同一份代码在正常安装情况下和插件情况下的运行情况。\n\n![选择sample-host直接运行](pics/run-sample-host-in-ide.png)\n\nShadow的所有代码都位于`projects`目录下的3个目录，分别是：\n\n* `sdk`包含SDK的所有代码\n* `test`包含SDK的自动化测试代码\n* `sample`包含演示代码\n\n其中`sample`应该是大家体验Shadow的最佳环境。\n详见`sample`目录中的[README](projects/sample/README.md)介绍。\n\n### 兼容性\n\nShadow项目有较为完善的自动化测试，因此最新代码对外部环境的版本兼容性可以参考自动化测试的配置。\n\n* [pr-check.yml](.github/workflows/pr-check.yml) 虚拟机自动化测试，包含Android测试机版本和编译环境JDK等版本。\n* [pr-check-gradle-plugin.yml](.github/workflows/pr-check-gradle-plugin.yml) AGP兼容性测试。\n  其中指向的[test_JDK17.sh](projects/test/gradle-plugin-agp-compat-test/test_JDK17.sh)和\n  [test_JDK11.sh](projects/test/gradle-plugin-agp-compat-test/test_JDK11.sh)中定义了被测试的AGP版本。\n\n## 自己写的测试代码出错？\n\n以我们多年的插件环境下业务开发经验，插件框架是不可能一步到位实现完美的。\n因此，我们相信大部分业务在接入时都是需要一定的二次开发工作。\nShadow现有的代码满足的是我们自己的业务现在的需求。得益于全动态的设计，\n插件框架和插件本身都是动态发布的，插件包里既有插件代码也有插件框架代码，\n所以可以根据新版本插件的需要同时开发插件框架。\n\n例如，ShadowActivity没有实现全所有Activity方法，你写的测试代码可能用到了，\n就会出现Method Not Found错误，只需要在ShadowActivity中实现对应方法就可以了。\n大部分方法的实现都只是需要简单的转调就能工作正常。\n\n如果遇到不会实现的功能，可以提Issue。最好附上测试代码。\n\n## 后续开发\n* 原理与设计说明文档\n* 多插件支持的演示工程\n* 自动化测试用例补充\n* 开源包含下载能力的manager实现\n\n## 贡献代码\n\n详见[CONTRIBUTING.md](CONTRIBUTING.md)\n\n## 许可协议\n\nTencent Shadow采用`BSD 3-Clause License`，详见[LICENSE](LICENSE.txt)。\n\n## 个人信息保护规则声明\n\n详见[PRIVACY.md](PRIVACY.md)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FTencent%2FShadow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FTencent%2FShadow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FTencent%2FShadow/lists"}