{"id":18565058,"url":"https://github.com/jenly1314/mvvmframe","last_synced_at":"2026-02-01T10:06:20.281Z","repository":{"id":57720445,"uuid":"161462436","full_name":"jenly1314/MVVMFrame","owner":"jenly1314","description":"🏰 MVVMFrame 是一个基于Google官方推出的JetPack构建的快速开发框架。从此构建一个MVVM模式的项目变得快捷简单。","archived":false,"fork":false,"pushed_at":"2025-05-15T15:23:18.000Z","size":55613,"stargazers_count":394,"open_issues_count":0,"forks_count":57,"subscribers_count":11,"default_branch":"master","last_synced_at":"2025-05-15T16:26:53.330Z","etag":null,"topics":["android","android-architecture-components","architecture-components","component","dagger2","databinding","hilt","jetpack","jetpack-android","kotlin","lifecycle","livedata","mvvm","mvvm-architecture","mvvm-framework","repository","retrofit2","room","room-database","viewmodel"],"latest_commit_sha":null,"homepage":"https://jenly1314.github.io/MVVMFrame/","language":"Kotlin","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jenly1314.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null}},"created_at":"2018-12-12T09:15:50.000Z","updated_at":"2025-05-15T14:00:32.000Z","dependencies_parsed_at":"2024-06-21T00:13:06.889Z","dependency_job_id":"5705c908-2234-4016-a27e-cfa16b7992b4","html_url":"https://github.com/jenly1314/MVVMFrame","commit_stats":null,"previous_names":[],"tags_count":15,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenly1314%2FMVVMFrame","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenly1314%2FMVVMFrame/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenly1314%2FMVVMFrame/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jenly1314%2FMVVMFrame/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jenly1314","download_url":"https://codeload.github.com/jenly1314/MVVMFrame/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254459088,"owners_count":22074605,"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","android-architecture-components","architecture-components","component","dagger2","databinding","hilt","jetpack","jetpack-android","kotlin","lifecycle","livedata","mvvm","mvvm-architecture","mvvm-framework","repository","retrofit2","room","room-database","viewmodel"],"created_at":"2024-11-06T22:17:33.295Z","updated_at":"2026-02-01T10:06:20.272Z","avatar_url":"https://github.com/jenly1314.png","language":"Kotlin","readme":"# MVVMFrame\n\n![Image](app/src/main/ic_launcher-web.png)\n\n[![MavenCentral](https://img.shields.io/maven-central/v/com.github.jenly1314/mvvmframe?logo=sonatype)](https://repo1.maven.org/maven2/com/github/jenly1314/MVVMFrame)\n[![JitPack](https://img.shields.io/jitpack/v/github/jenly1314/MVVMFrame?logo=jitpack)](https://jitpack.io/#jenly1314/MVVMFrame)\n[![CI](https://img.shields.io/github/actions/workflow/status/jenly1314/MVVMFrame/build.yml?logo=github)](https://github.com/jenly1314/MVVMFrame/actions/workflows/build.yml)\n[![Download](https://img.shields.io/badge/download-APK-brightgreen?logo=github)](https://raw.githubusercontent.com/jenly1314/MVVMFrame/master/app/release/app-release.apk)\n[![API](https://img.shields.io/badge/API-21%2B-brightgreen?logo=android)](https://developer.android.com/guide/topics/manifest/uses-sdk-element#ApiLevels)\n[![License](https://img.shields.io/github/license/jenly1314/MVVMFrame?logo=open-source-initiative)](https://opensource.org/licenses/mit)\n\nMVVMFrame for Android 是一个基于Google官方推出的Architecture Components dependencies（现在叫JetPack）构建的快速开发框架。有了 **MVVMFrame** 的加持，从此构建一个 **MVVM** 模式的项目变得快捷简单。\n\n## 架构\n![Image](art/mvvm_architecture.jpg)\n\n## 引入\n\n### Gradle：\n\n1. 在Project的 **build.gradle** 或 **setting.gradle** 中添加远程仓库\n\n    ```gradle\n    repositories {\n        //...\n        mavenCentral()\n        maven { url 'https://jitpack.io' }\n    }\n    ```\n\n2. 在Module的 **build.gradle** 中添加依赖项\n\n    ```gradle\n    implementation 'com.github.jenly1314:mvvmframe:3.2.0'\n    ```\n\n### Gradle Plugin（v3.0.0新增）\n\n1. 首先，将 **MVVMFrame** 插件添加到项目根级 **build.gradle** 文件中：\n\n    ```gradle\n    plugins {\n        //...\n        id 'com.github.jenly1314.mvvmframe' version '3.2.0' apply false\n    }\n    ```\n\n2. 接下来，在 **app/build.gradle** 文件中，添加 **MVVMFrame** 插件：\n\n    ```gradle\n    plugins {\n        //...\n        id 'com.github.jenly1314.mvvmframe'\n    }\n    ```\n\n## 使用\n\n### 版本特别说明\n\n* 3.x版本统一改为使用`kotlin`并进行了重构；之前2.x版本内部使用的`LiveData`相关代码已全部移除，3.x版本已全部改用kotlin独有的`Flow`进行实现。\n\n* 3.x相比较于2.x版本更为精简，可定制性更高。（如果需要在`Compose`中进行使用，只需加上`Compose`的UI相关依赖，稍微封装下即可）\n\n\u003e 建议在新项目中使用；如果你之前使用的是2.x旧版本，请谨慎升级。\n\n\u003e 如果你使用 **v2.x** 版本的话，请直接 [查看2.x分支版本](https://github.com/jenly1314/MVVMFrame/tree/2.x)\n\n---\n\n\u003e 从分割线此处开始，以下全部为3.x版本相关说明\n\n### 集成步骤说明（完整示例可直接查看[app](app)）\n\n**Step.1** 启用 **ViewDataBinding** ，在你项目中的 **build.gradle** 的 **android{}** 中添加配置：\n\n```gradle\nbuildFeatures{\n    dataBinding = true\n}\n```\n\n**Step.2** 使用JDK17编译，在你项目中的 **build.gradle** 的 **android{}** 中添加配置：\n\n```gradle\ncompileOptions {\n    targetCompatibility JavaVersion.VERSION_17\n    sourceCompatibility JavaVersion.VERSION_17\n}\n\n```\n\n**Step.3** 自定义全局配置(继承MVVMFrame中的`FrameConfigModule` )（提示：如果你没有自定义配置的需求，可以直接忽略此步骤）\n\n```kotlin\n/**\n * 全局配置\n */\nclass AppConfigModule : FrameConfigModule() {\n    override fun applyOptions(context: Context, builder: ConfigModule.Builder) {\n        // 通过第一种方式初始化BaseUrl\n        builder.baseUrl(Constants.BASE_URL) // TODO 配置Retrofit中的baseUrl\n\n        builder.retrofitOptions(object : RetrofitOptions {\n            override fun applyOptions(builder: Retrofit.Builder) {\n                // TODO 配置Retrofit\n            }\n        })\n            .okHttpClientOptions(object : OkHttpClientOptions {\n                override fun applyOptions(builder: OkHttpClient.Builder) {\n                    // TODO 配置OkHttpClient\n                }\n            })\n            .gsonOptions(object : GsonOptions {\n                override fun applyOptions(builder: GsonBuilder) {\n                    // TODO 配置Gson\n                }\n            })\n            .roomDatabaseOptions(object : RoomDatabaseOptions {\n                override fun applyOptions(builder: RoomDatabase.Builder\u003cout RoomDatabase\u003e) {\n                    // TODO 配置RoomDatabase\n                }\n            })\n            .configOptions(object : AppliesOptions.ConfigOptions {\n                override fun applyOptions(builder: Config.Builder) {\n                    // TODO 配置Config\n                    builder.httpLoggingLevel(\n                        if (BuildConfig.DEBUG) {\n                            HttpLoggingInterceptor.Level.BODY\n                        } else {\n                            HttpLoggingInterceptor.Level.NONE\n                        }\n                    )\n                }\n            })\n    }\n}\n```\n\n然后在你项目中的 **AndroidManifest.xml** 中通过配置`meta-data`来自定义全局配置（提示：如果你没有自定义配置的需求，可以直接忽略此步骤）\n```xml\n\u003c!-- MVVMFrame 全局配置 --\u003e\n\u003cmeta-data android:name=\"com.king.mvvmframe.config.AppConfigModule\"\n           android:value=\"FrameConfigModule\"/\u003e\n```\n\u003e 此处的`com.king.mvvmframe.config.AppConfigModule` 替换为你自定义的全局配置类\n\n**Step.4** 配置`Application`\n\n```kotlin\n @HiltAndroidApp\n class YourApplication : BaseApplication() {\n    //...\n\n    override fun onCreate() {\n        super.onCreate()\n        // 如果你没有使用FrameConfigModule中的第一中方式初始化BaseUrl，也可以通过此处的第二种方式来设置BaseUrl（二选其一即可）\n//        RetrofitHelper.getInstance().setBaseUrl(baseUrl)\n    }\n }\n```\n\u003e 如果由于某种原因，导致你不能继承`BaseApplication`；你也可以在你自定义的`Application`的`onCreate`函\n 数中通过调用`BaseApplication.initAppConfig`来进行初始化。\n\n### 其他\n\n### 关于使用 **Hilt**\n\n**Hilt** 是JetPack中新增的一个依赖注入库，其基于 **Dagger2** 研发（后面统称为Dagger），但它不同于Dagger。对于Android开发者来说，Hilt可以说专门为Android 打造。\n\n之前使用的 **Dagger for Android** 虽然也是针对于Android打造，也能通过 **@ContributesAndroidInjector** 来通过生成简化一部分样板代码，但是感觉还不够彻底。因为 **Component** 层相关的桥接还是要自己写。**Hilt** 的诞生改善了这些问题。\n\n使用 **Hilt** 之后，依赖注入变得更简单。\n\n#### **Hilt** 目前支持以下 **Android** 类：\n\n* Application（通过使用 @HiltAndroidApp）\n* ViewModel（通过使用 @HiltViewModel）\n* Activity\n* Fragment\n* View\n* Service\n* BroadcastReceiver\n\n**Application** 示例 (这里我们使用BaseApplication)\n```kotlin\n@HiltAndroidApp\nclass YourApplication : BaseApplication() {\n    //...\n}\n```\n\n**ViewModel** 示例 (这里我们使用BaseViewModel)\n```kotlin\n@HiltViewModel\nclass YourViewModel : BaseViewModel() {\n    //...\n}\n```\n\n其他的入口点，都是用 **@AndroidEntryPoint** 注解来声明，示例如下\n\n**Activity** 示例 (这里我们使用BaseActivity)\n```kotlin\n@AndroidEntryPoint\nclass YourActivity: BaseActivity() {\n    //...\n}\n```\n\n**Fragment** 示例 (这里我们使用BaseFragment)\n```kotlin\n@AndroidEntryPoint\nclass YourFragment: BaseFragment() {\n    //...\n}\n```\n\u003e 其他入口点都基本类似，不再一一列举了。更多有关 **Hilt** 的使用说明，可以查看官方的[Hilt使用指南](https://developer.android.google.cn/training/dependency-injection/hilt-android)。\n\n### 关于设置 **BaseUrl**\n\n\u003e 目前通过设置 BaseUrl 的入口主要有两种：\n\u003e\u003e 1.一种是通过在 Manifest 中配置 meta-data 的来自定义 FrameConfigModule,在里面 通过 {@link ConfigModule.Builder#baseUrl(String)}来配置 BaseUrl。（一次设置，全局配置）\n\u003e\n\u003e\u003e 2.一种就是通过RetrofitHelper {@link RetrofitHelper#setBaseUrl(String)} 或 {@link RetrofitHelper#setBaseUrl(HttpUrl)} 来配置 BaseUrl。（可多次设置，动态全局配置，有前提条件）\n\u003e\n\u003e 以上两种配置 BaseUrl 的方式都可以达到目的。但是你可以根据不同的场景选择不同的配置方式。\n\u003e\n\u003e 主要场景与选择如下：\n\u003e\n\u003e\u003e 一般场景：对于只使用单个不变的 BaseUrl的\n\u003e\u003e\u003e     场景1:如果本库的默认已满足你的需求，无需额外自定义配置的。\n\u003e          选择：建议你直接使用 {@link RetrofitHelper#setBaseUrl(String)} 或 {@link RetrofitHelper#setBaseUrl(HttpUrl)} 来初始化 BaseUrl，切记在框架配置初始化 BaseUrl之前，建议在你自定义的 {@link Application#onCreate()}中初始化。\n\u003e\n\u003e\u003e\u003e     场景2:如果本库的默认配置不满足你的需求，你需要自定义一些配置的。（比如需要使用 RxJava相关）\n\u003e          选择：建议你在自定义配置中通过 {@link ConfigModule.Builder#baseUrl(String)} 来初始化 BaseUrl。\n\u003e\n\u003e\u003e 二般场景：对于只使用单个 BaseUrl 但是，BaseUrl中途会变动的。\n\u003e\u003e\u003e     场景3：和一般场景一样，也能分两种，所以选择也和一般场景也可以是一样的。\n\u003e          选择：两种选择都行，但当 BaseUrl需要中途变动时，还需将 {@link RetrofitHelper#setDynamicDomain(boolean)} 设置为 {@code true} 才能支持动态改变 BaseUrl。\n\u003e\n\u003e\u003e 特殊场景：对于支持多个 BaseUrl 且支持动态可变的。\n\u003e\u003e\u003e        选择：这个场景的选择，主要涉及到另外的方法，请查看 {@link RetrofitHelper#putDomain(String, String)} 和 {@link RetrofitHelper#putDomain(String, HttpUrl)}相关详情\n\n\n更多使用详情，请查看[app](app)中的源码使用示例或直接查看 [API帮助文档](https://jenly1314.github.io/MVVMFrame/api/)\n\n## 混淆\n\n 目前 **MVVFrame** 所有依赖混淆规则可参见：[ProGuard rules](mvvmframe/proguard-rules.pro)\n\n## 相关推荐\n\n- [AppTemplate](https://github.com/jenly1314/AppTemplate) 一款基于 **MVVMFrame** 构建的App模板\n- [MVVMFrameComponent](https://github.com/jenly1314/MVVMFrameComponent) 一款基于 **MVVMFrame** 构建的组件化方案\n- [EasyChat](https://github.com/yetel/EasyChatAndroidClient) 一款即时通讯APP\n- [KingWeather](https://github.com/jenly1314/KingWeather)  一款天气预报APP\n- [EasyNote](https://github.com/jenly1314/EasyNote) 一款遵循 **Clean Architecture** 架构分层， 使用 **Jetpack Compose** 实现的笔记App\n- [RetrofitHelper](http://github.com/jenly1314/RetrofitHelper) 一个支持动态改变BaseUrl，动态配置超时时长的Retrofit帮助类。\n- [AppUpdater](http://github.com/jenly1314/AppUpdater) 一个专注于App更新，一键傻瓜式集成App版本升级的轻量开源库。\n- [LogX](http://github.com/jenly1314/LogX) 一个轻量而强大的日志框架；好用不解释。\n- [KVCache](http://github.com/jenly1314/KVCache) 一个便于统一管理的键值缓存库；支持无缝切换缓存实现。\n- [AndroidKTX](http://github.com/AndroidKTX/AndroidKTX) 一个简化 Android 开发的 Kotlin 工具类集合。\n- [AndroidUtil](http://github.com/AndroidUtil/AndroidUtil) 一个整理了Android常用工具类集合，平时在开发的过程中可能会经常用到。\n\n\u003c!-- end --\u003e\n\n## 版本日志\n\n#### v3.2.0：2026-2-1\n* 新增[LogX](https://github.com/jenly1314/LogX)依赖（v1.2.0）\n* 移除Timber依赖（改用LogX统一管理日志）\n* 更新compileSdk至35\n* 更新gradle至v8.13\n* 更新kotlin至v2.0.21\n* 更新appcompat至v1.7.1\n* 更新core-ktx至v1.16.0\n* 更新fragment-ktx至v1.8.9\n* 更新lifecycle-ktx至v2.9.4\n* 更新hilt至v2.55\n* 更新retrofit至v3.0.0\n* 更新gson至v2.13.2\n* 优化细节\n\n#### [查看更多版本日志](CHANGELOG.md)\n\n---\n\n![footer](https://jenly1314.github.io/page/footer.svg)\n\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjenly1314%2Fmvvmframe","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjenly1314%2Fmvvmframe","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjenly1314%2Fmvvmframe/lists"}