Flutter插件功能探索之package_by_walle插件的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter插件功能探索之package_by_walle插件的使用

flutter多渠道打包(基于walle

flutter多渠道打包可以通过package_by_walle插件实现,该插件基于walle进行多渠道打包。

安装

package_by_walle: 1.0.2

配置

请务必按照步骤一步步配置,参考example目录。

添加依赖

android/build.gradle文件中添加以下代码:

buildscript {
    repositories {
        // 不加这个会出现找不到插件的报错
        maven {
            url 'https://maven.aliyun.com/repository/jcenter'
        }
        maven {
            url 'https://maven.aliyun.com/repository/google'
        }
        google()
        mavenCentral()
    }

    dependencies {
        classpath 'com.android.tools.build:gradle:4.1.0'
        // 添加这一句
        classpath 'com.meituan.android.walle:plugin:1.1.7'
    }
}
walle打包配置

android/app/build.gradle文件最后添加以下代码:

apply plugin: 'walle'

walle {
    // 指定渠道包的输出路径
    apkOutputFolder = new File("${project.rootDir}/output/channels/")
    // 定制渠道包的APK的文件名称
    apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}.apk'
    // 1. channelFile形式(渠道配置文件)
    channelFile = new File("${project.getProjectDir()}/channel")
    // 2. 渠道&额外信息配置文件,与channelFile互斥
    // 此配置项与channelFile功能互斥,开发者在使用时选择其一即可,两者都存在时configFile优先执行。
    configFile = new File("${project.rootDir}/config.json")
}
创建配置方式

在第二步中选择创建一种配置方式,然后创建对应的文件。(参考example/android目录)

打包命令
  • 多渠道打包:gradlew clean assembleReleaseChannels --stacktrace
  • 单个渠道打包:gradlew clean assembleReleaseChannels -PchannelList=meituan

使用

// 获取渠道号
String channel = await PackageByWalle.getPackingChannel ?? "test";

// 获取额外打包参数(configFile文件中配置)
Map<dynamic, dynamic>? info = await PackageByWalle.getPackingInfo;

问题

  • Execution failed for task ':app:lintVitalRelease’

    android {
        compileSdkVersion 30
      
        lintOptions {
            checkReleaseBuilds false
            abortOnError false
        }
    }
    
  • Could not find com.meituan.android.walle:plugin:1.1.7.

    maven {
        url 'https://maven.aliyun.com/repository/jcenter'
    }
    maven {
        url 'https://maven.aliyun.com/repository/google'
    }
    
  • 其他问题请提issue

示例代码

import 'package:flutter/material.dart';
import 'dart:async';

import 'package:flutter/services.dart';
import 'package:package_by_walle/package_by_walle.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatefulWidget {
  const MyApp({Key? key}) : super(key: key);

  [@override](/user/override)
  State<MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String _channel = 'Unknown';
  Map&lt;dynamic, dynamic&gt;? _info;

  [@override](/user/override)
  void initState() {
    super.initState();
    initChannel();
  }

  /// 初始化
  Future&lt;void&gt; initChannel() async {
    String channel;
    Map&lt;dynamic, dynamic&gt;? info;
    // Platform messages may fail, so we use a try/catch PlatformException.
    // We also handle the message potentially returning null.
    try {
      // 获取渠道号
      channel = await PackageByWalle.getPackingChannel ?? 'test';
      // 获取打包配置(configFile文件中配置)
      info = await PackageByWalle.getPackingInfo;
    } on PlatformException {
      channel = 'Failed to get platform version.';
    }

    // If the widget was removed from the tree while the asynchronous platform
    // message was in flight, we want to discard the reply rather than calling
    // setState to update our non-existent appearance.
    if (!mounted) return;

    setState(() {
      _channel = channel;
      _info = info;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('Plugin example app'),
        ),
        body: Column(
          children: [
            Text('channel is: $_channel'),
            Text('info is: ${_info ?? ""}')
          ],
        ),
      ),
    );
  }
}

更多关于Flutter插件功能探索之package_by_walle插件的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter插件功能探索之package_by_walle插件的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用package_by_walle插件的示例代码和步骤。package_by_walle插件通常用于集成Walle多渠道打包工具,以简化和自动化Android应用的渠道打包过程。

步骤 1: 添加依赖

首先,你需要在你的Flutter项目的pubspec.yaml文件中添加package_by_walle依赖:

dependencies:
  flutter:
    sdk: flutter
  package_by_walle: ^最新版本号  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

步骤 2: 配置build.gradle

在Android项目的app/build.gradle文件中,确保你已经应用了必要的插件和配置。例如:

android {
    ...
    defaultConfig {
        ...
        // 确保applicationId已经设置
        applicationId "com.example.yourapp"
        ...
    }
    ...
}

// 在文件的底部添加apply插件
apply from: 'walle.gradle'  // 确保你已经将walle.gradle配置在你的项目根目录或指定位置

步骤 3: 配置walle.gradle

在项目的根目录创建或编辑walle.gradle文件,配置Walle的相关参数:

apply plugin: 'walle'

walle {
    // 指定渠道文件的路径
    apkOutputFolder = file("${buildDir}/outputs/apk/")
    channelFile = file("${projectDir}/channel.txt")  // 渠道列表文件
}

创建一个名为channel.txt的文件,并在其中列出所有你想要打包的渠道,例如:

googleplay
huawei
xiaomi

步骤 4: 使用package_by_walle插件

在你的Flutter项目中,你可以通过调用插件提供的方法来生成多渠道APK。以下是一个示例代码,展示如何在Flutter代码中使用package_by_walle插件:

import 'package:flutter/material.dart';
import 'package:package_by_walle/package_by_walle.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Flutter Walle Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 调用package_by_walle插件生成多渠道APK
              try {
                await PackageByWalle.generateApks();
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('APKs generated successfully!')),
                );
              } catch (e) {
                ScaffoldMessenger.of(context).showSnackBar(
                  SnackBar(content: Text('Failed to generate APKs: $e')),
                );
              }
            },
            child: Text('Generate APKs'),
          ),
        ),
      ),
    );
  }
}

注意

  1. 执行环境:上述代码中的PackageByWalle.generateApks()方法需要在命令行环境中执行,因为它涉及到Android构建系统的调用。通常,你会在Flutter命令行工具中运行一个自定义的脚本或通过CI/CD工具来触发这个命令。

  2. 权限和路径:确保你的Flutter项目有权限访问build.gradlewalle.gradle文件,并且路径配置正确。

  3. 调试和日志:在开发过程中,查看控制台日志以获取有关任何错误或警告的详细信息,这有助于调试配置问题。

这个示例展示了如何在Flutter项目中集成和使用package_by_walle插件来自动化多渠道APK的生成。根据具体需求,你可能需要调整配置和代码。

回到顶部