1. 什么是application和library
com.android.application
表示这个模块会被打包成一个 独立可运行的 APK。
它必须有:applicationId(APK 的唯一包名)AndroidManifest.xml里声明的<application>和至少一个<activity>- 最终能安装到手机上运行
com.android.library
表示这个模块只会编译成一个 AAR(Android Archive)包,相当于一个“依赖库”。
它不能独立运行,没有applicationId,但可以包含:Activity/Service/View等组件- 被其他
application模块引用后,才能运行里面的逻辑
2. 为什么改成library就能运行
报错的核心原因是:
你工程里有多个com.android.application模块(比如hilt-bestpractices、popupwindow-bestpractices),Gradle 无法判定到底哪个是 主应用 (base app),就会把它们误认为是 Dynamic Feature,于是抛出This application is not configured to use dynamic features
换句话说:
- 如果你只有一个
application→ 没问题 - 如果你有多个
application→ 必须显式指定一个 base app,其它必须是 dynamic-feature,否则就冲突
当你把popupwindow-bestpractices改成library后,Gradle 就知道:
- 唯一的
application是hilt-bestpractices popupwindow-bestpractices只是它依赖的 library
因此编译顺利通过。
3. 改成library会不会影响模块启动?
会的。区别在于:
- 如果模块是 application:
它能自己打包一个 APK,单独安装运行。 - 如果模块是 library:
它不能单独运行,必须依赖到某个application模块中,才能随着那个 app 一起运行。
所以你现在改成了library,意味着:
- 不能再单独启动
popupwindow-bestpractices这个模块的 Activity - 必须通过
hilt-bestpractices里的 Application 启动它(依赖 + Manifest merge)
更新: 2025-08-24 23:49:26
原文: https://www.yuque.com/dongpozhouzi-mshe3/zhm85g/qua82ohv98v444fs