Flutter工程目录
Flutter工程和普通Android工程目录结构是不一样的,AS创建一个Flutter工程,Flutter是跨平台框架,包括Android和IOS相关的目录。
Flutter工程结构android目录:Flutter工程的android子工程,和一个普通Android工程类似。
ios目录:是IOS工程相关内容。
lib目录:存放dart文件。
pubspec.yaml文件:Flutter配置文件,添加dart包packages依赖和包名。
工程顶级构建文件settings.gradle,包含构建模块,app主模块,动态include,插件名字。
include ':app'
//android工程根目录的父目录,即flutter工程根目录
def flutterProjectRoot = rootProject.projectDir.parentFile.toPath()
//读取flutter工程根目录下.flutter-plugin文件
def plugins = new Properties()
def pluginsFile = new File(flutterProjectRoot.toFile(), '.flutter-plugins')
if (pluginsFile.exists()) {
pluginsFile.withReader('UTF-8') { reader -> plugins.load(reader) }
}
//遍历.flutter-plugin中每项插件,include引入每项插件模块
plugins.each { name, path ->
def pluginDirectory = flutterProjectRoot.resolve(path).resolve('android').toFile()
include ":$name"
project(":$name").projectDir = pluginDirectory
}
创建一个Flutter插件工程,才会有.flutter-plugins文件。该文件中保存插件name和路径。
Flutter插件工程目录.png在插件工程中,flutter工程是example目录,android主工程的settings.gradle文件,找到父目录example下.flutter-plugins文件,获取插件name和地址,从插件工程根目录,解析并include android插件模块。
.flutter-plugins文件内容。
flutter_plugin1=C:\\Users\\yuan\\Desktop\\flutter_plugin1\\
最终,在插件工程中,example目录下的android主模块,引入example外层插件工程目录android插件模块(和example平级)。
非Flutter插件工程是没有.flutter-plugins文件的,可以忽略settings.gradle文件中除include :app的其他内容。
工程顶级构建文件build.gradle,和普通android工程顶层目录下的build.gradle文件内容基本一样,配置仓储库位置。
####不同之处
rootProject.buildDir = '../build'
subprojects {
project.buildDir = "${rootProject.buildDir}/${project.name}"
}
subprojects {
project.evaluationDependsOn(':app')
}
设置android工程build目录,在android目录的父目录,即Flutter工程目录中,在根目录下创建app子工程的build目录。
主模块app,模块级构建文件build.gradle。
def localProperties = new Properties()
def localPropertiesFile = rootProject.file('local.properties')
if (localPropertiesFile.exists()) {
localPropertiesFile.withReader('UTF-8') { reader ->
localProperties.load(reader)
}
}
def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
}
def flutterVersionCode = localProperties.getProperty('flutter.versionCode')
if (flutterVersionCode == null) {
flutterVersionCode = '1'
}
def flutterVersionName = localProperties.getProperty('flutter.versionName')
if (flutterVersionName == null) {
flutterVersionName = '1.0'
}
apply plugin: 'com.android.application'
apply from: "$flutterRoot/packages/flutter_tools/gradle/flutter.gradle"
读取android目录下local.properties文件内容,该文件包括android sdk和flutter sdk路径,flutter版本,普通local.properties文件包含android sdk路径。
sdk.dir=/Users/chenguang/Library/Android/sdk
flutter.sdk=/Users/chenguang/Documents/flutter
flutter.buildMode=debug
flutter.versionName=1.0.0
flutter.versionCode=1
不配置flutter sdk路径,gradle将报错抛出异常GradleException。
普通的apply plugin,设置app模块是一个application模块。apply from,引入flutter.sdk路径下的构建文件flutter.gradle,在打包时,加入一些Flutter任务。
组件配置
app模块只有一个Activity组件,继承FlutterActivity。
public class MainActivity extends FlutterActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
}
}
FlutterActivity类由flutter sdk提供,在flutter.jar的io.flutter.app目录下,所有dart代码写的页面都在同一个Activity组件中。AndroidManifest.xml文件,设置Activity启动模式singleTop,设置application的name是FlutterApplication类,位于flutter sdk的io.flutter.app.FlutterApplication类,首次启动时,初始化。
@CallSuper
public void onCreate() {
super.onCreate();
FlutterMain.startInitialization(this);
}
flutter工程,依赖flutter sdk,即flutter.jar包。里面包括Flutter相关类和libflutter.so文件。同时依赖dart sdk。
flutter工程release包apk最终打包的apk中,包含libflutter.so,assets文件夹包含所有Flutter命令生成的flutter产物,Flutter相关java文件打包到classes.dex文件中。
任重而道远
网友评论