背景:本文的目的是有一個需求,要求在原生sdk的基礎(chǔ)上包一層flutter,實現(xiàn)一版flutter版的sdk,因為用戶是用flutter來寫代碼。
第1步 創(chuàng)建android sdk 工程并打包aar文件
1.新建AndroidSdk工程,并在其中建立sdkLib模塊
2.執(zhí)行 ./gradlew :sdkLib:assembleRelease 命令打包aar文件
文件生成后對應(yīng)目錄地址為:AndroidSdk/sdkLib/build/outputs/aar/
默認aar文件名為:sdkLib-release.aar
到這android sdk打包aar文件完成
關(guān)鍵代碼
//位于sdkLib下的sdk類
public class NativeSdk {
public static String callSDKMethod(String message) {
return "Native SDK response : " + message;
}
}
第2步 新建android shell 工程
此工程可以理解為將來用戶的App工程,也就是此工程需要調(diào)用flutter sdk
重要參考鏈接
https://blog.csdn.net/m0_61164038/article/details/143995916
1.AndroidShell工程
這一步需要新建一個module,比如叫flutter_call_android ,這樣后續(xù)可以打包為aar文件作為最終flutter sdk給用戶調(diào)用
- 將android sdk的aar包、flutter sdk(第3步中)拷貝到殼工程的app/libs目錄下
關(guān)鍵代碼
//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);
// 設(shè)置MethodChannel
new MethodChannel(flutterEngine.getDartExecutor().getBinaryMessenger(), CHANNEL)
.setMethodCallHandler((call, result) -> {
if (call.method.equals("callNativeSDK")) {
// 獲取Flutter傳遞的參數(shù)
String message = call.argument("message");
// 調(diào)用原生SDK的功能
String response = NativeSdk.callSDKMethod(message);
// 返回結(jié)果給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等,主要是一些環(huán)境配置問題,遇到的兩個錯誤如下
錯誤1
創(chuàng)建fltter module后,執(zhí)行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 中安裝對應(yīng)版本的cmake
2.所有錯誤都解決后用命令打包flutter sdk的aar文件
- 最后生成好后位于flutter_module_call/build/host/outputs/repo/ 目錄下
會有對應(yīng)的debug、release、profile更具需要引用就可以
關(guān)鍵代碼
//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調(diào)用原生SDK示例')),
body: Center(
child: ElevatedButton(
onPressed: () async {
// 調(diào)用原生方法
String result = await callNativeSDK('Hello from Flutter');
print('Result from native: $result');
},
child: Text('調(diào)用原生SDK'),
),
),
),
);
}
// 創(chuàng)建MethodChannel
static const platform = MethodChannel('com.example.flutter_sdk_wrapper/channel');
// 調(diào)用原生方法
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的調(diào)用
點擊殼工程中的“調(diào)用原生SDK按鈕”,后臺輸出日志
Result from native: Native SDK response : Hello from Flutter代表成功。