背景:本文的目的是有一个需求,要求在原生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代表成功。