首页 > 编程语言 >Android结构优化 - Java、Kotlin项目结构分包

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

时间:2023-04-26 16:23:21浏览次数:58  
标签:src Java Kotlin 分包 srcDirs java Android main sourceSets

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

结构示例

···

标签:src,Java,Kotlin,分包,srcDirs,java,Android,main,sourceSets
From: https://www.cnblogs.com/cps666/p/17356454.html

相关文章

  • python与java 对应的加密算法
    python与java对应的加密算法1.gzip加密java的gzip加密:importjava.io.ByteArrayInputStream;importjava.io.ByteArrayOutputStream;importjava.util.Arrays;importjava.util.zip.GZIPInputStream;importjava.util.zip.GZIPOutputStream;publicclassHello{......
  • Kotlin实战基础 - 设置点击事件、Activity跳转、传值
    基础过度Kotlin基础入门-变量、方法、对象、继承、接口Kotlin实战基础-设置点击事件、Activity跳转、传值Kotlin实战基础-Activity、Fragment传递参数尚未完整,遇缺再补-点击事件Activity跳转Activity跳转+Intent传值点击事件点击事件是基础功......
  • Kotlin基础入门 - for、forEach 循环
    Kotlin基础入门-for、forEach循环liuyong.blog.csdn.net成就一亿技术人!不论身处何方for循环这种操作都随处可见,鉴于大多数Android开发都是从Java转到Kt的,所以我的思路是从Java的使用习惯来讲一些Kt的for、forEach循环方式基础for循环惯性for循环进阶for循......
  • Android Jetpack DataStore
    原文地址www.jianshu.com导语Jetpack简介及其它组件文章DataStore就是SharedPreferences(简称SP)的替代品,Google为什么要用DataStore来替代SP呢,因为SP存在着很多问题,我之前在AndroidSharedPreferences转为MMKV中有详细说明了SP的不足,但是当时的有些观点还有些浅薄,所以使用了......
  • android:Retrofit2网络请求封装
    原文地址blog.csdn.netRetrofit使用=================================================================================Retrofit是一个网络请求框架,先来说一下怎么使用网络权限(添加到AndroidManifest.xml)<uses-permissionandroid:/>gradle依赖(添加到build.gra......
  • Android原生项目引入Flutter
    原文地址www.jianshu.com前言目前Flutter可以说是非常火热了,多次更新过后也越来越稳定,受到了很多开发者的青睐。不过纯Flutter开发还是存在一定成本和风险的,尤其是对于规模稍大一些的项目,可能更加适合的是将Flutter用于项目中的某一个模块,因此我们有必要了解一下如何在原生......
  • Android中好用的库
    原文地址www.jianshu.com本库主要提供一个简单易用的自定义分段控件,方便快速实现分段效果,支持xml配置、代码配置、分段规则按均分/比例分、数字分段、文本分段、渐变分段、bar条样式正常/圆形/三角形,segment文字样式、进度设置、进度标记类型设置、分段描述设置、其它更多自......
  • Android多进程时Application初始化问题
    原文地址blog.csdn.net之前在做项目时,遇到一个大坑,就是我的APP的Application的onCreate方法,竟然执行了好几次,这就导致我在onCreate里面做了一些初始化的操作被重复执行了,导致奇怪的bug产生。后来冷静下来分析一下,才发现有一些第三方组件,比如百度推送之类的,它们是单独开了一......
  • JAVA笔记1
    Java的基础技术包括以下内容:Java语言基础:Java语言是一种面向对象的编程语言,具有丰富的数据类型、控制结构、类和对象等基本特性。Java程序员需要熟练掌握Java语法和语义规则,以便能够编写出正确、高效的代码。Java集合框架:Java集合框架是Java中用于管理和操作数据集合的一组A......
  • Android之Service设置android:process作用
    原文地址blog.csdn.net在AndroidManifest.xml中定义service时会看到这样的代码android:process=”:remote”,例如:1.<service2.android:3.android:enabled="true"4.android:exported="false"5.android:process=":remote"/&g......