react native와 android sdk 사이의 중복된 클래스 에러를 해결하려면 어떻게 해야 하나요?

1개월 전 질문 1개월 전 토론 11 views

안드로이드 앱을 위한 서드파티 이미지 인식 SDK 라이브러리를 가지고 있는데요.

react-native은 0.67.1을 쓰고 있습니다.

네이티브 모듈을 사용하여 리액트 네이티브 프로젝트에 통합하고 싶은데요.

그치만 sdk의 코드와 react native 코드 사이에 약간의 충돌이 있는데요.

아래 코드처럼 react native에서 충돌을 제거하려고 했습니다.

implementation ("com.facebook.react:react-native:+") {
        exclude group: "com.facebook.yoga", module: "proguard-annotations"
    }

에러는 아래와 같습니다.

Duplicate class com.facebook.proguard.annotations.DoNotStrip found in modules 3rd party sdk (3rdpartysdk.aar) and jetified-proguard-annotations-1.19.0 (com.facebook.yoga:proguard-annotations:1.19.0)

Duplicate class com.facebook.proguard.annotations.KeepGettersAndSetters found in modules 3rd party sdk (3rdpartysdk.aar) and jetified-react-native-0.67.1-runtime (com.facebook.react:react-native:0.67.1)

 구글링해서 여러가지를 시도해봤지만 해결이 안되는데요.

좋은 방법 있을까요?

reactnative android sdk

2022-05-21 11:53

1개의 해답

꽤 까다로운 문제인데요.

서드파티 라이브러리를 모를 경우 대안은 다음과 같습니다.

 

1. 루트의 gradle 파일에서 충돌하는 종속성(transitive dependency)을 제거합니다.

현재 수행 중인 작업과 비슷하지만 전체 경로를 대상으로 하며 원하는 만큼 경로를 사용자 정의할 수 있습니다.

subprojects {
    afterEvaluate {project ->

        project.configurations.all {
            resolutionStrategy.eachDependency { DependencyResolveDetails details ->
                if (details.requested.group == 'com.facebook.react' && details.requested.name.equals('react-native')){
                    //add exclusion rules here
                }
            }
        }
    }
}

 

2. 충돌하는 라이브러리 중 하나에서 충돌하는 클래스를 제거합니다.

클래스가 경로에 있을 경우 동작할 수 있지만 클래스가 어떻게 사용되는지에 따라 달라집니다.

다른 대안은 클래스를 모든 라이브러리에서 제거한 다음 영향을 받는 모든 라이브러리에 동적 종속성을 삽입하는 건데요.

따라서 복사 작업을 이론적인 예를 들면 다음과 같이 사용해야 합니다.

task unzipJar(type: Copy) {
   from zipTree('$yourLibrary.aar')
   into ("$buildDir/libs/$yourLibrary")
   include "**/*.class"
   exclude "**/Unmodifiable.class"
}

subprojects {
    afterEvaluate {project ->

        project.configurations.all {
            resolutionStrategy.eachDependency { DependencyResolveDetails details ->
                if (details.requested.group == 'com.facebook.react' && details.requested.name.equals('react-native')){
                    files("$buildDir/libs/$yourLibrary") {
                       builtBy "unzipJar"
                    }
                }
            }
        }
    }
}

 이를 대체할 수 있는 방법은 unzipJar 작업을 실행한 다음 결과 aar를 로컬 maven repo에 넣는 것입니다.

이렇게 하면 종속성을 정상적으로 바꿀 수 있습니다.


2022-05-21 11:58

해결방법이나 팁을 알고 계신다면


© 2022 pinfo. All rights reserved.