explaingit

meituan-dianping/walle

6,858JavaAudience · developerComplexity · 3/5LicenseSetup · moderate

TLDR

A Gradle plugin that stamps a single Android APK with different distribution-channel labels in seconds, letting you publish to hundreds of app stores from one build without recompiling.

Mindmap

mindmap
  root((Walle))
    What it does
      Channel labeling
      APK stamping
      Multi-store publish
    How it works
      V2 signature space
      No recompile needed
      Single build
    Tools
      Gradle plugin
      CLI tool
      Runtime reader lib
    Limitation
      Re-signing erases label
Click or tap to explore — scroll the page freely

Code map

Detail Auto

An interactive map of this repo's files and how they connect — its source is parsed live in your browser. Click Visualize to build it.

filefunction / class

Things people build with this

USE CASE 1

Generate hundreds of channel-labeled APK variants from a single signed build for multi-store Android distribution in China.

USE CASE 2

Embed custom metadata such as build timestamps into each APK variant and read it at runtime using the provided reader library.

USE CASE 3

Use the command-line tool to manually insert a channel label into an APK outside of the Gradle build process.

Tech stack

JavaGradle

Getting it running

Difficulty · moderate Time to first run · 30min

Re-signing the APK with apksigner after Walle processing erases the channel info and requires another Walle pass.

Use freely in any project, including commercial ones, as long as you include the Apache 2.0 license notice.

In plain English

Walle is a tool for Android app developers who need to publish their app through multiple distribution channels. In China, Android apps are commonly distributed through dozens of app stores rather than a single platform, and developers need a way to track which store each installation came from. The traditional approach was to build a separate version of the app for each channel, which was slow and resource-intensive. Walle solves this by taking a single signed APK and quickly inserting a small channel identifier into a part of the file that Android's V2 signature scheme sets aside for custom data. Because the channel label goes into that reserved space rather than modifying the app code, the signature stays valid. This means one build can produce hundreds of channel-specific packages in a fraction of the time older methods required. The project comes as a Gradle plugin, so Android developers can add it to their existing build configuration with a few lines. It can also be used as a standalone command-line tool for cases where more control is needed. The Gradle plugin generates all channel packages in one command and lets developers customize the output file names using variables like channel name, version number, and build date. Beyond the channel label, Walle can also embed additional custom metadata into each package, such as a build timestamp or a hash value, which the running app can read at runtime through a provided reader library. The README is written primarily in Chinese and was created by the engineering team at Meituan-Dianping, a major Chinese technology company. The tool is open source under the Apache 2.0 license. One noted limitation is that re-signing the APK with the apksigner tool after Walle processes it will erase the channel information, requiring another pass.

Copy-paste prompts

Prompt 1
I need to publish my Android app to 50 different Chinese app stores. How do I set up Walle in my Gradle project to generate all variants at once?
Prompt 2
How do I read the channel name embedded by Walle at runtime inside my Android app using the reader library?
Prompt 3
I re-signed my APK with apksigner after running Walle and the channel info disappeared. How do I prevent this?
Prompt 4
How do I embed a build timestamp and a custom key-value pair into each Walle channel package and then retrieve them in the app?
Open on GitHub → Explain another repo

← meituan-dianping on gitmyhub — every repo by this author, as a profile.

Verify against the repo before relying on details.