Flutter工程结构

作者: gczxbb | 来源:发表于2019-06-23 00:28 被阅读1次

    Flutter工程目录

    Flutter工程和普通Android工程目录结构是不一样的,AS创建一个Flutter工程,Flutter是跨平台框架,包括Android和IOS相关的目录。

    Flutter工程结构

    android目录:Flutter工程的android子工程,和一个普通Android工程类似。
    ios目录:是IOS工程相关内容。
    lib目录:存放dart文件。
    pubspec.yaml文件:Flutter配置文件,添加dart包packages依赖和包名。

    Flutter工程android目录结构

    工程顶级构建文件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文件中。


    任重而道远

    相关文章

      网友评论

        本文标题:Flutter工程结构

        本文链接:https://www.haomeiwen.com/subject/gdrbqctx.html