首先这种方式对代码的侵入性是最小的,也不需要有flutter的环境,因为相关资源已经打包进aar了,下面就来讲解下具体如何操作
1.flutter项目打包成aar
1.1修改Android下的 build.gradle
// 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
}
}
}
- 2 修改Androidmanifest.xml文件
<?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>
现在通过Terminal中我执行gradlew assembleRelease编译出的产物会有原来的apk变成aar文件,文件输出目录为项目根目录下的/bulid/app/outputs/aar
1.3 Android端项目配置接入aar依赖
1.3.1 新建原生Android项目,我上述打包产出的aar文件作为依赖放入libs文件夹
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项目
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默认采用Androidx作为依赖库,所以如果主工程使用的是compat包则需要更新到Androidx,这也是一个不小的工作量
网友评论