iSIGN+ Pass v2 마이그레이션 스토리 (3편) : 프로가드 적용 및 리소스 정리를 통한 앱 크기 140MB -> 34.1MB로 줄이기까지

SSY·5일 전
0

Architecture

목록 보기
11/11
post-thumbnail

1차. 벡터 이미지 전환을 통한 앱 크기 140MB -> 68MB감소

안드로이드 앱 내, 이미지 리소스는 크게 2가지 형태로, 비트맵과 벡터로 존재합니다. 비트맵 이미지의 경우 5가지 해상도(mdpi, hdpi, xhdpi, xxhdpi, xxxhdpi)로 존재하여 각 디바이스의 해상도에 알맞게 이미지가 지원됩니다. 반면, 벡터 이미지의 경우, 1개의 xml파일만으로 5개의 해상도 대응이 모두 가능합니다.

따라서 앱의 용량을 줄이는데 있어, 비트맵 이미지를 사용하는 건 불필요하게 앱 용량을 증가시킬 수 있기에 지양돼야 합니다. 현재 iSIGN+ Pass v2에는 여러가지 비트맵 이미지를 사용중이었죠. 그리고 해당 이미지들은 순수 앱 용량만으로 봤을 때, 95MB를 차지할 만큼 비중이 컸습니다.

따라서 이 부분을 먼저 줄여야겠단 생각이 들었고 바로 진행했죠. 이미지 줄이기 작업을 위해 기획팀에 아래와 같이 비트맵 이미지의 벡터화를 요청합니다.

하지만 모든 이미지를 벡터화 하기에는 디자이너분의 맨먼스 리소스가 부족했기에, 가장 큰 리소스인 튜토리얼 화면만 정리하기로 협의를 진행합니다. 현, iSIGN+ Pass v2의 튜토리얼 화면은 앱 내에서 사용되는 이미지 중, 상대적으로 해상도가 높은 이미지였으며, 국/중/영문으로 각각 5개씩 존재해 총 9개의 이미지가 존재했습니다.

그 결과, 1차적으로 앱의 용량이 앱 내, 리소스 용량이 97MB에서 16.4MB까지 대폭 감소했으며, 최종적으로 앱 용량이 140MB에서 68MB로 기하급수적으로 감소하는 성과를 맞이하게 됩니다.

2차. 프로가드R8 코드 축소 도입을 통한 앱 크기 68MB -> 60MB 감소

프로가드 R8이란 안드로이드 프레임워크에서 제공하는 보안성 향상을 위한 코드 난독화 솔루션입니다. 이 솔루션은 크게 3가지가 있으며,

  • 코드 축소
  • 코드 최적화
  • 리소스 축소

가 존재합니다. 1차적으로는 프로가드 중 코드축소를 통해 앱 크기가 60MB까지 감소하게 됩니다. 여기서 코드 축소란 앱 내에서 사용되는 각종 클래스를 포함한 멤버들의 네이밍을 알 수 없는 String으로 줄이는 작업입니다.

현재, iSIGN+ Pass v2내엔 여러가지 펜타 시큐리티의 자체 보안 라이브러리를 사용하고 있습니다. 따라서 해당 라이브러리들에게 적절한 프로가드 스크립트 적용이 필요했습니다. 하지만 스크립트 적용은 저울재기와 같다고 말할 수 있는데요. 프로가드 난독화를 너무 패키지 단위로 크게 잡아버리면 프로가드 적용이 되지 않는 상황이 벌어질 수 있다는 것이고, 너무 잘게 쪼갤 경우, 런타임 파싱이 필요한 프로퍼티의 경우, 코드 축소가 적용되어 제기능 동작이 안될 수 있다는 것입니다.

예를 들어, 아래와 같이 설정할 경우, 코드 축소 제외 범위가 앱 전체에 적용되므로 프로가드를 적용하는 의미가 없습니다. 하지만,

-keep com.pentasecurity... { * }

아래와 같이 적용할 경우, 코드 축소 제외 범위가 미시적으로 적용되어, 특정 클래스 또는 멤버의 코드가 축소되어 제기능이 동작하지 못할 우려가 있습니다.

