在前面的章節學習中咱們已經掌握了從最基本的
hello flutter
到各類基本Widget、各類佈局的使用再到多頁面切換路由的使用還有各類炫酷的提示跟dialog,還有關於網絡請求庫Dio的使用,至此咱們徹底可使用flutter去開發一款獨立可運行的app了,可是基於現階段flutter技術棧還不是太成熟,純flutter項目上線風險仍是比較大,因此跨平臺的混合開發模式天然仍是現階段嘗試flutter的主流方式,今天的分享我就跟你們一塊把咱們寫好的flutter項目打包成aar文件嵌入到現有的Android項目中去。html
flutter端項目我採用的是本專欄的實例代碼項目:github.com/xiedong11/f…,Android端原生項目爲新建的一個hello world項目,flutter端的相關配置我會上傳到github倉庫中,原生Android項目比較簡單,我只在本博客中貼出部分關鍵代碼java
flutter端項目工程目錄 android
上面截圖的flutter工程須要通過咱們的改造才能做爲一個aar的形式存在,要被打包成aar的flutter端的項目是做爲一個獨立的module運行在宿主app(原生Android)中,因此咱們須要修改兩個地方,讓咱們打包出來的產物變成aar而不是獨立運行的apk。// 1. 生成aar產物,須要把`application`改成`library`
apply plugin: 'com.android.library'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
android {
compileSdkVersion 28
lintOptions {
disable 'InvalidPackage'
}
defaultConfig {
// 2. flutter 做爲寄存於其餘app中的產物,因此不該該存在applicationId,因此註釋掉該行.
//applicationId "com.zhuandian.flutterapp"
minSdkVersion 16
targetSdkVersion 28
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
}
複製代碼
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zhuandian.flutterapp">
<uses-permission android:name="android.permission.INTERNET" />
<!--1.項目做爲子項目寄存於原生app中,不須要icon、label等屬性,這裏直接省去各類配置便可-->
<application>
<!--android:name="io.flutter.app.FlutterApplication"-->
<!--android:icon="@mipmap/ic_launcher"-->
<!--android:label="flutter_app">-->
<activity
android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|layoutDirection|fontScale|screenLayout|density"
android:hardwareAccelerated="true"
android:launchMode="singleTop"
android:theme="@style/LaunchTheme"
android:windowSoftInputMode="adjustResize">
<!--2.項目做爲子項目寄存於原生app中,入口acitvity不須要配置LAUNCHER,否則應用集成到宿主app中,啓動會在桌面上生成兩個應用圖標-->
<!--<meta-data-->
<!--android:name="io.flutter.app.android.SplashScreenUntilFirstFrame"-->
<!--android:value="true" />-->
<!--<intent-filter>-->
<!--<action android:name="android.intent.action.MAIN" />-->
<!--<category android:name="android.intent.category.LAUNCHER" />-->
<!--</intent-filter>-->
</activity>
<activity android:name=".SecondActivity"></activity>
</application>
</manifest>
複製代碼
須要修改的地方,我都在源碼裏留註釋了,這裏就不展開贅述了,下面咱們來經過gradle得到編譯好的aar
產物git
由於在build.gradle 中,咱們把apply plugin: 'com.android.application'
修改爲了,apply plugin: 'com.android.library'
因此,如今經過Terminal中我執行gradlew assembleRelease
編譯出的產物會有原來的apk變成aar文件,文件輸出目錄爲項目根目錄下的/bulid/app/outputs/aar
以下圖所示: github
1.3.1 新建原生Android項目,我上述打包產出的aar文件做爲依賴放入libs文件夾 bash
1.3.2 修改dependencies
節點下的fileTree
依賴配置,支持引入aar依賴支持網絡
implementation fileTree(dir: 'libs', include: ['*.jar','*.aar'])
複製代碼
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar','*.aar']) ... } 複製代碼
1.3.3 在原生Android項目中寫一個簡單的按鈕測試flutter項目app
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//初始化flutter運行環境
FlutterMain.startInitialization(this)
tv_test_aar.setOnClickListener {
startActivity(Intent(this, com.zhuandian.flutterapp.MainActivity::class.java))
}
}
}
複製代碼
至此,把flutter項目打包成aar導入到原生Android項目中的全部工程配置已經結束了,讀者能夠測試上上述整個過程;但有時候咱們的flutter項目並非單純的flutter官方代碼,開發過程當中少不了引入一些三方依賴,像上節課咱們講到的Dio網絡請求庫,或者是經過
pubspec.yaml
引入的其餘開源工具類,這種狀況下,經過上邊的配置方式,你會發現第三方的依賴代碼是打不進aar包裏的,下面咱們就講解一下藉助fat-aar
的形式把三方依賴代碼打入aar包中去ide
經過上邊的配置,咱們只能把純flutter項目打包成aar文件,換句話說,若是咱們的flutter項目存在三方依賴是不能正常打包進flutter產物裏的,這個時候咱們就須要經過在Android原生項目中引入fat-aar
配置,確保把flutter項目中的三方依賴正常打包進去flutter產物中去。工具
2.1修改項目工程目錄的build.gradle文件,引入fat-aar支持
buildscript {
repositories {
google()
jcenter()
}
dependencies {
classpath 'com.android.tools.build:gradle:3.4.1'
//引入fat-aar支持
classpath 'com.kezong:fat-aar:1.1.7'
}
}
複製代碼
2.2 在上邊第一部分配置app文件下build.gradle基礎上,增長fat-aar相關配置,這裏爲了切換aar library運行環境,我引入isAarLibrary標誌位做爲切換環境開關,方便工程配置,具體代碼以下:
//是否做爲依賴
boolean isAarLibrary = true if (isAarLibrary) {
apply plugin: 'com.android.library'
} else {
apply plugin: 'com.android.application'
}
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
if (isAarLibrary) {
//引入fat-aar
apply plugin: 'com.kezong.fat-aar'
}
android {
compileSdkVersion 28
lintOptions {
disable 'InvalidPackage'
}
defaultConfig {
// TODO: Specify your own unique Application ID (https://developer.android.com/studio/build/application-id.html).
if (!isAarLibrary) {
applicationId "com.zhuandian.flutterapp"
}
minSdkVersion 16
targetSdkVersion 28
versionCode flutterVersionCode.toInteger()
versionName flutterVersionName
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
// TODO: Add your own signing config for the release build.
// Signing with the debug keys for now, so `flutter run --release` works.
signingConfig signingConfigs.debug
}
}
}
flutter {
source '../..'
}
dependencies {
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test:runner:1.1.0'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.0'
implementation 'androidx.appcompat:appcompat:1.0.0'
if (isAarLibrary) {
//TODO 添加fat-aar處理flutter打包成aar中三方依賴
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
if (pluginsFile.exists()) {
pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}
plugins.each { name, _ ->
println name embed project(path: ":$name", configuration: 'default') } } } 複製代碼
2.3 AndroidManifest.xml清單文件中不須要增長額外配置,原生Android端喚起flutter項目aar包的方式也不須要修改,整個引入fat-aar的過程只是爲了確保能把flutter項目中的三方依賴代碼打入到flutter產物中去,因此關於flutter打包成aar的操做跟第一步保持一致就行,第二步的配置,只是爲了確保flutter項目中的三方依賴能正常打包進flutter產物中去
效果圖是我把本專欄的相關代碼做爲一個aar集成到一個新建的原生Android項目中,效果圖以下:
項目的完整代碼配置在github.com/xiedong11/f… 中,讀者能夠參考具體配置細節,筆者在寫本篇博文打包aar時的flutter 環境stable版本爲 flutter v1.9.1
,讀者儘可能用官方穩定版的代碼作測試。