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

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

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

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

-keep public class com.myapp.customcomponents.*



답변

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

-keep public class com.myapp.customcomponents.*

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

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

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

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


답변

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

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

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


답변

많은 사람들 -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입니다. 누군가가 (내가 찾지 못한) 특정 경로의 처리를 완전히 건너 뛰는 방법을 제공 할 수 있다면이 연습은 유효하지 않습니다.


답변

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

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

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


답변