Android 按功能/模块分包完整指南一、核心理念按功能模块组织代码和资源而不是按类型Java代码按模块建包packageXML资源按模块建目录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功能 ActivityLoginActivityFragment功能 FragmentUserCenterFragmentAdapter功能 AdapterProductAdapterModel/Bean功能名User, Order, ProductViewModel功能 ViewModelLoginViewModelApi功能 ApiAuthApiUtils功能 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 目录找ViewviewLayoutInflater.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 级别分包对于超大型项目可以拆分为独立 ModuleMyApp/ ├── **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.xmlModule 间依赖build.gradle// app/build.gradle dependencies { implementation project(:module_base) implementation project(:module_auth) implementation project(:module_order) }七、最佳实践总结✅ 推荐做法Java按模块分包com.example.app.module_xxxXML按模块建目录res/layout_xxx/命名体现模块模块_类型_功能.xml公共代码放base/common包工具类放utils包❌ 避免做法所有Java类混在同一个包所有XML堆在layout目录命名无规则layout1.xml、test.xmlActivity和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包下的所有文件而不需要在几千个文件中翻找。