android sdk 套壳flutter包装为FlutterSDK并打包aar给用户调用多工程实现(4个工程)

背景:本文的目的是有一个需求,要求在原生sdk的基础上包一层flutter,实现一版flutter版的sdk,因为用户是用flutter来写代码。

第1步 创建android sdk 工程并打包aar文件

1.新建AndroidSdk工程,并在其中建立sdkLib模块
2.执行 ./gradlew :sdkLib:assembleRelease 命令打包aar文件
  • 文件生成后对应目录地址为:AndroidSdk/sdkLib/build/outputs/aar/

  • 默认aar文件名为:sdkLib-release.aar

到这android sdk打包aar文件完成

关键代码
//位于sdkLib下的sdk类
public class NativeSdk {
    public static String callSDKMethod(String message) {
        return "Native SDK response : " + message;
    }
}

第2步 新建android shell 工程

此工程可以理解为将来用户的App工程,也就是此工程需要调用flutter sdk
重要参考链接
https://blog.csdn.net/m0_61164038/article/details/143995916

1.AndroidShell工程

这一步需要新建一个module,比如叫flutter_call_android ,这样后续可以打包为aar文件作为最终flutter sdk给用户调用

  • 将android sdk的aar包、flutter sdk(第3步中)拷贝到壳工程的app/libs目录下
关键代码
//MainActivity类
public class MainActivity extends FlutterActivity {
    private static final String CHANNEL = "com.example.flutter_sdk_wrapper/channel";

    @Override
    public void configureFlutterEngine(@NonNull FlutterEngine flutterEngine) {
        super.configureFlutterEngine(flutterEngine);

        // 设置MethodChannel
        new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
                .setMethodCallHandler((call, result) -> {
                    if (call.method.equals("callNativeSDK")) {
                        // 获取Flutter传递的参数
                        String message = call.argument("message");

                        // 调用原生SDK的功能
                        String response = NativeSdk.callSDKMethod(message);

                        // 返回结果给Flutter
                        result.success(response);
                    } else {
                        result.notImplemented();
                    }
                });
    }
}
dependencies {
  ...
    implementation fileTree(dir: 'libs', include: ['*.aar']) // 引入 libs 目录下的 AAR 文件
    implementation files('libs/sdkLib-release.aar')
    implementation files('libs/flutter_release-1.0.aar')

    implementation 'io.flutter:flutter_embedding_release:1.0.0-f73bfc4522dd0bc87bbcdb4bb3088082755c5e87'
    implementation 'io.flutter:armeabi_v7a_release:1.0.0-f73bfc4522dd0bc87bbcdb4bb3088082755c5e87'
    implementation 'io.flutter:arm64_v8a_release:1.0.0-f73bfc4522dd0bc87bbcdb4bb3088082755c5e87'
    implementation 'io.flutter:x86_64_release:1.0.0-f73bfc4522dd0bc87bbcdb4bb3088082755c5e87'
  ...
}
第3步 新建flutter sdk工程
1.新建flutter module工程 比如叫flutter_module_call

这一步可能会有很多坑,比如ndk,cmake等,主要是一些环境配置问题,遇到的两个错误如下

错误1

创建fltter module后,执行flutter build aar报错,What went wrong: A problem occurred configuring root project 'android_generated'. > A problem occurred configuring project ':flutter'. > org.gradle.api.InvalidUserDataException: NDK not configured. Download it with SDK manager. Preferred NDK version is '27.0.12077973'.

解决办法:两个版本的ndk都安装上,然后在如下配置

flutter_module_call/android/local.properties 中添加 ndk.dir=/Users/yq/Library/Android/sdk/ndk/27.0.12077973

.android/app/build.gradle下添加

     defaultConfig {
           applicationId "com.example.myfluttermodule"
           minSdkVersion 21
           targetSdkVersion 33
           versionCode 1
           versionName "1.0"

           testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
          //添加这一行代码
           ndkVersion "27.0.12077973"
       }
错误2

':flutter:configureCMakeDebug[arm64-v8a]'. > [CXX1300] CMake '3.22.1' was not found in SDK, PATH, or by cmake.dir property.

解决办法:去sdk tools 中安装对应版本的cmake
2.所有错误都解决后用命令打包flutter sdk的aar文件
  • 最后生成好后位于flutter_module_call/build/host/outputs/repo/ 目录下
    会有对应的debug、release、profile更具需要引用就可以
关键代码
//flutter sdk 包装类 位于lib/main.dart
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: Text('Flutter调用原生SDK示例')),
        body: Center(
          child: ElevatedButton(
            onPressed: () async {
              // 调用原生方法
              String result = await callNativeSDK('Hello from Flutter');
              print('Result from native: $result');
            },
            child: Text('调用原生SDK'),
          ),
        ),
      ),
    );
  }

  // 创建MethodChannel
  static const platform = MethodChannel('com.example.flutter_sdk_wrapper/channel');

  // 调用原生方法
  Future<String> callNativeSDK(String message) async {
    try {
      final String result = await platform.invokeMethod('callNativeSDK', {'message': message});
      return result;
    } on PlatformException catch (e) {
      return 'Failed to call native SDK: ${e.message}';
    }
  }
}

第4步 运行android shell 测试flutter sdk的调用

点击壳工程中的“调用原生SDK按钮”,后台输出日志
Result from native: Native SDK response : Hello from Flutter代表成功。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容