Proguard를 사용할 때 특정 패키지 경로를 유지 / 제외하는 방법은 무엇입니까?


110

ProGuard에서 일부 파일 경로를 제외하고 싶습니다. 예com.myapp.customcomponents

어떻게 할 수 있습니까? 이 디렉토리에있는 모든 사용자 정의 구성 요소 파일에 대해 -keep 플래그를 배치하는 것이 싫습니다.

다음을 시도했지만 작동하지 않습니다.

-keep public class com.myapp.customcomponents.*

답변:


241

작동하지 않는 방식을 지정하지 않습니다. 구성은 지정된 패키지의 모든 공용 클래스 이름을 유지합니다.

-keep public class com.myapp.customcomponents.*

다음 구성은 지정된 패키지 및 하위 패키지에있는 모든 공용 클래스의 이름을 유지합니다.

-keep public class com.myapp.customcomponents.**

다음 구성은 지정된 패키지 및 하위 패키지에있는 모든 공용 / 보호 된 클래스 / 필드 / 메서드의 이름을 유지합니다.

-keep public class com.myapp.customcomponents.** {
  public protected *;
}

6
이중 별표 (**)가 더 이상 컴파일되지 않음 (Android Studio 4.0)
Daniel

1
Android Studio 4.x는 이중 별표 (**)에 대해 "Unresolved class name"등과 같은 오류를 표시하지만 예상대로 작동합니다.
Mahmudul Hasan Shohag

그것의 수정 및 다가오는 릴리스
shadygoneinsane

56

ProGuard 구성 하단에 다음 줄을 추가합니다.

-keep class com.facebook.** { *; }

이에 따라 패키지 이름을 바꾸십시오. 여기서 패키지 com.facebook는 ProGuard에서 제외됩니다.


13
이유를 함께 유지하고 dontwarn 사용
Jongz Puangput

@Jongz Puangput, 내가 맞다면-앱이 com.facebook 패키지를 사용하지 않으면 빌드시 "구성이 알 수없는 클래스를 참조합니다 ..."라는 메모가 표시됩니다. -이 메모를 사용하지 않도록 경고하지 마십시오.
Yura Shinkarev

14
무슨 { *; }뜻이야?
Muhammad Babar

15
@MuhammadBabar i는 모든 범위의 모든 멤버, 메서드, 클래스, 간단히 말해서 모든 것을 의미합니다!
Omar El Don

1

많은 사람들 -keep class com.myapp.customcomponents.** { *; }이 경로를 처리에서 제외하는 방법 으로 권장 하는 것 같습니다 . 여기를 보아라:

  1. proguard에서 패키지 제외
  2. Proguard가 패키지를 완전히 무시하도록합니다.
  3. Proguard 난독 화로부터 디렉토리 방지

이 솔루션의 문제는 여전히 어느 정도 난독 화가 발생하여 코드를 손상시킬 수 있다는 것입니다. 매핑 인쇄에서 매핑을 볼 수 있습니다.

java.lang.String toString() -> toString
int getMemoizedSerializedSize() -> getMemoizedSerializedSize
void setMemoizedSerializedSize(int) -> setMemoizedSerializedSize
int getSerializedSize() -> getSerializedSize
boolean equals(java.lang.Object) -> equals
int hashCode() -> hashCode

내가 선택한 솔루션은 2 단계 프로세스입니다. 먼저 injars필터와 함께 사용 하여 처리 할 패키지 경로를 선택합니다. 다른 패키지 경로를 라이브러리로 추가 할 수 있습니다.

-injars       artifacts/in.jar(org/toprocess/**.class)
-outjars      out/processed.jar
-libraryjars  artifacts/in.jar(org/skipped/**.class)
-libraryjars  artifacts/in.jar(org/moreskipped/**.class)

둘째, 처리 된 병을 원래 병과 병합하지만 건너 뛴 경로 만 병합합니다.

-injars  out/processed.jar
-injars  artifacts/in.jar(org/skipped/**.class)
-injars  artifacts/in.jar(org/moreskipped/**.class)
-outjars out/merged.jar

-dontshrink
-dontoptimize
-dontobfuscate

결과는 처리 된 패키지 경로와 건너 뛴 경로의 조합 인 병합 된 jar입니다. 누군가가 (내가 찾지 못한) 특정 경로의 처리를 완전히 건너 뛰는 방법을 제공 할 수 있다면이 연습은 유효하지 않습니다.


1

Android Studio 4.0을 사용하여 나를 위해 일한 것은 다음과 같습니다.

-keepclassmembers class com.myapp.customcomponents.* {
    <fields>;
    <init>();
    <methods>;
}

다른 답변의 이중 별표 (**)는 저에게 효과적이지 않았습니다. 또한 R8로 위의 구성을 시도했지만 제대로 작동합니다.


이 답변은 내가 생각하는 가장 최신 답변입니다. 감사합니다.
Gogo-the-Cat
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.