Android開發筆記[12]-使用AAR方式嵌入flutter頁面

qsBye發表於2024-03-17

摘要

使用AAR方式嵌入flutter頁面.

關鍵資訊

  • Android Studio:Iguana | 2023.2.1
  • Gradle:distributionUrl=https://services.gradle.org/distributions/gradle-8.4-bin.zip
  • jvmTarget = '1.8'
  • minSdk 21
  • targetSdk 34
  • compileSdk 34
  • 開發語言:Kotlin,Java
  • ndkVersion = '21.1.6352462'
  • kotlin版本:1.9.20
  • kotlinCompilerExtensionVersion '1.5.4'
  • com.android.library:8.3

原理簡介

flutter簡介

[https://docs.flutter.dev/add-to-app/android/add-flutter-screen?tab=default-activity-launch-kotlin-tab]
[https://docs.flutter.dev/add-to-app/android/project-setup?tab=with-android-studio]
[https://docs.flutter.dev/add-to-app]
[https://flutter.cn/docs/resources/architectural-overview]
Flutter 是一個跨平臺的 UI 工具集,它的設計初衷,就是允許在各種作業系統上覆用同樣的程式碼,例如 iOS 和 Android,同時讓應用程式可以直接與底層平臺服務進行互動。如此設計是為了讓開發者能夠在不同的平臺上,都能交付擁有原生體驗的高效能應用,儘可能地共享複用程式碼的同時,包容不同平臺的差異。

在開發中,Flutter 應用會在一個 VM(程式虛擬機器)中執行,從而可以在保留狀態且無需重新編譯的情況下,熱過載相關的更新。對於發行版 (release) ,Flutter 應用程式會直接編譯為機器程式碼(Intel x64 或 ARM 指令集),或者針對 Web 平臺的 JavaScript。 Flutter 的框架程式碼是開源的,遵循 BSD 開源協議,並擁有蓬勃發展的第三方庫生態來補充核心庫功能。

android的aar/pom方式使用第三方庫/模組

[https://juejin.cn/post/6991815038151426055]
[https://blog.csdn.net/ShuSheng0007/article/details/79666505]
[https://blog.51cto.com/u_16099218/6930094]
[https://baike.baidu.com/item/專案物件模型/63986034?fr=ge_ala]
aar是Android Archive的縮寫,而我們熟悉的jar則是Java Archive的縮寫.說白了`aar就是一種類似於Jar的打包格式。
aar與jar非常類似,基本上都可以理解為一個壓縮檔案( zip-file )。jar中包含了編譯後的class檔案以及一些包含後設資料的文字檔案。而aar比jar多了些Android特有的一些檔案,例如layout檔案,drawable檔案以及manifest檔案。說白了,一個aar在Android中就是一個完整的Module.
在Android Studio中新增一個Android Library,然後在此庫中開發你所要實現的功能,單獨編譯此庫後,在其outputs目錄下就會生成相應的aar檔案。
POM是專案物件模型(projectobjectmodel)的簡稱,是Maven(以專案為中心的設計)對一個單一專案的描述。沒有POM的話,Maven是毫無用處的——POM是Maven的核心。

實現

核心程式碼

  1. 安裝flutter sdk
  2. Android Studio安裝flutter外掛和Dart外掛並重啟
  3. Android Studio新建flutter的module工程alittlesmile_flutter_module
  4. 構建flutter module
cd alittlesmile_flutter_module
export https_proxy=http://127.0.0.1:7890 http_proxy=http://127.0.0.1:7890 all_proxy=socks5://127.0.0.1:7890
export PATH=$PATH:/opt/homebrew/Homebrew/Cellar/flutter/bin
# flutter pub get --no-example
flutter build aar

You can also build an AAR for your Flutter module in Android Studio using the Build > Flutter > Build AAR menu.
4. 配置android專案
settings.gradle

dependencyResolutionManagement {
-  repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
+  repositoriesMode.set(RepositoriesMode.PREFER_SETTINGS)
  repositories {
    google()
    mavenCentral()
+ /* start flutter相關 */
+        maven {
+            url './alittlesmile_flutter_module/build/host/outputs/repo'
+            // This is relative to the location of the build.gradle file
+            // if using a relative path.
+        }
+        maven {
+            url 'https://storage.googleapis.com/download.flutter.io'
+        }
+ /* end flutter相關 */
  }
}

build.gradle(project)

android {
    buildTypes {
        release {
          ...
        }
        debug {
          ...
        }
        create("profile") {
            initWith(getByName("debug"))
        }
}
dependencies {
  // ...
  debugImplementation "cn.qsbye.alittlesmile_flutter_module:flutter_debug:1.0"
  releaseImplementation 'cn.qsbye.alittlesmile_flutter_module:flutter_release:1.0'
  add("profileImplementation", "cn.qsbye.alittlesmile_flutter_module:flutter_profile:1.0")
}

build.gradle(app)

configurations {
    getByName("profileImplementation") {
    }
}
  1. 註冊頁面
    AndroidManifest.xml
<!-- flutter 頁面入口 -->
<activity
android:name="io.flutter.embedding.android.FlutterActivity"
android:theme="@style/Theme.AppCompat.DayNight.NoActionBar"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density|uiMode"
android:hardwareAccelerated="true"
android:windowSoftInputMode="adjustResize" />
  1. 啟動頁面
import io.flutter.embedding.android.FlutterActivity;
FlutterActivity.createDefaultIntent(this)

效果

進入flutter頁面

相關文章