Top Related Projects
Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstall apk.
A powerful Android Dynamic Component Framework.
A hotfix library for Android platform, and not just this...
A powerful and lightweight plugin framework for Android
🔥🔥Qigsaw ['tʃɪɡsɔ] is a dynamic modularization library which is based on Android App Bundles(Do not need Google Play Service). It supports dynamic delivery for split APKs without reinstalling the base one.
Quick Overview
Walle is an open-source Android and iOS mobile application deployment platform developed by Meituan-Dianping. It aims to simplify and streamline the process of building, signing, and distributing mobile applications for both Android and iOS platforms. Walle provides a user-friendly web interface for managing app releases and supports various deployment scenarios.
Pros
- Supports both Android and iOS app deployment in a single platform
- Offers a user-friendly web interface for easy management of app releases
- Provides flexible deployment options, including gradual rollouts and A/B testing
- Integrates with popular CI/CD tools for automated deployment workflows
Cons
- Documentation is primarily in Chinese, which may be challenging for non-Chinese speakers
- Limited community support compared to some other deployment tools
- May require additional setup and configuration for complex deployment scenarios
- Learning curve for teams not familiar with the Meituan-Dianping ecosystem
Getting Started
To get started with Walle, follow these steps:
-
Clone the repository:
git clone https://github.com/Meituan-Dianping/walle.git
-
Install dependencies:
cd walle pip install -r requirements.txt
-
Configure the database and other settings in
config.py
. -
Run the application:
python manage.py runserver
-
Access the web interface at
http://localhost:5000
and follow the setup wizard to configure your project and deployment settings.
For more detailed instructions and configuration options, refer to the project's documentation (mostly in Chinese).
Competitor Comparisons
Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstall apk.
Pros of tinker
- More comprehensive hot-fix solution, supporting both resources and code changes
- Better performance and smaller patch size due to optimized diff algorithm
- Wider adoption and community support, backed by Tencent
Cons of tinker
- More complex setup and integration process
- Steeper learning curve for developers new to hot-fix solutions
- May require more frequent updates to keep up with Android system changes
Code Comparison
tinker:
TinkerInstaller.onReceiveUpgradePatch(getApplicationContext(), path);
walle:
WalleConfig config = new WalleConfig.Builder()
.apkPath(apkPath)
.channelPath(channelPath)
.build();
Walle.putExtraInfo(config);
While both projects aim to improve Android app development, they serve different purposes. tinker focuses on hot-fixing and patching, while walle primarily deals with channel packaging and information management. tinker offers more advanced features for runtime code and resource updates, but comes with increased complexity. walle, on the other hand, provides a simpler solution for managing app distribution channels and extra information, making it easier to use for its specific purpose.
A powerful Android Dynamic Component Framework.
Pros of Atlas
- More comprehensive Android app architecture solution, focusing on dynamic component management and flexible updates
- Supports multi-process architecture and provides better isolation between components
- Offers a more robust plugin framework for large-scale applications
Cons of Atlas
- Steeper learning curve due to its complex architecture and features
- Requires more setup and configuration compared to Walle
- May be overkill for smaller projects or simpler app structures
Code Comparison
Atlas (Bundle loading):
Atlas.getInstance().installBundle(bundleFile);
Atlas.getInstance().startBundle(bundleName);
Walle (Channel configuration):
walle {
apkOutputFolder = new File("${project.buildDir}/outputs/channels")
apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}.apk'
channelFile = new File("${project.getProjectDir()}/channel")
}
Atlas focuses on dynamic component management and bundle loading, while Walle primarily deals with channel packaging and distribution. Atlas provides more flexibility for large-scale app development, but Walle offers a simpler solution for app distribution across multiple channels.
A hotfix library for Android platform, and not just this...
Pros of Amigo
- Supports incremental updates, reducing download size and update time
- Offers more flexible patching options, including resource and native library patching
- Provides a more comprehensive solution for Android app updates and hotfixes
Cons of Amigo
- More complex setup and integration process compared to Walle
- Requires more extensive modifications to the app's codebase
- May have a steeper learning curve for developers new to advanced patching techniques
Code Comparison
Amigo patch application:
Amigo.work(this);
Walle channel reading:
String channel = WalleChannelReader.getChannel(this);
Key Differences
- Amigo focuses on comprehensive app updating and hotfixing, while Walle primarily handles channel management and packaging
- Amigo offers more advanced features but requires more setup, whereas Walle is simpler to integrate but has more limited functionality
- Amigo is better suited for complex apps requiring frequent updates, while Walle is ideal for apps needing efficient channel management
Use Cases
- Choose Amigo for apps requiring frequent updates, bug fixes, and feature additions without full app reinstallation
- Opt for Walle when the primary need is efficient channel management and packaging for app distribution across multiple platforms
A powerful and lightweight plugin framework for Android
Pros of VirtualAPK
- Supports dynamic loading and running of entire APKs without installation
- Allows for more complex plugin architectures and modular app designs
- Provides a more comprehensive solution for app virtualization
Cons of VirtualAPK
- Higher complexity and steeper learning curve
- Potential performance overhead due to virtualization
- May require more maintenance and updates to keep up with Android changes
Code Comparison
VirtualAPK:
PluginManager pluginManager = PluginManager.getInstance(context);
pluginManager.loadPlugin(new File(apkPath));
Intent intent = new Intent();
intent.setClassName(packageName, activityName);
startActivity(intent);
Walle:
WalleConfig config = new WalleConfig.Builder()
.apkFile(new File(apkPath))
.channelFile(new File(channelPath))
.build();
Walle.getChannelInfo(context, config);
VirtualAPK focuses on loading and running entire APKs dynamically, while Walle is primarily used for channel packaging and information retrieval. VirtualAPK's code demonstrates plugin loading and activity launching, whereas Walle's code shows configuration for channel information extraction.
🔥🔥Qigsaw ['tʃɪɡsɔ] is a dynamic modularization library which is based on Android App Bundles(Do not need Google Play Service). It supports dynamic delivery for split APKs without reinstalling the base one.
Pros of Qigsaw
- Focuses on dynamic feature delivery for Android apps
- Supports incremental updates and on-demand loading of features
- Provides a more modular approach to app development
Cons of Qigsaw
- More complex setup and integration process
- Limited to Android platform
- Requires more careful planning of app architecture
Code Comparison
Qigsaw (Kotlin):
class MyApplication : QigsawApplication() {
override fun onCreate() {
super.onCreate()
Qigsaw.install(this, BuildConfig.DEBUG)
}
}
Walle (Java):
ChannelInfo channelInfo = WalleChannelReader.getChannelInfo(this);
if (channelInfo != null) {
String channel = channelInfo.getChannel();
Map<String, String> extraInfo = channelInfo.getExtraInfo();
}
Summary
Qigsaw is tailored for dynamic feature delivery in Android apps, offering modular development and on-demand loading. It's more complex but provides greater flexibility for large-scale apps. Walle, on the other hand, focuses on channel packaging and reading for Android APKs, making it simpler to use but more limited in scope. The choice between the two depends on the specific needs of the project, with Qigsaw being more suitable for complex, feature-rich applications, while Walle is better for simpler channel management tasks.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual CopilotREADME
Walle
Walleï¼ç¦åï¼ï¼Android Signature V2 Schemeç¾åä¸çæ°ä¸ä»£æ¸ éå æå ç¥å¨
ç¦åéè¿å¨Apkä¸çAPK Signature Block
åºåæ·»å èªå®ä¹çæ¸ éä¿¡æ¯æ¥çææ¸ éå
ï¼ä»èæé«äºæ¸ éå
çææçï¼å¯ä»¥ä½ä¸ºåæºå·¥å
·æ¥ä½¿ç¨ï¼ä¹å¯ä»¥é¨ç½²å¨HTTPæå¡å¨ä¸æ¥å®æ¶å¤çæ¸ éå
Apkçå级ç½ç»è¯·æ±ã
Quick Start
为äºæ¹ä¾¿å¤§å®¶ç使ç¨ï¼æ们æä¾äº2ç§ä½¿ç¨æ¹å¼ï¼
- Gradleæ件æ¹å¼ï¼æ¹ä¾¿å¿«ééæ
- å½ä»¤è¡æ¹å¼ï¼æ大å满足åç§èªå®ä¹éæ±
Gradleæ件使ç¨æ¹å¼
é ç½®build.gradle
å¨ä½äºé¡¹ç®çæ ¹ç®å½ build.gradle
æ件ä¸æ·»å Walle Gradleæ件çä¾èµï¼ å¦ä¸ï¼
buildscript {
dependencies {
classpath 'com.meituan.android.walle:plugin:1.1.7'
}
}
并å¨å½åAppç build.gradle
æ件ä¸applyè¿ä¸ªæ件ï¼å¹¶æ·»å ä¸ç¨äºè¯»åæ¸ éå·çAAR
apply plugin: 'walle'
dependencies {
compile 'com.meituan.android.walle:library:1.1.7'
}
é ç½®æ件
walle {
// æå®æ¸ éå
çè¾åºè·¯å¾
apkOutputFolder = new File("${project.buildDir}/outputs/channels");
// å®å¶æ¸ éå
çAPKçæ件å称
apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk';
// æ¸ éé
ç½®æ件
channelFile = new File("${project.getProjectDir()}/channel")
}
é ç½®é¡¹å ·ä½è§£éï¼
-
apkOutputFolderï¼æå®æ¸ éå çè¾åºè·¯å¾ï¼ é»è®¤å¼ä¸º
new File("${project.buildDir}/outputs/apk")
-
apkFileNameFormatï¼å®å¶æ¸ éå çAPKçæ件å称, é»è®¤å¼ä¸º
'${appName}-${buildType}-${channel}.apk'
å¯ä½¿ç¨ä»¥ä¸åé:projectName - 项ç®åå appName - App模ååå packageName - applicationId (Appå åpackageName) buildType - buildType (release/debugç) channel - channelå称 (对åºæ¸ éæå ä¸çæ¸ éåå) versionName - versionName (æ¾ç¤ºç¨ççæ¬å·) versionCode - versionCode (å é¨çæ¬å·) buildTime - buildTime (ç¼è¯æ建æ¥ææ¶é´) fileSHA1 - fileSHA1 (æç»APKæ件çSHA1åå¸å¼) flavorName - ç¼è¯æ建 productFlavors å
-
channelFileï¼å å«æ¸ éé 置信æ¯çæ件路å¾ã å ·ä½å å®¹æ ¼å¼è¯¦è§ï¼æ¸ éé ç½®æ件示ä¾ï¼æ¯æ使ç¨#å·æ·»å 注éã
å¦ä½è·åæ¸ éä¿¡æ¯
å¨éè¦æ¸ éçä¿¡æ¯æ¶å¯ä»¥éè¿ä¸é¢ä»£ç è¿è¡è·å
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
å¦ä½çææ¸ éå
çææ¸ éå
çæ¹å¼æ¯åassemble${variantName}Channels
æ令ç»åï¼æ¸ éå
ççæç®å½é»è®¤åæ¾å¨ build/outputs/apk/
ï¼ä¹å¯ä»¥éè¿walle
éå
ä¸çapkOutputFolder
åæ°æ¥æå®è¾åºç®å½
ç¨æ³ç¤ºä¾ï¼
- çææ¸ éå
./gradlew clean assembleReleaseChannels
- æ¯æ productFlavors
./gradlew clean assembleMeituanReleaseChannels
æ´å¤ç¨æ³
æå ¥é¢å¤ä¿¡æ¯
channelFile
åªæ¯ææ¸ éåå
¥ï¼å¦ææ³æå
¥é¤æ¸ é以å¤çå
¶ä»ä¿¡æ¯ï¼è¯·å¨walleé
ç½®ä¸ä½¿ç¨configFile
walle {
// æ¸ é&é¢å¤ä¿¡æ¯é
ç½®æ件ï¼ä¸channelFileäºæ¥
configFile = new File("${project.getProjectDir()}/config.json")
}
configFile
æ¯å
å«æ¸ éä¿¡æ¯åé¢å¤ä¿¡æ¯çé
ç½®æ件路å¾ã
é
ç½®æ件éç¨jsonæ ¼å¼ï¼æ¯æ为æ¯ä¸ªchannelåç¬é
ç½®é¢å¤çåå
¥ä¿¡æ¯ãå
·ä½å
å®¹æ ¼å¼è¯¦è§ï¼æ¸ é&é¢å¤ä¿¡æ¯é
ç½®æä»¶ç¤ºä¾ ã
注æï¼
- æ¤é
置项ä¸
channelFile
åè½äºæ¥ï¼å¼åè å¨ä½¿ç¨æ¶éæ©å ¶ä¸å³å¯ï¼ä¸¤è é½åå¨æ¶configFile
ä¼å æ§è¡ã - extraInfo ä¸è¦åºç°ä»¥
channel
为keyçæ åµ
è对åºçæ¸ éä¿¡æ¯è·åæ¹å¼å¦ä¸ï¼
ChannelInfo channelInfo= WalleChannelReader.getChannelInfo(this.getApplicationContext());
if (channelInfo != null) {
String channel = channelInfo.getChannel();
Map<String, String> extraInfo = channelInfo.getExtraInfo();
}
// æè
ä¹å¯ä»¥ç´æ¥æ ¹æ®keyè·å
String value = WalleChannelReader.get(context, "buildtime");
临æ¶çæææ¸ éå
æ们æ¨è使ç¨channelFile/configFileé ç½®æ¥çææ¸ éå ï¼ä½ææ¶ä¹å¯è½æ临æ¶çææ¸ éå éæ±ï¼è¿æ¶å¯ä»¥ä½¿ç¨ï¼
-
çæåä¸ªæ¸ éå :
./gradlew clean assembleReleaseChannels -PchannelList=meituan
-
çæå¤ä¸ªæ¸ éå :
./gradlew clean assembleReleaseChannels -PchannelList=meituan,dianping
-
çææ¸ éå &åå ¥é¢å¤ä¿¡æ¯:
./gradlew clean assembleReleaseChannels -PchannelList=meituan -PextraInfo=buildtime:20161212,hash:xxxxxxx
注æ: è¿éçextraInfo以
key:value
å½¢å¼æä¾ï¼å¤ä¸ªä»¥,
åéã -
使ç¨ä¸´æ¶channelFileçææ¸ éå :
./gradlew clean assembleReleaseChannels -PchannelFile=/Users/xx/Documents/channel
-
使ç¨ä¸´æ¶configFileçææ¸ éå :
./gradlew clean assembleReleaseChannels -PconfigFile=/Users/xx/Documents/config.json
使ç¨ä¸è¿°-Påæ°åï¼æ¬æ¬¡æå
channelFile/configFileé
ç½®å°ä¼å¤±æï¼å
¶ä»é
ç½®ä»ç¶ææã
-PchannelList
,-PchannelFile
, -PconfigFile
ä¸è
ä¸å¯åæ¶ä½¿ç¨ã
å½ä»¤è¡å·¥å ·ä½¿ç¨æ¹å¼
å¯ä»¥ä½¿ç¨å½ä»¤è¡å·¥å ·æ¥æ¯æåç±»èªå®ä¹çéæ±ï¼å ·ä½ä½¿ç¨æ¹å¼è¯¦è§ï¼Walle CLI 使ç¨è¯´æ
å ¶ä»ä½¿ç¨æ¹å¼
为äºæ´å¥½ç满足大家çåç±»èªå®ä¹éæ±ï¼æ们æ对APK Signing Block
åºåè¿è¡è¯»åæä½ç模åè¿è¡äºå°è£
ã
读å模åç使ç¨è¯´æ详è§ï¼
Q&A
åçä»ç»
å¯¹è¯¥å·¥å ·çåçæå ´è¶£çåå¦ï¼å¯ä»¥ç§»æ¥ç¾å¢Androidæ°ä¸ä»£æ¸ éå çæå·¥å ·è¿è¡äºè§£ã
注æäºé¡¹
- 使ç¨apksigneréæ°å¯¹Apkç¾åä¼å¯¼è´æ¸ éä¿¡æ¯ä¸¢å¤±ï¼éè¦å次åå ¥æ¸ éä¿¡æ¯
- 1.1.3çæ¬èµ·ï¼walleæ¯æ对å«æcommentçapkè¿è¡æ¸ éåå ¥, 详è§issue 52
ææ¯æ¯æ
- Read The Fucking Source Code
- éè¿æ交issueæ¥å¯»æ±å¸®å©
- èç³»æ们寻æ±å¸®å©
è´¡ç®ä»£ç
- 欢è¿æ交issue
- 欢è¿æ交PR
åè
License
Copyright 2017 Meituan-Dianping
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
Top Related Projects
Tinker is a hot-fix solution library for Android, it supports dex, library and resources update without reinstall apk.
A powerful Android Dynamic Component Framework.
A hotfix library for Android platform, and not just this...
A powerful and lightweight plugin framework for Android
🔥🔥Qigsaw ['tʃɪɡsɔ] is a dynamic modularization library which is based on Android App Bundles(Do not need Google Play Service). It supports dynamic delivery for split APKs without reinstalling the base one.
Convert designs to code with AI
Introducing Visual Copilot: A new AI model to turn Figma designs to high quality code using your components.
Try Visual Copilot