{"id":22935162,"url":"https://github.com/jymot/mv2build","last_synced_at":"2026-05-16T11:01:11.497Z","repository":{"id":138862742,"uuid":"88475699","full_name":"jymot/MV2Build","owner":"jymot","description":"Android build","archived":false,"fork":false,"pushed_at":"2018-03-29T08:28:35.000Z","size":312,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-28T23:46:31.236Z","etag":null,"topics":["android","android-build","android-v2-signing"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jymot.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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":"2017-04-17T05:43:07.000Z","updated_at":"2018-03-29T08:28:36.000Z","dependencies_parsed_at":null,"dependency_job_id":"67a2a666-a998-4a78-b0d2-e28b3f7f44c6","html_url":"https://github.com/jymot/MV2Build","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/jymot/MV2Build","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jymot%2FMV2Build","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jymot%2FMV2Build/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jymot%2FMV2Build/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jymot%2FMV2Build/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jymot","download_url":"https://codeload.github.com/jymot/MV2Build/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jymot%2FMV2Build/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33100319,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-16T04:41:52.686Z","status":"ssl_error","status_checked_at":"2026-05-16T04:41:52.009Z","response_time":115,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"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-build","android-v2-signing"],"created_at":"2024-12-14T11:46:42.113Z","updated_at":"2026-05-16T11:01:11.478Z","avatar_url":"https://github.com/jymot.png","language":"Java","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MV2Build\n打包使用 V2 签名，使用前请确保设置 V2。\n\n### Gradle:\nAdd MV2Build as a dependency in your main build.gradle in the root of your project:\n```gradle\nbuildscript {\n    dependencies {\n        classpath 'im.wangchao:v2-build-plugin:0.2.1'\n    }\n}\n```\n\n```gradle\ncompile 'im.wangchao:build-helper:0.2.1'\n```\n\n`implementation` 代替 `compile`\n\n### 如何使用\n在主工程`build.gradle`文件中添加如下代码：\n```gradle\napply plugin: 'im.wangchao.build'\n\nmV2Build{\n\n    /**\n     * 渠道配置文件\n     */\n    configFile = new File(\"${project.getProjectDir()}/mV2Build/config.json\")\n\n\n    /**\n     * 需要清除渠道的 APK。如果配置该项，那么会有 clearChannel Task 提供使用，\n     * 该 Task 会请空指定 APK 的渠道信息。\n     */\n    clearChannelApkFile = new File(\"${project.buildDir}/outputs/channel/app-release-0.apk\")\n\n    /**\n     * 需要打印渠道信息的 APK。如果配置该项，那么会有 printChannelInfo Task 提供使用。\n     */\n    printChannelApkFile = new File(\"${project.buildDir}/outputs/channel/app-release-测试渠道1.apk\")\n\n\n    /**\n     * 在打包前，需要最先执行的脚本，执行顺序由数组顺序决定。\n     * 数组的值为需要执行脚本的绝对路径。\n     * 注意脚本中，如果使用相对路径，那么该相对路径是相对于项目根目录的，也就是${project.getRootDir()}\n     */\n    preBuildScript = []\n\n    /**\n     * Multi-Channel\n     */\n    channel {\n        /**\n         * Multi-Channel 输出目录\n         */\n        outputDir = new File(\"${project.buildDir}/outputs/channel\")\n        /**\n         * 执行 assembleReleaseChannel Task 输出 APK 的文件格式，可以不设置，默认为${appName}-release-${channel}\n         */\n//    apkFileNameFormat = '${appName}-release-${channel}-test.apk'\n        /**\n         * 需要写入渠道的 APK。如果配置该项，那么会有 onlyWriteChannel Task 提供使用，\n         * 该 Task 只是将已经打好的包根据配置文件，写入渠道。\n         */\n        writeChannelApkFile = new File(\"${project.buildDir}/outputs/channel/app-release-0.apk\")\n        /**\n         * AndroidManifest.xml 文件\n         */\n        manifestFile = new File(\"${project.getProjectDir()}/src/main/AndroidManifest.xml\")\n        /**\n         * 依赖的变种类型，可以不设置，默认为 release\n         */\n//        buildType = \"release\"\n    }\n\n}\n```\n\n然后需要创建一个渠道包的配置文件，也就是上面要用到的渠道配置文件，比如创建一个`config.json`:\n```json\n{\n  \"manifest\": [\n    {\n      \"key\": \"Test\",\n      \"value\": \"V{date}\"\n    }\n  ],\n  \"channel\": {\n    \"increment\": false,\n    \"incrementCount\": 10,\n    \"list\":[\n      {\n        \"alias\": \"测试渠道\",\n        \"channel\": \"test\",\n        \"extraInfo\": {}\n      }\n    ]\n  }\n}\n```\n\n 1. **manifest**\n    配置该配置，会修改**lklBuild**中配置的`manifestFile`文件中的`\u003cmeta-data\u003e`节点，依据配置的`key-value`在`\u003cmeta-data\u003e`节点中查找`android:name`等于`key`的节点，并将其`android:value`设置为`value`。注意，如果`value`中包含`{date}`，会被替换为`yyyyMMdd-HHmmss`的时间格式化。\n 2. **channel**\n    该配置用于**assembleReleaseChannel**任务，该任务主要用于打发布的渠道包。\n\n    * `properties` 同上，和**multiServer**中的配置含义相同\n    * `increment` 是否打递增渠道包，也就是说渠道号从0开始递增\n    * `incrementCount` 递增渠道包的数量\n    * `list` 如果不打递增渠道包，那么打特殊渠道包，每一个item为一个渠道包\n     * `alias` 渠道别名\n     * `channel` 渠道号\n     * `extraInfo` 额外的配置\n\n### 如何获取渠道信息\n获取渠道信息：\n```java\nString channel = ApkInfoReader.getChannel(getApplicationContext());\n```\n获取别名：\n```java\nString alias = ApkInfoReader.getAlias(getApplicationContext());\n```\n获取`extraInfo`中的信息:\n```java\n ChannelInfo info = ApkInfoReader.getChannelInfo(App.instance().getApplicationContext());\n\nString result = info.getExtraInfo().get(\"自定义的key\");\n\n```\n### 打包\n可以直接执行如下命令：\n```shell\n# 渠道发布包\ngradle assembleReleaseChannel\n```\n如果不想执行命令，那么在**Android Studio**界面右侧，点击`Gradle`，然后选择你的主工程，然后找到`mv2build`目录，执行相应的任务就可以了。\n\n### 参考致谢\n * [walle](https://github.com/Meituan-Dianping/walle)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjymot%2Fmv2build","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjymot%2Fmv2build","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjymot%2Fmv2build/lists"}