Android结构优化 - Java、Kotlin项目结构分包

发布时间 2023-04-26 16:21:59作者: cps666

随着Android中 JavaKotlin 的混编开发场景越来越多,其中大多人都会将 java文件kt文件 放在同一个资源文件夹下,在项目越来越大的情况下,我们进行代码查询、项目重构、优化都不太便捷,所以本篇主要记录通过 kotlin分包java分包区分、整合 java类和kotlin类

因为目前项目为多包模块化结构,其内也是Java、Kotlin混编开发,有一天看到项目内做了java文件和kotlin文件的分包整合,所以抽时间记录一下

根据我的分包诉求,顺带学习一下sourceSets方面的知识,目前我的AndroidStudio版本为Android Studio Dolphin | 2021.3.1 Patch 1 ,并未被强制要求在build.gradle进行sourceSets设置(同事说早期需要进行设置,新版可能已经做了内置处理,尚未确定

      • 最终效果
      • 分包认知
        • 认知
        • 使用
      • 分包整合

正式开始前,有俩点个人想法提前讲一下

  1. sourceSets 应该是一个资源集合;在Java中有HashSet的数据结构,主要用于存储对象,不允许有重复元素,但允许有一个空值,不确定这里的概念是否相同。
  2. 目前不论是否分包,我们都可以在对应的目录中创建java、kt文件,也可以相互调用;分包的意义主要在于项目结构的优化,减少一些不必要的麻烦,提升开发效率

最终效果

Project结构示例

在这里插入图片描述

Android结构示例

在这里插入图片描述

MainActivity(Java)

package com.example.demo;

import android.content.Intent;
import android.os.Bundle;
import android.view.View;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(MainActivity.this, LyActivity.class));
            }
        });
    }

}

LyActivity (kt)

package com.example.demo

import android.content.Intent
import android.os.Bundle
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity


class LyActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        findViewById<TextView>(R.id.btn).setOnClickListener {
            startActivity(
                Intent(
                    this@LyActivity,
                    MainActivity::class.java
                )
            )
        }
    }
}

分包认知

关于每个模块的分包,主要用到了SourceSets属性,通过该属性可指定需要被编译的源文件,不在指定路径下的源文件将会被排除(即不会被编译)

GradleAndroid中主要用于编译、部署、发布APP,固SourceSets的设置一般都在对应模块的build.gradle内,这样Gradle就可以通过SourceSets实现Java项目的目录布局定义

认知

关于SourceSets知识,借鉴于此

我们每次新建项目后都有一个默认的目录结构,大致如下(这个其实就是SourceSets默认属性

在这里插入图片描述

SourceSets默认的目录结构是固定的Java标准项目目录布局结构:

android {
    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
            jniLibs.srcDirs = ['libs']
        }

}

使用

1、如果我们不想用默认的,可以重新指定,按如下方式就可以修改目录布局结构

sourceSets {
    main {
        java {
            srcDir 'src/java' // 指定源码目录
        }
        resources {
            srcDir 'src/resources' //资源目录
        }
    }
}

2、针对debugrelease模式下, 指定不同的Manifest文件(我目前还没遇到这样的场景,以后有机会试一试

sourceSets {
        main {
            if (isDebug.toBoolean()) {
                manifest.srcFile 'src/main/debug/AndroidManifest.xml'
            } else {
                manifest.srcFile 'src/main/release/AndroidManifest.xml'
            }
        }
    }

3、如果不想按照java标准提供的文件夹结构,可以通过以下方式重新指定(这种方式偏自定义了,不太建议这么操作

sourceSets {
    main {
        java {
            srcDir 'src/customJavaPath'
        }
    }
}

分包整合

我看有的人是要将项目原始的java文件夹替换为kotlin文件夹,这样的话仅需做以下俩步操作

  • build.gradle中加入sourceSets { main { java.srcDirs("src/main/java") } }
  • java目录更名为kotlin目录

请切记我们的诉求是将项目中的kt代码和java代码整合分包,将其放到对应的目录区域!!!

  1. build.gradle 中添加 sourceSets { main { java.srcDirs("src/main/kotlin", "src/main/java") } }

在这里插入图片描述

  1. 创建kotlin文件夹,操作方式右键main文件夹 - New - Directory ,如下图示

在这里插入图片描述

  1. 在我这个 AndroidStudio 版本,创建文件夹时会直接提示 Gradle source Sets的常用文件夹,直接选择kotlin 即可

在这里插入图片描述

  1. 创建kotlin文件夹后,需要再创建相应的包名路径-
    在这里插入图片描述

结构示例

···