android sdk 套殼flutter包裝為FlutterSDK并打包aar給用戶調(diào)用多工程實現(xiàn)(4個工程)

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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容