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

news2025/8/11 21:05:30

随着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文件夹后,需要再创建相应的包名路径
    在这里插入图片描述

结构示例

···

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33697.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL集群:双主模式

目录 1、双主模式 1.1、高可用架构 1.2、MMM架构(基于双主模式) 1.2.1、MMM故障处理机制 1.2.2、MMM监控机制 1.3、MHA架构(基于主从模式) 1.3.1、MHA故障处理机制 1.3.2、MHA优点 1.4、主备切换 1.4.1、主备延迟问题 1.4.2、可靠性优先 1.4.3、可用性优先 2、双主…

关于 Laravel Redis 多个进程同时取队列问题详解

最近在工作中遇到了一个问题&#xff0c;开启多个进程处理队列会重复读取 Redis 中队列吗&#xff1f;是否因此导致重复执行任务&#xff1f;下面就来通过示例代码详细介绍下。 使用 Supervisor 监听 Laravel 队列任务&#xff0c;其中 Supervisor 的配置如下&#xff1a; 1 2…

.net----泛型

泛型泛型的基本概念集合类System. Collections. ArrayList泛型集合类System. Collection. Generic. List<T>ArrayListList<T>泛型的定义和类型参数类型参数<T>泛型类和泛型接口泛型类泛型接口泛型结构泛型方法泛型委托和泛型事件default关键字及协变和逆变协…

手动引入jar包,解决Dependency ‘XXX‘ not found的两种方式

目录引言一、使用systemPath导入&#xff08;一&#xff09;将jar包复制到指定文件夹&#xff08;二&#xff09;在pom文件中引入jar包**这里有一个超级大的坑&#xff0c;就是systemPath不支持聚合工程的父子传导&#xff01;&#xff01;&#xff01;****不支持pom工程的继承…

Linux零基础从入门到精通,必学的55个指令合集【上篇】

Linux学习笔记 资料下载&#xff1a; 链接: https://pan.baidu.com/s/1UvwkJaEJO7W3sU5qkCgKzA?pwdfe2f提取码: fe2f 本篇文章主要适用0基础的读者&#xff0c;内容会比较通俗易懂&#xff0c;也会有详细的图解教程&#xff0c;以及运行后的返回结果。我本人在系统性的学习…

G1D22-安装burpsuiteAttacKG

–0724 还有几分钟&#xff0c;把burpsuite安装一下 —0804 hh当然&#xff0c;和室友聊天去啦hhh java目录下找不到jdk&#xff0c;环境变量没法配emm&#xff0c;重新装一下。 emm原来这个文件夹是在安装时自己创建的 啊啊啊&#xff0c;我是猪emm javasuite闪退是因为环境变…

别瞎扯,元宇宙就是没有切实发展?

前言 最近两年&#xff0c;技术圈比较火的话题之一就是&#xff1a;元宇宙&#xff0c;而且2021年被看作是元宇宙元年&#xff0c;直到现在元宇宙话题依然不断&#xff0c;因为元宇宙在过去的一年里太火了。不管是在国内还是国外&#xff0c;元宇宙太火了&#xff0c;而且与元宇…

WPF项目实战布局--通用固件下载 C#

每个作品都是产品 C# WPF版效果&#xff1a; C# winForm版效果: 一.布局设计UI 1.主体&#xff1a;grid 2行 2列 00 下载按钮 20% 01进度条 80% &#xff08;同时显示百分比&#xff09; 10 11都是跨列 显示日志 2.细节&#xff1a;百分比与进度条Value绑定。下载按钮…

java EE初阶 — 计算机工作原理

文章目录1.操作系统2.操作系统的定位3.进程3.1 进程的基本了解3.2 操作系统内核是如何管理软件资源的3.3 PCB里描述了进程的哪些特征3.3.1 三个较为简单的特征3.3.2 进程的调度属性4.内存管理1.操作系统 操作系统是一个搞管理的软件。 对上要给软件提供稳定的运行环境。对下要…

Java面向对象之——继承

