IT박스

Android ProGuard : 가장 적극적인 최적화

itboxs 2020. 12. 2. 08:16
반응형

Android ProGuard : 가장 적극적인 최적화


Android의 공식 proguard 문서 는 두 가지 기본 최적화를 보여줍니다.

  • 설정 minifyEnabledtrue
  • proguard-android-optimize.txt대신 사용proguard-android.txt

이 두 가지가 가장 공격적인 설정입니까?

나는 안드로이드 라이브러리를 작성 중이며 사람들이 내 라이브러리를 사용할 때 내 코드가 깨지지 않도록해야합니다. (라이브러리를 사용하는 앱에 설정된 proguard 구성에 대응하기 위해 라이브러리에 넣을 수있는 규칙이 있다는 것을 알고 있지만, 필요하지 않으면 그렇게하고 싶지 않습니다.)


최상의 ProGuard 구성은 최소한의 예외가있는 구성입니다. 예외에 따라 본인은 다음을 이해합니다.

 -keepclassmembers class * extends android.content.Context {
    public void *(android.view.View);
    public void *(android.view.MenuItem);
 }

proguard-android-optimize.txt를 살펴보고 최적화 / 난독 화 옵션을 살펴 보겠습니다.

ProGuard 옵션에 대한 자세한 설명은 이것을 사용 합니다.

-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* -가능한 최적화 목록,! 평균 부정이므로이 최적화는 사용되지 않습니다.

-optimizationpasses 5수행 할 최적화 패스 수를 지정합니다. 기본적으로 단일 패스가 수행됩니다. 여러 번 통과하면 더 개선 될 수 있습니다. 최적화 통과 후 개선 사항이 발견되지 않으면 최적화가 종료됩니다. 최적화 할 때만 적용됩니다.
사용법 : OK , 기본 5 회 패스로 충분합니다.

-allowaccessmodification클래스 및 클래스 멤버의 액세스 수정자가 처리 중에 확장 될 수 있음을 지정합니다. 이것은 최적화 단계의 결과를 향상시킬 수 있습니다.
사용법 : OK , 네 외모 최적화를 향상 좋아

-dontpreverifyAndroid를 대상으로 할 때 사전 확인이 필요하지 않으므로 처리 시간을 약간 줄이기 위해 사전 확인을 끄지 마십시오. 그러나이 옵션은 코드의 깨지지 않음에 영향을주지 않습니다.
사용법 : 확인 , 처리 시간을 조금만 다시 사용

-dontusemixedcaseclassnames난독 화하는 동안 대소 문자가 혼합 된 클래스 이름을 생성하지 않도록 지정합니다. 기본적으로 난독 화 된 클래스 이름에는 대문자와 소문자가 혼합되어 포함될 수 있습니다. 이것은 완벽하게 수용 가능하고 사용 가능한 항아리를 만듭니다.
사용법 : QUESTIONABLE ,이 옵션이 추가 된 정확한 이유를 찾을 수 없지만 클래스 이름을에서 abcdefAbSdEf변경해도 코드가 깨지지 않는 것처럼 보입니다.

-dontskipnonpubliclibraryclasses비공개 라이브러리 클래스를 무시하지 않도록 지정합니다. 버전 4.5부터는 이것이 기본 설정입니다.
사용법 : OK , 매우 유용

다음 옵션은 proguard-android-optimize.txt에 포함되지 않습니다.

-mergeinterfacesaggressively구현 클래스가 모든 인터페이스 메소드를 구현하지 않더라도 인터페이스가 병합 될 수 있음을 지정합니다.이 옵션을 설정하면 일부 JVM에서 처리 된 코드의 성능이 저하 될 수 있습니다.
사용법 : BAD , Android에 위험 해 보임 ,에 포함되지 않음 config, 최적화에서 클래스 / 병합 / 금지의 합계

-overloadaggressively난독 화하는 동안 공격적인 오버로딩을 적용하도록 지정합니다. 여러 필드와 메소드는 인수 및 반환 유형이 Java 바이트 코드에서 요구하는대로 (자바 언어에서 요구하는 인수뿐만 아니라) 다른 한 동일한 이름을 얻을 수 있습니다.
사용법 : BAD , Google의 Dalvik VM은 사용할 수 없습니다. 오버로드 된 정적 필드를 처리합니다.

-repackageclasses ''이름이 변경된 모든 클래스 파일을 지정된 단일 패키지로 이동하여 다시 패키지하도록 지정합니다. 인수가 없거나 빈 문자열 ( '')이 있으면 패키지가 완전히 제거됩니다. 이 옵션은 -flattenpackagehierarchy 옵션을 재정의합니다.
사용법 : OK , Used by Google, 적어도 우리가 설정에 추가 할 수있는 옵션을 찾은 것 같습니다.

따라서 난독 화 및 위험하지 않은 옵션에 대해 하나 더 유용한 것을 알고 있습니다.
-repackageclasses ''

또한 스택 추적 디코딩에 대해서도주의하십시오. ProGuard는 또한 스택 트레이스에서 파일 이름과 줄 번호를 제거합니다. 이것은 오류 찾기를 매우 복잡하게 만듭니다. 구성에 다음 코드를 추가하여 줄 번호를 유지할 수 있습니다.

-renamesourcefileattribute SourceFile 
-keepattributes SourceFile,LineNumberTable

줄 번호는 유지되지만 스택 트레이스의 파일 이름은 "SourceFile"로 바뀝니다.

또한 ProGuard가 문자열 리소스를 암호화하지 않기 때문에 취약 해 보이는 것을 잊지 마십시오 . 따라서 DexGuard를 사용하거나 토큰, URL과 같은 중요한 문자열 자체를 암호화하는 것이 좋습니다.


최적화 파일의 주석에 따르면 최적화는 특정 위험을 초래하며 사용하는 경우 앱을 철저히 테스트해야합니다. 내 경험에 따르면 람다 외부에서 초기화 된 최종 지역 변수가 람다 내부에서 NULL이 되었기 때문에 코드 / 단순화 / 고급을 비활성화해야합니다. 디버그하고 찾기가 매우 어려웠습니다. 따라서 내 최적화 설정은 다음과 같습니다.

-optimizations! code / simplification / cast,! code / simplification / advanced,! field / * ,! class / merging / * ,! method / removal / parameter,! method / propagation / parameter

Note that code/simplification/arithmetic must be also disabled if you target Android 2.0 and lower (which is very unlikely). Besides that, I also had to disable method/removal/parameter and method/propagation/parameter, because these implicitly enable code/simplification/advanced (see ProGuard manual for more info).

참고URL : https://stackoverflow.com/questions/35321742/android-proguard-most-aggressive-optimizations

반응형