본문 바로가기

개발자노트/혼자 끄적끄적

안드로이드 스튜디오 배포 중 오류

정말 오랜만의 포스팅..

이직 한 회사에 적응을 해갈 즈음 갑자기 파견근무를 나오게 되었다.

이곳에서 하게 된건 뜬금 없는 안드로이드 프로젝트

지금까지 했던건 웹인데, 자바기반으로 된 안드로이드 어플리케이션을 만드는 업무를 담당하게 되었다.

나중에 다시 정리하겠지만, 파견을 나와서 4개의 안드로이드 어플리케이션을 만들기 위해 맞는지 틀린지 모르겠지만

프레임워크를 대충 만들어 놓고 그걸 기반으로 어플리케이션들을 찍어냈는데 배포를 하려고 APK를 생성하면서 만난 오류들이 있어서 추후에 다시 확인하기 위해 포스팅을 작성해둔다.

 

 

1.  안드로이드를 배포하기 위해선 Key Store 라는 것이 필요해서 Key Store를 생성한다.

상단에 Build > Generate Signed Bundle / APK ...

APK 파일로 추출을 하기 위해서 APK를 선택한 후 Next

 

키가 이미 있으면 Choose existing.. 으로 key를 선택해주면 되고, 없으면 Create New...로 키를 새로 생성해주면 된다.

이 때, 키는 추후 어플리케이션 버전 관리에 필요하다고 하니 백업이나 비밀번호 등을 잘 기억하자

 

나는 릴리즈를 할 것이니 release로 배포하지만 , 디버그 레벨로 배포 할 것이면 디버그 선택 후

Create 하면 APK 파일이 소스폴더\app\release 경로에 생성된다.

여기까지만 하면 엄청 간단한데, 빌드 되는 과정에서 두가지 오류를 만나게 되었다.

 

 

 

만난 오류들

1. Error : Library class android.content.res.XmlResourceParser implements program class org.xmlpull.v1.XmlPullParser

 

해당 오류에 대해 검색을 해봤는데, gradle.properties와 proguard-rules.pro에 몇가지를 추가해야 한다는 글을 발견하였다.

발생하는 이유로는 

에러 메시지에서 언급된 android.content.res.XmlResourceParser와 org.xmlpull.v1.XmlPullParser는 모두 XML 파싱을 위해 사용되는 클래스들이지만, 서로 다른 환경과 목적으로 만들어졌기 때문이라고 한다.

즉 , Android SDK에 이미 포함된 XML 관련 클래스와, 외부 Java 라이브러리(xmlpull 등)에서 제공하는 동일한 클래스가 충돌하면서 발생한다고 한다. 이는 Android의 XML 처리 방식이 일반 Java와 다르기 때문에 발생하며, Android 환경에서는 Java 라이브러리를 불필요하게 추가하지 않아야 한다고 한다.

 

그래서 그런지 properties와 rules에 추가해야하는게 생기는 것 같다. 무시를 하던지, 아니면 안드로이드 클래스를 바라보라고 하던지.. 자세히는 알아 볼 시간이 없어서..

 

 

gradle.properties에 추가 할 내용

android.enableR8.fullMode=false

 

proguard-rules.pro에 추가 할 내용

-dontwarn org.xmlpull.v1.**
-dontnote org.xmlpull.v1.**
-keep class org.xmlpull.** { *; }
-keepclassmembers class org.xmlpull.** { *; }

 

이렇게 추가를 하라고 해서 추가를 했더니.. xml parser에 대한 오류는 발생하지 않았지만 새로운 오류를 만나게 되는데..

 

 

 

 

2. Missing classes detected while running R8. Please add the missing classes or apply additional keep rules that are generated in

 

 

역시 한번에 해결이 되면 이상하지.. 이는 코드 난독화를 하는 과정에서 오류가 나는 것이라고 하는데

proguard 파일에서 keep class 를 통해서 클래스에 대한 유지 규칙을 추가하라고 한다. 위랑 비슷한 이유에서 발생하는 듯

 

방법1. 

-keep class org.bouncycastle.jsse.** { *; }
-keep class org.bouncycastle.jsse.provider.** { *; }
-keep class org.conscrypt.** { *; }
-keep class org.openjsse.javax.net.ssl.** { *; }
-keep class org.openjsse.net.ssl.** { *; }

proguard-rules.pro 에 다음과 같은 내용도 추가한다.

 

 

위 방법으로도 해결이 안되면, 오류 내용을 보면 app\build\outputs\mapping\release\missing_rules.txt 경로에있는 파일을 확인하라고 하는데, 그 txt 파일을 열어보면 추가적으로 등록 되어야 할 룰들을 안내해준다.

 

예시용 사진으로 내용이 다릅니다.

 

그래서 나는 아래와 같이 추가적으로 등록 해 주었는데,

-dontwarn org.xmlpull.v1.**
-keep class org.bouncycastle.jsse.** { *; }
-keep class org.bouncycastle.jsse.provider.** { *; }
-keep class org.conscrypt.** { *; }
-keep class org.openjsse.javax.net.ssl.** { *; }
-keep class org.openjsse.net.ssl.** { *; }
-keepclassmembers class org.xmlpull.** { *; }

# Suppress warnings related to javax.annotation
-dontwarn javax.annotation.Nullable
-dontwarn javax.annotation.concurrent.GuardedBy

# Suppress warnings related to XMLPullParser
-dontwarn org.xmlpull.mxp1.MXParser
-dontwarn org.xmlpull.mxp1_serializer.MXSerializer

 

이렇게까지 추가를 해주었는데도 오류가 발생.. 

구문을 수정해봐도 오류가 발생하길래 근본적으로 R8 코드 난독화를 꺼버리는 방법을 사용하였다.

 

build.gradle.kts (:app) 파일에 있는  

 

 buildTypes {
        release {
            isMinifyEnabled = false // 해당 부분이 true로 되어있을 건데, false로 수정
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }

 

수정하게 되면 다음과 같이 Sync Now가 생기는데, 눌러주면 싱크가 맞춰지면서 컴파일이 다시 된다.

 

이렇게 까지 진행하니 APK 파일 만들어서 배포하는 것 까지 끝내게 되었다.