[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-4148":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":17,"stars30d":18,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":19,"rankGlobal":10,"rankLanguage":10,"license":20,"archived":21,"fork":22,"defaultBranch":23,"hasWiki":21,"hasPages":22,"topics":24,"createdAt":10,"pushedAt":10,"updatedAt":25,"readmeContent":26,"aiSummary":27,"trendingCount":16,"starSnapshotCount":16,"syncStatus":17,"lastSyncTime":28,"discoverSource":29},4148,"VirtualAPK","didi\u002FVirtualAPK","didi","A powerful and lightweight plugin framework for Android","",null,"Java",9055,1534,339,115,0,2,6,67.16,"Apache License 2.0",true,false,"master",[],"2026-06-12 04:00:21","# Android 9.0 supported! Please use [the lastest release](https:\u002F\u002Fgithub.com\u002Fdidi\u002FVirtualAPK\u002Freleases).\n\n# \u003Cimg src=\"imgs\u002Fva-logo.png\" width=\"200px\" align=\"center\" alt=\"VirtualAPK\"\u002F>\n[![license](http:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-Apache2.0-brightgreen.svg?style=flat)](https:\u002F\u002Fgithub.com\u002Fdidi\u002FVirtualAPK\u002Fblob\u002Fmaster\u002FLICENSE)\n[![Release Version](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Frelease-0.9.8-red.svg)](https:\u002F\u002Fgithub.com\u002Fdidi\u002FVirtualAPK\u002Freleases)\n[![PRs Welcome](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FPRs-welcome-brightgreen.svg)](https:\u002F\u002Fgithub.com\u002Fdidi\u002FVirtualAPK\u002Fpulls)\n\nVirtualAPK is a powerful yet lightweight plugin framework for Android. It can dynamically load and run an APK file (we call it `LoadedPlugin`) seamlessly as an installed application. Developers can use any Class, Resources, Activity, Service, Receiver and Provider in `LoadedPlugin` as if they are registered in app's manifest file.\n\n![VirtualAPK](imgs\u002Fva.png)\n\n# Supported Features\n\n| Feature | Detail |\n|:-------------|:-------------:|\n| Supported components | Activity, Service, Receiver and Provider |\n| Manually register components in AndroidManifest.xml | No need |\n| Access host app classes and resources | Supported |\n| PendingIntent | Supported |\n| Supported Android features | Almost all features |\n| Compatibility | Almost all devices |\n| Building system | Gradle plugin |\n| Supported Android versions | API Level 15+ |\n\n# Getting started\n\n## Host Project\n\nAdd a dependency in `build.gradle` in root of host project as following.\n\n``` java\ndependencies {\n    classpath 'com.didi.virtualapk:gradle:0.9.8.6'\n}\n```\n\nApply plugin in application module of `build.gradle`.\n\n```\napply plugin: 'com.didi.virtualapk.host'\n```\n\nCompile VirtualAPK in application module of `build.gradle`.\n\n``` java\ncompile 'com.didi.virtualapk:core:0.9.8'\n```\n\nInitialize `PluginManager` in `YourApplication::attachBaseContext()`.\n\n``` java\n@Override\nprotected void attachBaseContext(Context base) {\n    super.attachBaseContext(base);\n    PluginManager.getInstance(base).init();\n}\n```\n\nModify proguard rules to keep VirtualAPK related files.\n\n```\n-keep class com.didi.virtualapk.internal.VAInstrumentation { *; }\n-keep class com.didi.virtualapk.internal.PluginContentResolver { *; }\n\n-dontwarn com.didi.virtualapk.**\n-dontwarn android.**\n-keep class android.** { *; }\n```\n\nFinally, load an APK and have fun!\n\n``` java\nString pluginPath = Environment.getExternalStorageDirectory().getAbsolutePath().concat(\"\u002FTest.apk\");\nFile plugin = new File(pluginPath);\nPluginManager.getInstance(base).loadPlugin(plugin);\n\n\u002F\u002F Given \"com.didi.virtualapk.demo\" is the package name of plugin APK, \n\u002F\u002F and there is an activity called `MainActivity`.\nIntent intent = new Intent();\nintent.setClassName(\"com.didi.virtualapk.demo\", \"com.didi.virtualapk.demo.MainActivity\");\nstartActivity(intent);\n```\n\n## Plugin Project\n\nAdd a dependency in `build.gradle` in root of plugin project as following.\n\n``` java\ndependencies {\n    classpath 'com.didi.virtualapk:gradle:0.9.8.6'\n}\n```\n\nApply plugin in application module of `build.gradle`.\n\n```\napply plugin: 'com.didi.virtualapk.plugin'\n```\n\nConfig VirtualAPK. Remember to put following lines at the end of `build.gradle`.\n\n```\nvirtualApk {\n    packageId = 0x6f             \u002F\u002F The package id of Resources.\n    targetHost='source\u002Fhost\u002Fapp' \u002F\u002F The path of application module in host project.\n    applyHostMapping = true      \u002F\u002F [Optional] Default value is true. \n}\n```\n\n# Developer guide\n\n* API document [wiki](https:\u002F\u002Fgithub.com\u002Fdidi\u002FVirtualAPK\u002Fwiki)\n* Sample project [PluginDemo](https:\u002F\u002Fgithub.com\u002Fdidi\u002FVirtualAPK\u002Ftree\u002Fmaster\u002FPluginDemo)\n* Read [core library source code](https:\u002F\u002Fgithub.com\u002Fdidi\u002FVirtualAPK\u002Ftree\u002Fmaster\u002FCoreLibrary)\n* Read [Release notes](RELEASE-NOTES.md)\n\n# Known issues\n\n* Notifications with custom layout are not supported in plugin.\n* Transition animations with animation resources are not supported in plugin.\n\n# Contributing\n\nWelcome to contribute by creating issues or sending pull requests. See [Contributing Guide](CONTRIBUTING.md) for guidelines.\n\n# Who is using VirtualAPK?\n\n\u003Cimg src=\"imgs\u002Fdidi.png\" width=\"78px\" align=\"center\" alt=\"滴滴出行\"\u002F> \u003Cimg src=\"imgs\u002Fuber-china.png\" width=\"78px\" align=\"center\" alt=\"Uber中国\"\u002F>\n\n# License\n\nVirtualAPK is licensed under the Apache License 2.0. See the [LICENSE](LICENSE) file.\n","VirtualAPK 是一个强大而轻量级的 Android 插件框架，能够动态加载并运行 APK 文件（称为 `LoadedPlugin`），使其如同已安装的应用程序一样无缝工作。它支持 Activity、Service、Receiver 和 Provider 等组件的动态加载，并允许开发者在插件中直接使用这些组件，无需手动在主应用的 AndroidManifest.xml 中注册。此外，VirtualAPK 还提供了对 PendingIntent 的支持，几乎兼容所有 Android 特性和设备，支持从 API Level 15 及以上版本。此框架特别适合需要快速迭代或希望实现热更新功能的应用场景，通过 Gradle 插件简化了构建过程。","2026-06-11 02:58:42","top_language"]