news 2026/8/28 10:15:48

Android 按功能/模块分包完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Android 按功能/模块分包完整指南

Android 按功能/模块分包完整指南

一、核心理念

按功能模块组织代码和资源,而不是按类型

  • Java代码:按模块建包(package)
  • XML资源:按模块建目录(res/layout_模块名)

二、完整项目结构示例

电商App为例(用户、订单、商品、购物车、消息)

app/ ├── src/ │ └── main/ │ ├── **java/com/example/app/** │ │ ├── **base/** # 基础层 │ │ │ ├── BaseActivity.java │ │ │ ├── BaseFragment.java │ │ │ ├── BaseAdapter.java │ │ │ └── BaseApplication.java │ │ │ │ │ ├── **common/** # 公共组件 │ │ │ ├── utils/ # 工具类 │ │ │ │ ├── DateUtils.java │ │ │ │ ├── FileUtils.java │ │ │ │ └── NetworkUtils.java │ │ │ ├── widget/ # 自定义控件 │ │ │ │ ├── TitleBar.java │ │ │ │ ├── LoadingView.java │ │ │ │ └── EmptyView.java │ │ │ └── constant/ # 常量 │ │ │ ├── ApiConstants.java │ │ │ └── SPConstants.java │ │ │ │ │ ├── **module_auth/** # 认证模块 │ │ │ ├── activity/ │ │ │ │ ├── LoginActivity.java │ │ │ │ └── RegisterActivity.java │ │ │ ├── fragment/ │ │ │ │ └── ForgetPasswordFragment.java │ │ │ ├── adapter/ │ │ │ │ └── AuthMethodAdapter.java │ │ │ ├── model/ # 数据模型 │ │ │ │ ├── User.java │ │ │ │ └── LoginRequest.java │ │ │ ├── network/ # 网络请求 │ │ │ │ └── AuthApi.java │ │ │ └── viewmodel/ # ViewModel │ │ │ └── LoginViewModel.java │ │ │ │ │ ├── **module_home/** # 首页模块 │ │ │ ├── activity/ │ │ │ │ └── MainActivity.java │ │ │ ├── fragment/ │ │ │ │ ├── HomeFragment.java │ │ │ │ └── DiscoverFragment.java │ │ │ ├── adapter/ │ │ │ │ ├── BannerAdapter.java │ │ │ │ └── HomeMenuAdapter.java │ │ │ └── model/ │ │ │ ├── Banner.java │ │ │ └── MenuItem.java │ │ │ │ │ ├── **module_user/** # 用户模块 │ │ │ ├── activity/ │ │ │ │ ├── ProfileActivity.java │ │ │ │ ├── SettingsActivity.java │ │ │ │ └── AddressActivity.java │ │ │ ├── fragment/ │ │ │ │ └── UserCenterFragment.java │ │ │ ├── adapter/ │ │ │ │ ├── UserOrderAdapter.java │ │ │ │ └── AddressAdapter.java │ │ │ └── model/ │ │ │ ├── UserInfo.java │ │ │ └── Address.java │ │ │ │ │ ├── **module_order/** # 订单模块 │ │ │ ├── activity/ │ │ │ │ ├── OrderListActivity.java │ │ │ │ └── OrderDetailActivity.java │ │ │ ├── fragment/ │ │ │ │ ├── OrderConfirmFragment.java │ │ │ │ └── OrderPayFragment.java │ │ │ ├── adapter/ │ │ │ │ └── OrderAdapter.java │ │ │ └── model/ │ │ │ ├── Order.java │ │ │ └── OrderItem.java │ │ │ │ │ ├── **module_product/** # 商品模块 │ │ │ ├── activity/ │ │ │ │ ├── ProductListActivity.java │ │ │ │ └── ProductDetailActivity.java │ │ │ ├── fragment/ │ │ │ │ └── ProductFilterFragment.java │ │ │ ├── adapter/ │ │ │ │ └── ProductAdapter.java │ │ │ └── model/ │ │ │ ├── Product.java │ │ │ └── Category.java │ │ │ │ │ ├── **module_cart/** # 购物车模块 │ │ │ ├── activity/ │ │ │ │ └── CartActivity.java │ │ │ ├── adapter/ │ │ │ │ └── CartAdapter.java │ │ │ └── model/ │ │ │ └── CartItem.java │ │ │ │ │ └── **module_message/** # 消息模块 │ │ ├── activity/ │ │ │ └── MessageActivity.java │ │ ├── adapter/ │ │ │ └── MessageAdapter.java │ │ └── model/ │ │ └── Message.java │ │ │ └── **res/** # 资源文件 │ ├── **layout/** # 基础布局 │ │ ├── activity_splash.xml │ │ └── fragment_base.xml │ │ │ ├── **layout_auth/** # 认证模块布局 │ │ ├── activity_login.xml │ │ ├── activity_register.xml │ │ └── fragment_forget_pwd.xml │ │ │ ├── **layout_home/** # 首页模块布局 │ │ ├── activity_main.xml │ │ ├── fragment_home.xml │ │ ├── fragment_discover.xml │ │ ├── item_banner.xml │ │ └── item_menu.xml │ │ │ ├── **layout_user/** # 用户模块布局 │ │ ├── activity_profile.xml │ │ ├── activity_settings.xml │ │ ├── fragment_user_center.xml │ │ ├── item_user_info.xml │ │ └── item_address.xml │ │ │ ├── **layout_order/** # 订单模块布局 │ │ ├── activity_order_list.xml │ │ ├── activity_order_detail.xml │ │ ├── fragment_order_confirm.xml │ │ ├── item_order.xml │ │ └── item_order_product.xml │ │ │ ├── **layout_product/** # 商品模块布局 │ │ ├── activity_product_list.xml │ │ ├── activity_product_detail.xml │ │ ├── fragment_product_filter.xml │ │ ├── item_product.xml │ │ └── item_category.xml │ │ │ ├── **layout_cart/** # 购物车模块布局 │ │ ├── activity_cart.xml │ │ └── item_cart.xml │ │ │ ├── **layout_message/** # 消息模块布局 │ │ ├── activity_message.xml │ │ └── item_message.xml │ │ │ ├── **layout_widget/** # 自定义控件布局 │ │ ├── view_title_bar.xml │ │ ├── view_loading.xml │ │ └── view_empty_state.xml │ │ │ ├── **layout_dialog/** # 对话框布局 │ │ ├── dialog_confirm.xml │ │ ├── dialog_loading.xml │ │ └── dialog_share.xml │ │ │ ├── **drawable/** # 通用图片 │ ├── **drawable_auth/** # 认证模块图片 │ ├── **drawable_home/** # 首页模块图片 │ ├── **drawable_user/** # 用户模块图片 │ │ │ ├── **values/** # 通用字符串 │ │ ├── strings.xml │ │ ├── colors.xml │ │ └── styles.xml │ │ │ ├── **values-auth/** # 认证模块字符串 │ │ └── strings_auth.xml │ │ │ ├── **values-user/** # 用户模块字符串 │ │ └── strings_user.xml │ │ │ └── **values-order/** # 订单模块字符串 │ └── strings_order.xml

三、Gradle 配置

android { // ... sourceSets { main { // Java 源码路径(默认会自动识别,可不配置) java.srcDirs = ['src/main/java'] // 资源文件路径配置 res.srcDirs = [ 'src/main/res', 'src/main/res/layout', 'src/main/res/layout_auth', 'src/main/res/layout_home', 'src/main/res/layout_user', 'src/main/res/layout_order', 'src/main/res/layout_product', 'src/main/res/layout_cart', 'src/main/res/layout_message', 'src/main/res/layout_widget', 'src/main/res/layout_dialog', 'src/main/res/drawable', 'src/main/res/drawable_auth', 'src/main/res/drawable_home', 'src/main/res/drawable_user', 'src/main/res/values', 'src/main/res/values-auth', 'src/main/res/values-user', 'src/main/res/values-order' ] } } } // 简化写法(Android Studio 4.0+ 支持自动识别) android { sourceSets { main { res.srcDirs = ['src/main/res'] // 只需指定根目录,子目录自动识别 } } }

四、命名规范

Java 包命名

com.公司名.应用名.模块名.子模块 示例: com.example.app.module.auth.activity com.example.app.module.auth.fragment com.example.app.module.auth.model com.example.app.module.auth.network

类命名(前缀 + 功能)

类型命名规则示例
Activity功能 + ActivityLoginActivity
Fragment功能 + FragmentUserCenterFragment
Adapter功能 + AdapterProductAdapter
Model/Bean功能名User, Order, Product
ViewModel功能 + ViewModelLoginViewModel
Api功能 + ApiAuthApi
Utils功能 + UtilsDateUtils

布局文件命名(模块_类型_功能)

[模块前缀]_[类型]_[功能].xml 示例: auth_activity_login.xml # 认证模块登录页面 home_fragment_main.xml # 首页模块主Fragment user_item_address.xml # 用户模块地址Item order_dialog_confirm.xml # 订单模块确认对话框 common_view_title_bar.xml # 公共标题栏

常用模块前缀

模块前缀示例
认证auth_auth_activity_login.xml
首页home_home_fragment_main.xml
用户user_user_activity_profile.xml
订单order_order_item_list.xml
商品product_product_detail.xml
购物车cart_cart_activity.xml
消息message_message_item.xml
公共common_common_dialog_loading.xml
控件widget_widget_title_bar.xml

五、代码中的引用方式

// Java 中引用布局(用法完全不变)publicclassLoginActivityextendsBaseActivity{@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);// 会自动从 layout_auth 目录找setContentView(R.layout.auth_activity_login);}}// Adapter 中引用 Item 布局publicclassProductAdapterextendsRecyclerView.Adapter{@OverridepublicViewHolderonCreateViewHolder(ViewGroupparent,intviewType){// 会自动从 layout_product 目录找Viewview=LayoutInflater.from(parent.getContext()).inflate(R.layout.product_item,parent,false);returnnewViewHolder(view);}}// Fragment 中引用布局publicclassHomeFragmentextendsFragment{@OverridepublicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){// 会自动从 layout_home 目录找returninflater.inflate(R.layout.home_fragment_main,container,false);}}

六、多模块项目(Module 级别分包)

对于超大型项目,可以拆分为独立 Module:

MyApp/ ├── **app/** # 主Module │ ├── src/main/java/com/example/app/ │ │ └── MainActivity.java │ └── src/main/res/ │ └── layout/ │ └── activity_main.xml │ ├── **module_base/** # 基础Module │ ├── src/main/java/com/example/base/ │ │ ├── BaseActivity.java │ │ ├── BaseFragment.java │ │ └── utils/ │ └── src/main/res/ │ ├── layout/ │ │ └── base_activity.xml │ └── values/ │ └── strings_base.xml │ ├── **module_auth/** # 认证Module │ ├── src/main/java/com/example/auth/ │ │ ├── LoginActivity.java │ │ └── model/ │ └── src/main/res/ │ ├── layout/ │ │ ├── auth_activity_login.xml │ │ └── auth_fragment_register.xml │ └── values/ │ └── strings_auth.xml │ └── **module_order/** # 订单Module ├── src/main/java/com/example/order/ │ ├── OrderListActivity.java │ └── adapter/ └── src/main/res/ ├── layout/ │ ├── order_activity_list.xml │ └── order_item.xml └── values/ └── strings_order.xml

Module 间依赖(build.gradle):

// app/build.gradle dependencies { implementation project(':module_base') implementation project(':module_auth') implementation project(':module_order') }

七、最佳实践总结

✅ 推荐做法

  1. Java按模块分包com.example.app.module_xxx
  2. XML按模块建目录res/layout_xxx/
  3. 命名体现模块模块_类型_功能.xml
  4. 公共代码放base/common
  5. 工具类放utils包

❌ 避免做法

  1. 所有Java类混在同一个包
  2. 所有XML堆在layout目录
  3. 命名无规则(layout1.xmltest.xml
  4. Activity和Adapter放在一起不区分

优点

  • 查找方便:修改某个功能,所有相关文件都在同一模块
  • 团队协作:不同人负责不同模块,互不干扰
  • 代码复用:公共组件放在base模块
  • 易于测试:可以独立测试每个模块
  • 便于重构:模块化程度高,修改影响范围小

缺点

  • ❌ 目录结构较深
  • ❌ 需要额外配置
  • ❌ 初学者可能不适应

八、实用工具

快速创建模块脚本

# create_module.shmkdir-papp/src/main/java/com/example/app/module_$1mkdir-papp/src/main/java/com/example/app/module_$1/activitymkdir-papp/src/main/java/com/example/app/module_$1/fragmentmkdir-papp/src/main/java/com/example/app/module_$1/adaptermkdir-papp/src/main/java/com/example/app/module_$1/modelmkdir-papp/src/main/res/layout_$1mkdir-papp/src/main/res/values-$1touchapp/src/main/res/values-$1/strings_$1.xml

使用:./create_module.sh user创建用户模块


九、总结

按功能/模块分包的核心思想

一个功能的所有相关文件(Java + XML + 资源)都放在一起

就像整理房间:

  • 按类型放:所有衣服放一起、所有书放一起(传统方式)
  • 按功能放:卧室放睡衣、书房放书、厨房放厨具(模块化方式)

模块化方式更符合人的思维习惯:当你要修改登录功能时,只需要关注module_auth包下的所有文件,而不需要在几千个文件中翻找。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/25 1:24:56

小白必看!收藏这5种AI Agent设计模式,轻松入门大模型开发

本文梳理了AI Agent的5种主流设计模式:ReAct、Plan & Execute、ReWOO、LLM Compiler和反思增强类架构。从基础的ReAct循环到高效的并行执行,再到带反思和学习的架构,文章详细阐述了每种模式的核心原理、优缺点及适用场景,帮助…

作者头像 李华
网站建设 2026/8/22 18:53:11

Byte Buddy 核心实战:深入理解 MethodDelegation 方法委托

摘要:在 Java 字节码增强领域,Byte Buddy 以其简洁的 API 和强大的功能脱颖而出。本文将深入解析 Byte Buddy 的核心机制——MethodDelegation(方法委托)。不同于硬编码返回固定值,MethodDelegation 允许你将动态类的方…

作者头像 李华
网站建设 2026/8/16 22:46:30

一人公司最根本的问题,从来不是“怎么做”,而是“做什么”和“为什么做”专知智库OPC研究院:在工具泛滥的时代,重新追问根本

一人公司最根本的问题,从来不是“怎么做”,而是“做什么”和“为什么做”专知智库OPC研究院:在工具泛滥的时代,重新追问根本这是一个工具泛滥的时代。注册公司,有中介代办,几千块搞定。写文案,有…

作者头像 李华
网站建设 2026/8/20 11:02:21

看不见的敌人:如何筑起企业内部数据安全的铜墙铁壁

在网络安全的世界里,我们往往将目光聚焦于外部的黑客攻击、勒索软件和钓鱼邮件,在防火墙上投入巨资,在入侵检测系统上煞费苦心。然而,一个更为隐蔽、却也更为致命的威胁往往被忽视——它不在网络边界之外,而就在我们内…

作者头像 李华
网站建设 2026/8/19 12:43:11

从冯·诺依曼到OpenClaw:星链4SAPI如何成为AI时代的“文件系统”

前言:AI计算范式的架构回归 2026年,技术圈被一个词“Open Claw”持续刷屏。表面上看,这是指Claude Opus 4.6、Kimi k2.5、GPT-5.3 Codex等模型对数据的抓取能力达到了前所未有的高度。但在底层架构视角下,Open Claw揭示了AI计算范…

作者头像 李华