文章目录前言一、继承机制二、继承的语法三、父类成员访问&#x1f351;1、子类中访问父类的成员变量&#x1f351;2、子类中访问父类的成员方法四、super关键字五、子类构造方法六、super和this七、继承关系下的代码执行顺序八、访问限定修饰符protected九、Java继承方式十、f…

C#界面里Control.ImeMode 属性的使用

C#界面里Control.ImeMode 属性的使用 Control.ImeMode 属性是获取或设置控件的输入法编辑器 (IME) 模式。 输入法是一种特殊的程序,可以通过某种方式进行激活。 输入法程序总是在别的程序上面,因此它的运行是一种特殊的状态,所以需要特别处理。 因为电脑当时为了输入26个字…

第 46 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(南京),签到题5题

文章目录A.Oops, Its Yesterday Twice MoreM.Windblume FestivalC.Klee in Solitary ConfinementH.CrystalflyD.Paimon Sorting补题链接&#xff1a;https://codeforces.com/gym/103470 A.Oops, It’s Yesterday Twice More Oops, It’s Yesterday Twice More Input file: st…

2020-RKT

2020-RKT&#xff1a;Relation-Aware Self-Attention for Knowledge Tracing 有代码&#xff1a;https://github.com/shalini1194/RKT 摘要 学生在解决练习的过程中获得技能&#xff0c;每一次这样的互动都对学生解决未来练习的能力有明显的影响。 这种影响表现为:1)互动中涉…

Transformer13~目标检测算法汇总

都到了13了 ~~ 还是基于这个的么办法 自从VIT横空出世以来&#xff0c;Transformer在CV界掀起了一场革新&#xff0c;各个上下游任务都得到了长足的进步&#xff0c;然后盘点一下基于Transformer的端到端目标检测算法&#xff01; 原始Tranformer检测器 DETR&#xff08;ECCV…

神经网络架构

神经网络架构 首先我们来看一张图&#xff0c;左边的是生物上的神经网络&#xff0c;右边的是数学版的神经网络 下面我们介绍在深度学习中神经网络的基本架构 整体架构包括层次结构&#xff0c;神经元&#xff0c;全连接&#xff0c;非线性四个部分 我们将针对这四个部分来进…

章节4 Linux操作系统基础知识

4.1-Linux系统结构 Linux系统结构 内核Shell文件系统应用程序 Linux操作系统内核 管理进程管理内存管理驱动管理文件和网络 … Linux Shell 接收用户的命令&#xff0c;经过转换&#xff0c;交给内核去执行 cat —> open() read() 简化操作安全 Linux Shell工具&am…

【docker学习记录】docker安装mysql、redis

目录 docker安装mysql docker安装redis docker安装mysql 1.下载镜像文件 $ sudo docker pull mysql:8.0.31 下载完成后查看一下镜像&#xff1a;sudo docker images 2.创建实例并启动 //mysql版本5 sudo docker run -p 3306:3306 --name mysql \ -v /mydata/mysql/log:/var…

uniapp的安装与基础

解释 由dcloud 公司开发的 多端融合框架 1次开发 多端运行 竞品&#xff1a;apiCloud &#xff0c;appCan &#xff0c;Codova 技术架构 Vue语法小程序的api Hybrid混合开发端 App端 - HTML - nvue&#xff08;原生view&#xff09; - native.js(js原生沟通的桥梁) - weex …

目前是大专学历如何快速提升到本科学历?学历提升有哪几种形式呢?

目前是大专学历如何快速提升到本科学历&#xff1f;学历提升有哪几种形式呢&#xff1f; 如今想要晋升和加薪&#xff0c;很多除了工作能力分级&#xff0c;另一个是文凭&#xff0c;许多企业和机构基本上是基于文凭来决定基本工资&#xff0c;所以想得到更好的待遇&#xff0c…

深度强化学习+金融投资的应用入门

原创文章第114篇&#xff0c;专注“个人成长与财富自由、世界运作的逻辑&#xff0c; AI量化投资”。 今天的核心工作是把强化学习环境整合进我们的AI量化平台中。 网上很多代码都把数据获取和预处理&#xff0c;都整合到强化学习的环境里&#xff0c;对于总体量化平台而言&am…