Android结构优化 - Java、Kotlin项目结构分包
随着Android中
Java
、Kotlin
的混编开发场景越来越多,其中大多人都会将java文件
和kt文件
放在同一个资源文件夹下,在项目越来越大的情况下,我们进行代码查询、项目重构、优化都不太便捷,所以本篇主要记录通过kotlin分包
、java分包
来区分、整合 java类和kotlin类
因为目前项目为多包模块化结构,其内也是Java、Kotlin混编开发,有一天看到项目内做了java文件和kotlin文件的分包整合,所以抽时间记录一下
根据我的分包诉求
,顺带学习一下sourceSets
方面的知识,目前我的AndroidStudio
版本为Android Studio Dolphin | 2021.3.1 Patch 1
,并未被强制要求在build.gradle
进行sourceSets
设置(同事说早期需要进行设置,新版可能已经做了内置处理,尚未确定
)
-
-
- 最终效果
- 分包认知
-
- 认知
- 使用
- 分包整合
-
正式开始前,有俩点个人想法提前讲一下
sourceSets
应该是一个资源集合;在Java
中有HashSet
的数据结构,主要用于存储对象,不允许有重复元素,但允许有一个空值,不确定这里的概念是否相同。- 目前不论是否分包,我们都可以在对应的目录中创建
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
属性,通过该属性可指定需要被编译的源文件,不在指定路径下的源文件将会被排除(即不会被编译)
。
Gradle
在Android
中主要用于编译、部署、发布APP,固SourceSets
的设置一般都在对应模块的build.gradle
内,这样Gradle
就可以通过SourceSets
实现Java项目的目录布局定义
认知
我们每次新建项目后都有一个默认的目录结构,大致如下(这个其实就是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、针对debug
与release
模式下, 指定不同的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代码整合分包,将其放到对应的目录区域!!!
build.gradle
中添加sourceSets { main { java.srcDirs("src/main/kotlin", "src/main/java") } }
- 创建
kotlin
文件夹,操作方式右键main文件夹 - New - Directory
,如下图示
- 在我这个
AndroidStudio
版本,创建文件夹时会直接提示Gradle source Sets
的常用文件夹,直接选择kotlin
即可
- 创建
kotlin
文件夹后,需要再创建相应的包名路径
-
结构示例