原生安卓与flutter混编的实现

方案一

  1. 打开顶部窗口Flie->New->New Flutter Project。打开后如下

    此处的flutter sdk可自行下载,不做赘述。

  2. 选好sdk后点击下一步。

    此处的Project location为原生安卓根目录,Project type为Module.
    亦可在原生安卓项目根目录下打开Terminal执行以下命令。

    flutter create -t module --org com.example flutter_module

  3. 创建好之后打开flutter项目下的Terminal。

  4. 在终端中输入flutter pub get获取flutter依赖。

    flutter pub get

  1. 在原生安卓项目的settings.gradle文件中添加flutter_module,添加到末尾即可。

    setBinding(new Binding([gradle: this]))
    evaluate(new File(
    settingsDir,
    'flutter_module/.android/include_flutter.groovy'
    ))

    include ':flutter_module'

其中flutter_module为flutter的项目名。

  1. 在原生安卓的app下build.gradle中添加依赖。

    implementation project(':flutter')

此时同步项目会发现有如下报错。

  1. 在原生安卓项目的settings.gradle中将repositoriesMode设置为PREFER_SETTINGS再次同步即可。

    repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)

同步完之后会发现缺少io.flutter的包,此时即便运行也会包一样的错误。

  1. 在原生安卓项目的settings.gradle中引入io.flutter的仓库,再次同步即可,完整内容如下。

    pluginManagement {
    repositories {
    google()
    mavenCentral()
    maven{ url 'https://maven.aliyun.com/repository/jcenter' }
    maven{
    url 'https://api.mapbox.com/downloads/v2/releases/maven'
    authentication {
    basic(BasicAuthentication)
    }
    credentials {
    // Do not change the username below.
    // This should always be mapbox (not your username).
    username = "mapbox"
    // Use the secret token you stored in gradle.properties as the password
    password = MAPBOX_DOWNLOADS_TOKEN
    }
    }
    maven {
    url 'https://jitpack.io'
    }
    maven {url 'https://developer.huawei.com/repo/'}
    maven { url 'https://repo1.maven.org/maven2/' }
    gradlePluginPortal()

    复制代码
         String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"
         maven {
             url "$storageUrl/download.flutter.io"
         }
     }

    }
    dependencyResolutionManagement {
    repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
    repositories {
    google()
    mavenCentral()
    maven{ url 'https://maven.aliyun.com/repository/jcenter' }
    maven{
    url 'https://api.mapbox.com/downloads/v2/releases/maven'
    authentication {
    basic(BasicAuthentication)
    }
    credentials {
    // Do not change the username below.
    // This should always be mapbox (not your username).
    username = "mapbox"
    // Use the secret token you stored in gradle.properties as the password
    password = MAPBOX_DOWNLOADS_TOKEN
    }
    }
    maven {
    url 'https://jitpack.io'
    }
    maven {url 'https://developer.huawei.com/repo/'}
    maven { url 'https://repo1.maven.org/maven2/' }
    String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"
    maven {
    url "$storageUrl/download.flutter.io"
    }
    }

    }
    rootProject.name = "HuidaPartner"
    include ':app'
    include ':libbase'
    include ':HttpMqtt'
    include ':map'

    setBinding(new Binding([gradle: this]))
    evaluate(new File(
    settingsDir,
    'flutter_module/.android/include_flutter.groovy'
    ))

    include ':flutter_module'

  2. 此时在原生安卓的代码中添加跳转至flutter页面就没有什么问题了。

    val intent: Intent = FlutterActivity.createDefaultIntent(activity)
    activity.startActivity(intent)

上述时一个简单的跳转至flutter主界面。

方案二

上述方案一是针对较老的flutter sdk的,对于新版本的sdk官方推荐的方式是以aar的方式引用。引用的方式是以maven仓库的形式。针对maven仓库,本选用本地maven仓和远程maven仓,本文只简单介绍本地maven仓的方式。

  1. 参照方案一的步骤,直至到第4步,创建好flutter_module项目,之后在flutter_module下打开Terminal,输入

    flutter build aar

在等待一段时间后,会在flutter_module项目的/flutter_module/build/host/outputs/repo目录下生成flutter_debug、flutter_profile、flutter_release三个文件,如下所示。

是不是感觉这个目录结构很眼熟,没错,这结构就是典型的maven仓库的结构,对应的文件也是一应俱全。不熟悉maven本地仓库的可以参考:安卓本地Maven仓的实现这篇文章。

  1. 由于是使用本地代码仓的缘故,flutter_module项目又在我们的原生项目下,可以在settings.gradle中直接引用本地仓库。

    复制代码
     	maven {
             url uri("file://${settingsDir}/flutter_module/build/host/outputs/repo")
         }
  2. 接下来在build.gradle中按照正常的依赖格式引用即可。

    复制代码
     debugImplementation 'com.example.flutter_module:flutter_debug:1.0'
     releaseImplementation 'com.example.flutter_module:flutter_release:1.0'

此处我只引用的debug包和release包,正常情况下我们只需要使用到这两个包。

  1. 当然,io:flutterde的包的引用也是必不可少的,在settings.gradle中引入对应的maven仓

    复制代码
     String storageUrl = System.env.FLUTTER_STORAGE_BASE_URL ?: "https://storage.googleapis.com"
     maven {
             url "$storageUrl/download.flutter.io"
         }
  2. 在完成上述条件后,原生项目在需要的地方直接跳转flutter项目即可。

    val intent: Intent = FlutterActivity.createDefaultIntent(activity)
    activity.startActivity(intent)

如果想使用远程maven仓的形式,可以参考:安卓使用Gitee搭建远程Maven仓,完成远程maven仓的搭建后,在settings.gradle将仓库替换即可。

相关推荐
xiangpanf5 小时前
Laravel 10.x重磅升级:五大核心特性解析
android
robotx8 小时前
安卓线程相关
android
消失的旧时光-19439 小时前
Android 面试高频:JSON 文件、大数据存储与断电安全(从原理到工程实践)
android·面试·json
dalancon10 小时前
VSYNC 信号流程分析 (Android 14)
android
dalancon10 小时前
VSYNC 信号完整流程2
android
dalancon10 小时前
SurfaceFlinger 上帧后 releaseBuffer 完整流程分析
android
用户693717500138411 小时前
不卷AI速度,我卷自己的从容——北京程序员手记
android·前端·人工智能
程序员Android11 小时前
Android 刷新一帧流程trace拆解
android
墨狂之逸才12 小时前
解决 Android/Gradle 编译报错:Comparison method violates its general contract!
android
阿明的小蝴蝶13 小时前
记一次Gradle环境的编译问题与解决
android·前端·gradle