안드로이드 앱이 여러 모듈로 나누어져 있을때, 각 모듈은 독립적으로 빌드될 수 있다
그래서 모듈 간에는 종속성이 있을 수도 있고 해당 종속성은 다른 모듈의 코드에서 클래스, 메서드, 상수 등을 사용할 때 발생한다
특정 모듈이 다른 모듈의 코드나 리소스를 사용하려고 할때, 해당 모듈에서 사용하려는 것이 API로 노출되어야 한다
이를 통해 다른 모듈에서 해당 모듈의 기능이나 클래스 등을 활용할 수 있게 된다
라이브러리를 api 키워드로 추가하면, 해당 라이브러리가 포함된 모듈이 다른 모듈에서 의존성으로 사용될 수 있다
즉, 다른 모듈에서 해당 라이브러리의 클래스나 기능을 직접 사용할 수 있고,
반면에 implementaion 키워드로 추가하게 되면 해당 라이브러리는 내부 구현에만 사용되어 외부 모듈에서 직접 접근할 수 없다
예를 들자면,
모듈 A에서 어떤 라이브러리르 api 키워드로 추가하면, 모듈 B에서 모듈 A의 코드나 기능을 사용할 수 있다
모듈 A를 만들 때 implementaion 키워드로 추가하면, 모듈 B에서는 해당 라이브러리를 직접 사용할 수 없고 모듈 A를 통해서만 해당 라이브러리의 기능을 이용할 수 있다
tapjoy SDK의 경우, tapjoy의 클래스, 메서드, 상수 등을 직접적으로 사용해야 하기 때문에 implementaion 키워드로 가져오면 찾을 수 없다는 에러가 발생했다
Execution failed for task ':app:checkDebugDuplicateClasses'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
> Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.internal.jdk7.JDK7PlatformImplementations found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.internal.jdk7.JDK7PlatformImplementations$ReflectSdkVersion found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.internal.jdk8.JDK8PlatformImplementations found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.internal.jdk8.JDK8PlatformImplementations$ReflectSdkVersion found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.io.path.ExperimentalPathApi found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.io.path.PathRelativizer found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.io.path.PathsKt found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.io.path.PathsKt__PathReadWriteKt found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.io.path.PathsKt__PathUtilsKt found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.jdk7.AutoCloseableKt found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk7-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.6.21)
Duplicate class kotlin.jvm.jdk8.JvmRepeatableKt found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.random.jdk8.PlatformThreadLocalRandom found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.streams.jdk8.StreamsKt found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$1 found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$2 found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$3 found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.streams.jdk8.StreamsKt$asSequence$$inlined$Sequence$4 found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.text.jdk8.RegexExtensionsJDK8Kt found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
Duplicate class kotlin.time.jdk8.DurationConversionsJDK8Kt found in modules jetified-kotlin-stdlib-1.8.0 (org.jetbrains.kotlin:kotlin-stdlib:1.8.0) and jetified-kotlin-stdlib-jdk8-1.6.21 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.6.21)
두가지 다른버전의 코틀린 라이브러리 kotlin-stdlib 가 동일한 클래스를 포함하고 있어서 발생한 오류이다
이러한 충돌은 일반적으로 다양한 종속성에서 동일한 라이브러리의 서로 다른 버전을 사용할 때 발생한다
jetified-kotlin-stdlib-1.8.0
jetified-kotlin-stdlib-jdk7-1.6.21
jetified-kotlin-stdlib-jdk8-1.6.21
등 서로 다른 버전의 코틀린 라이브러리를 나타낸다
방법 1. 라이브러리 버전 일치시키기
방법 2. 의존성 그래픽 분석 도구 사용
방법 3. 의존성 제외
configurations {
all*.exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib'
}
여기서 나의 경우, 기존의 코틀린버전은 1.6.21버전이고 탭조이에서 사용하는 코틀린버전은 1.8.0버전이기 때문에 1.8.0버전으로 통일시켜줘서 해결했다
안드로이드 모듈에서 액티비티를 실행하려면 Androidmenifest.xml 파일에서 액티비티를 정의해야 한다.
기존 프로젝트에서 액티비티를 정의할 때 아래 속성들을 사용했는데 의미를 찾아봤다.
android:exported="true"
액티비티가 다른 애플리케이션의 구성요소에 의해 시작될 수 있다
android:launchMode="singleTop"
액티비티의 시작모드를 정의하는데, singleTop 은 액티비티의 인스턴스가 이미 작업 스택의 맨 위에 존재하는 경우
해당 인스턴스를 재사용하고 새로운 인스턴스를 생성하지 않도록 한다
android:parentActivityName=".MainActivity"