-keep com.pentasecurity.a { <fields>; }
-keep com.pentasecurity.b { <fields>; }
-keep com.pentasecurity.c { <fields>; }
-keep com.pentasecurity.d { <fields>; }
-keep com.pentasecurity.e { <fields>; }

그렇다면 어떻게 효율적으로 할 수 있을까요?

정답은 전체 테스트를 통한 노가다입니다..ㅋㅋㅋ

앱의 제 기능을 보존하되, 앱의 크기를 최소한으로 축소하며 성능을 끌어올리기 위해 제품에 들어가는 장인 정신이라 생각합니다. (만약 좋은 방법이 있다하면 댓글로 알려주시면 감사하겠습니다!!) 하지만 이런 노가다를 통해 느끼는 점은, 앱의 테스트가 자동화 되어 있다면 좋았을것이라고 다시 한 번 느끼게 되었습니다. 따라서 저희 모바일 팀의 경우의 추후 목표는 iSIGN+ Pass v2의 테스트 자동화를 진행시키는 것입니다.

3차. 프로가드R8 코드 최적화를 통한 앱 크기 60MB -> 41.7MB감소

코드 최적화란 앱을 빌드하며 패키징할 때, 불필요한 로직을 제거하거나 정리하는 작업을 의미합니다. 예를 들어,

  • 사용하지 않는 반복문을 프로가드 R8이 제거해줌
  • 한 곳에서만 사용되는 클래스의 메서드 호출을 프로가드 R8이 호출부로 인라인 시켜줌
  • 그 외, 인스턴스화되지 않는 클래스의 경우 프로가드 R8이 제거해줌

와 같은 진행이 이뤄집니다. 이를 통해 앱을 디컴파일 진행 시, 앱의 패키지명/클래스명/멤버명 등이 축소됨은 물론이고 재작성됨을 확인할 수 있습니다.

4차. 프로가드R8 리소스 축소를 통한 앱 크기 41.7MB -> 34.1감소

코드 축소와 비슷하며 아래 기능을 수행합니다.

  • 사용하지 않는 리소스 삭제
  • 중복되는 리소스 통합

현, iSIGN+ Pass v2내, 오래된 라이브러리 내부에는 사용하지 않는 리소스들 또한 존재합니다. 따라서 해당 기능을 활성화 시켜줌으로써 최종적으로 앱 크기가 34.1MB까지 감소하는 성과를 얻었습니다.

최종적으로 프로가드 R8을 사용하며 적용한 build.gradle.kts의 소스코드는 어떨까요? 별 다를 바 없이 안드로이드 공식 홈페이지를 참고 아래와 같은 방식으로 작성하였습니다.

    buildTypes {
        getByName("release") {
            isMinifyEnabled = true
            isShrinkResources = true
            proguardFiles(
                "./proguards/a.pro",
                "./proguards/b.pro",
                "./proguards/c.pro",
                "./proguards/d.pro",
            )
            signingConfig = signingConfigs.getByName("release")
        }
    }

또한 gradle.property내 아래 라인 추가를 통해 코드 최적화를 동작하게 합니다.

android.enable.fullMode=true

마치며.

iSIGN+ Pass v2를 마이그레이션하기까지 오랜 시간이 걸렸습니다. 하지만 그만큼 값지도 뜻깊은 시간이기도 했습니다. 하나의 제품을 고도화하며 장인정신으로 갈고닦는게 개발자로써 살아있다는 느낌을 받게한 제품이기도 합니다.

하지만 iSIGN+ Pass v2는 이로써 끝나는 것이 아닌, 시작이라 생각합니다. 추후, 빠르게 닥칠 요구사항에 대응하며, 사이드 이펙트를 없애며, 그와 동시에 테스트 자동화 및 CI/CD를 구축하여 앱 성장을 부스팅할일 또한 남았습니다.

긴 글 읽어주셔서 감사합니다. :)

profile
불가능보다 가능함에 몰입할 수 있는 개발자가 되기 위해 노력합니다.

0개의 댓글