我在android studio中有两个模块
域模块已添加到settings.gradle和build.gradle
include ':mobile', ':domain'&
compile project(':domain')分别是这样
在域模块中我有一个这样的类:
public class DomainUtils {
Context mContex;
public DomainUtils(Context context){
this.mContex = context;
}
public void toast(String string){
Toast.makeText(mContex, string,Toast.LENGTH_LONG).show();
}
public String returnHi(){
return "hi";
}
}
Run Code Online (Sandbox Code Playgroud)
但是当我试着打电话的时候 new DomainUtils(context).toast("hi");
从App模块中的一个类:
------------ 但是 ----------
当我运行该方法returnHi()它工作正常.
我有一个 Android 应用程序模块 (A) 和一个 Android 库模块 (B)。(A) 和 (B) 都包含这些相同的依赖项:
dependencies {
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}
Run Code Online (Sandbox Code Playgroud)
但是,在我的项目中,模块 (A) 依赖于模块 (B),因此我确实在堆栈溢出中搜索了有关如何实现Don't Repeat Yourself设计模式的信息,以便我仅将这些依赖项包含在模块 (B) 中,我发现这很有用但我没有找到我怎么能做出这种依赖
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1
Run Code Online (Sandbox Code Playgroud)
在这两个模块之间共享,那么我该怎么做呢?
android android-gradle-plugin annotation-processor android-module
在最后一阵子,我试图更改一个多模块Android应用程序以使用新的com.android.dynamic-feature插件。这项更改的一部分是将我的仪器测试移出了基本模块,并让他们测试了多个功能。该com.android.test 插件似乎使我能够做到这一点。
我必须注意到,虽然从androidTest源集(使用app:assembleDebugAndroidTest)构建时运行正常的同一测试会在从com.android.test插件(使用app-tests:assemble)构建时导致奇怪的错误。特别是,当测试启动Activity时,AndroidX AppCompat存在问题:
Caused by: java.lang.IllegalStateException: This app has been built with an incorrect configuration. Please configure your build for VectorDrawableCompat.
at androidx.appcompat.widget.AppCompatDrawableManager.checkVectorDrawableSetup(AppCompatDrawableManager.java:756)
at androidx.appcompat.widget.AppCompatDrawableManager.getDrawable(AppCompatDrawableManager.java:196)
at androidx.appcompat.widget.TintTypedArray.getDrawableIfKnown(TintTypedArray.java:86)
at androidx.appcompat.app.AppCompatDelegateImpl.<init>(AppCompatDelegateImpl.java:260)
at androidx.appcompat.app.AppCompatDelegate.create(AppCompatDelegate.java:182)
at androidx.appcompat.app.AppCompatActivity.getDelegate(AppCompatActivity.java:520)
at androidx.appcompat.app.AppCompatActivity.onCreate(AppCompatActivity.java:71)
at biz.laenger.android.foo.app.presentation.main.MainActivity.onCreate(MainActivity.kt:28)
at android.app.Activity.performCreate(Activity.java:7009)
at android.app.Activity.performCreate(Activity.java:7000)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1214)
at androidx.test.runner.MonitoringInstrumentation.callActivityOnCreate(MonitoringInstrumentation.java:674)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2731)
... 9 more
Run Code Online (Sandbox Code Playgroud)
我创建了这个最小的示例项目,可以在其中复制问题(自述文件中的步骤)。
从主题出现实际问题时,我发现了上述错误。但是,正确设置了主题,并且在“常规”测试测试和手动启动应用程序时可以很好地进行“活动创建”。该应用程序和测试在API 28设备上运行。
在配置:app-tests模块时,我按照说明进行操作并最终得到以下配置:
Caused by: java.lang.IllegalStateException: This app has been …Run Code Online (Sandbox Code Playgroud) 我的模块化 Android 项目subprojects在根 build.gradle 中使用,以最小化每个子模块的 build.gradle 中所需的配置。例如,我可以使用它来将我们的自定义 buildType 添加到每个模块
subprojects
afterEvaluate { project ->
if (project.plugins.findPlugin('android') ?: project.plugins.findPlugin('android-library')) {
android {
buildTypes {
qa {
initWith debug
matchingFallbacks = ['debug']
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的假设是,如果我还将此构建配置添加到模块级别 build.gradle 中,它将覆盖项目级别定义的配置。然而,情况似乎并非如此。
如果我将以下内容添加到我的app / build.gradle时,我的应用程序将在选择qa buildtype时,请结束后缀'dev'。
buildTypes {
debug {
applicationIdSuffix = ".dev"
signingConfig signingConfigs.debug
}
qa {
initWith debug
applicationIdSuffix = ".qa"
matchingFallbacks = ['debug']
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试在模块中使用特定于 buildType 的 buildConfigFields 时,同样的问题也适用;他们被忽略了。 …
我为我的 android 应用程序创建了三个模块,即应用程序、域和数据。
我错误地将域和数据模块创建为 android 模块而不是 Java 模块。现在我想将它们替换为 Java 模块。
谁能建议我如何实现这一目标?
最近,我试图为我的 Android 应用程序创建一个 Java/Kotlin 模块。当我创建 Retrofit 时Interceptor,出现错误:
无法将使用 JVM 目标 1.8 构建的字节码内联到使用 JVM 目标 1.6 构建的字节码中。请指定正确的“-jvm-target”选项。
这是确切错误的屏幕截图:
我知道如何设置-jvm-target我的 Android 模块。但我无法找到如何在 Java/Kotlin 模块中设置它的答案。
这是我已经尝试过的:
[解决方案1(不起作用)]
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
compileKotlin {
targetCompatibility(JavaVersion.VERSION_1_8)
}
Run Code Online (Sandbox Code Playgroud)
[解决方案2(不起作用)]
kotlinOptions {
jvmTarget = JavaVersion.VERSION_1_8.toString()
}
Run Code Online (Sandbox Code Playgroud)
上面的代码给了我以下错误:
找不到参数的 kotlinOptions() 方法
我有一个多模块应用程序,最近我开始在其中实现 Jetpack Compose。我定义了一些由不同模块共享的可组合项。我将它们放在另一个库模块中并导入到相关位置。可组合示例:
// Nothing special here, any composable function fails the same way
@Composable
fun AppTheme(content: @Composable () -> Unit) {
val appColors = lightColors(
primary = Blue
)
MaterialTheme(colors = appColors, content = content)
}
Run Code Online (Sandbox Code Playgroud)
一切似乎都工作正常,除了所说的可组合项无法构建预览:
@Preview(showSystemUi = true, showBackground = true)
@Composable
fun HistoryScreenPreview() {
AppTheme {
HistoryScreen()
}
}
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,如果我删除“AppTheme”,预览效果会非常好。
堆栈跟踪:
java.lang.NoSuchMethodError: 'void com.somepackage.lib.ui_theme.AppComposablesKt.AppTheme(_layoutlib_._internal_.kotlin.jvm.functions.Function2, androidx.compose.runtime.Composer, int)'
at com.somepackage.feature.home.ui.history.view.HistoryFragment.HistoryScreenPreview(HistoryFragment.kt:238)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at androidx.compose.ui.tooling.CommonPreviewUtils.invokeComposableMethod(CommonPreviewUtils.kt:150)
at androidx.compose.ui.tooling.CommonPreviewUtils.invokeComposableViaReflection$ui_tooling_release(CommonPreviewUtils.kt:194)
at androidx.compose.ui.tooling.ComposeViewAdapter$init$3$1$composable$1.invoke(ComposeViewAdapter.kt:593)
at androidx.compose.ui.tooling.ComposeViewAdapter$init$3$1$composable$1.invoke(ComposeViewAdapter.kt:591)
at …Run Code Online (Sandbox Code Playgroud) android-module android-jetpack-compose android-jetpack-compose-preview
我有一个带有一些自定义组件的模块。其中一个里面有一个 DatePickerDialog。我需要为这些使用自定义强调色。如何从主应用程序样式中检索颜色?有没有办法使用相同的样式避免循环引用?否则,有一种方法可以以编程方式设置 DatePickerDialog 的强调色吗?
我有一个多模块化 android 应用程序设置,它由一个数据、域和演示模块组成。域模块是纯 Java 的。我知道可以通过添加以下内容来支持非 android 模块中的刀柄:
领域 build.gradle
implementation "com.google.dagger:hilt-core:$hilt_version"
kapt "com.google.dagger:hilt-compiler:$hilt_version"
Run Code Online (Sandbox Code Playgroud)
域模块提供了 UseCase 类的实现,这些类应该注入到位于 Presentation (app) 模块中的 ViewModel 中。
域模块:
@Module
@InstallIn(SingletonComponent::class)
// @InstallIn(ViewModelComponent::class)
object UseCaseModule {
@Provides
// @ViewModelScoped
fun provideGetMovieDetailsUseCase(
movieRepository: MovieRepository
): GetMovieDetailsUseCase {
return GetMovieDetailsUseCaseImpl(movieRepository)
}
}
Run Code Online (Sandbox Code Playgroud)
演示模块:
@HiltViewModel
class MovieDetailViewModel @Inject constructor(
private val getMovieDetailsUseCase: GetMovieDetailsUseCase
) : ViewModel() {
...
}
Run Code Online (Sandbox Code Playgroud)
由于 java-only 模块的性质,我不能使用@InstallIn(ViewModelComponent::class)注释。相反,我必须在SingletonComponent::class. 这也是在这里的 awnser 中完成的
我的问题
这种方法是“最佳实践”吗?还是将库设为 Android 库更好,以便我可以将依赖范围限定为 ViewModel?我更愿意将它保留为仅限 Java 的库。
android-module ×10
android ×8
gradle ×2
android-jetpack-compose-preview ×1
androidx ×1
dagger-hilt ×1
java ×1
kotlin ×1