[AOS] Proguard

2024. 1. 25. 10:23dev/aos

728x90
반응형

내가 아는 Proguard는 앱 코드를 타인이 확인하는 경우 난독화 하는 용도로 디버깅을 막는 줄만 알았다.

최근 이슈가 생겨서 다시 Proguard를 정리해보니 여러 좋은 기능과 중요함을 알게 된다.

 

  • 코드 축소 : 미사용 클래스, 필드, 메서드, 속성을 감지하여 안전하게 삭제(64k 참조제한)
  • 리소스 축소 : 미사용 리소스를 포함하여 패키징된 앱에서 사용하지 않는 리소스 삭제.
  • 난독화 : 클래스, 멤버 이름을 줄여 dex파일 크기 줄임(내가 알던 Proguard역할)
  • 최적화 : 코드를 검사, if else문을 사용하는데 else쪽에 코드가 없으면 삭제 이 감지하는 주체를 R8에서 함
android {
    buildTypes {
        getByName("release") {
            // Enables code shrinking, obfuscation, and optimization for only
            // your project's release build type.
            isMinifyEnabled = true

            // Enables resource shrinking, which is performed by the
            // Android Gradle plugin.
            isShrinkResources = true

            // Includes the default ProGuard rules files that are packaged with
            // the Android Gradle plugin. To learn more, go to the section about
            // R8 configuration files.
            proguardFiles(
                getDefaultProguardFile("proguard-android-optimize.txt"),
                "proguard-rules.pro"
            )
        }
    }
    ...
}

 

 

 

규칙

minifyEnabled 속성을 true로 설정해야 R8에서 코드 축소가 사용 설정됨.

--keep : 앱을 축소할 때 R8이 삭제하면 안되는 클래스 지정. R8은 이 클래스를 앱의 진입점으로 간주함.

-keep public class MyClass

 

또는 유지하려는 코드위에 @Keep 주석을 추가하여 보호?(유지) 할 수 있다.

 

 

 

shrinkResources 속성을 true로 설정하면 사용되지 않는 리소스 축소됨.

유지할 리소스가 있는 경우,

path : res/raw/keep.xml

<resources> 태그에 프로젝트에서 XML파일을 생성하고 tools:keep속성에서 유지할 각 리소스를 지정,

삭제할 리소스는 tools:discard속성에서 지정, 여러 리소스를 넣을 경우 쉼표로 구분해준다.

<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
    tools:keep="@layout/l_used*_c,@layout/l_used_a,@layout/l_used_b*"
    tools:discard="@layout/unused2" />

 

 

 

Proguard가 라이브러리를 읽는 동안 개인 또는 패키지 라이브러리 클래스를 간과하는 경향이 있다.

다음과 같은 문제가 간헐적으로 발생한다면 -dontskipnonpubliclibraryclasses 옵션 또는 -dontskipnonpubliclibraryclassmembers옵션을 사용하는 것이 좋다.

 

 


error : 

java.lang.NoSuchMethodError: no static or non-static method 에러 발생.

외부 라이브러리에서 호출되는 메서드가 없다는 에러였고, 해당 패키지 에러를 무시하는 내용을 넣어주었다.

-dontwarn kr.co.external.**

> 하지만 해당 문제는 지속되었다.

 

이번에는 난독화를 하지 않아보았다.

-keep class kr.co.external.**{
    public *;
}

> 역시 메서드가 없다는 에러는 shrink해주면서 해당 메서드를 삭제해준 듯 하다.

 

 

사용하지 않는 메서드들을 유지해보았다.

-dontshrink 

 

> 그랬더니 아래의 내용으로 mapping의 generated를 추가해주라고 표출된다.

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

\app\build\outputs\mapping\release\missing_rules.txt.

 

추가해주자.

(왠지 앱이 잘 빌드가 될 것만 같다.)

 

> 잘된다..!!

하지만, 오래된 코드이기 때문에 진행한 작업이지만, 확실히 앱의 크기가 1/3으로 많이 줄었었지만, 사용하지 않는 메서드에 대한 proguard를 재적용하니 아주 미미하게 줄기만 하였다.

 

 

release모드인데도 불구하고 로그가 출력되는 것이다.

다음과 같이 추가해주면 로그가 발생하지 않는다.

# remove log
-assumenosideeffects class android.util.Log {
    public static boolean isLoggable(java.lang.String, int);
    public static int v(...);
    public static int i(...);
    public static int d(...);
    public static int w(...);
    public static int e(...);
}

reference :

https://developer.android.com/studio/build/shrink-code?hl=ko

 

앱 축소, 난독화 및 최적화  |  Android 개발자  |  Android Developers

사용하지 않는 코드와 리소스를 삭제하기 위해 출시 빌드에서 코드를 축소하는 방법을 알아보세요.

developer.android.com

https://www.appsealing.com/kr/android-proguard/

 

Android 애플리케이션에 대한 ProGuard 및 그 영향 -

ProGuard는 무료로 이용할 수 있는 오픈 소스 도구입니다. 이 문서를 읽고 ProGuard에 대해 자세히 알아보세요.

www.appsealing.com

https://leejiheg.tistory.com/entry/Android-Proguard-%EC%84%A4%EC%A0%95%EB%B2%95-libs-%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%ED%8F%AC%ED%95%A8

 

Android Proguard 설정법 libs 라이브러리 포함

프로가드가 많이 바뀌었다..요즘적용을 안하다보니... 최신기준으로 수정 작성함 기본 프로젝트 생성을 하면 proguard-project.txt = 프로가드 세팅 파일project.properties = 프로젝트 세팅파일 project.propert

leejiheg.tistory.com

 

728x90
반응형

'dev > aos' 카테고리의 다른 글

[FingerPush] Android SDK Menual:Cloud Messaging  (0) 2024.01.30
[AOS] KeyStore, SigningKey, jks  (0) 2024.01.29
[AOS] onBackPressed  (0) 2024.01.22
[AOS] Firebase Crashlytics  (0) 2024.01.19
[AOS] WebView  (0) 2024.01.19