Android 용 Eclipse에서 ProGuard 활성화


112

Android 용 ProGuard에 대한 새 문서 에는 프로젝트 홈 디렉터리의 default.properties 파일에 줄을 추가하라는 내용이 있습니다. 그러나이 파일을 열 때 맨 위에 읽었습니다.

# This file is automatically generated by Android Tools. 
# Do not modify this file -- YOUR CHANGES WILL BE ERASED! 

내가 뭔가를 놓치고 있습니까?

또한 Eclipse에서 프로덕션 빌드에 대해서만 ProGuard를 활성화하는 방법이 있습니까 (즉, 완제품을 내보낼 때)?


나는 default.properties가 매번 다시 생성된다는 점에 동의합니다. 따라서, 그 흥미로운 질문
아만 알람

ligi의 대답을 받아 들여야합니다. NeTeInStEiN은 더 이상 보유하지 않고 새로운 사용자를 혼란스럽게합니다.
Gaurav Agarwal 2012 년

2
답변을 최신 상태로 변경했습니다.
neteinstein 2014

ligi의 대답은 새로운 설치에 대한 neteinstein의 대답보다 여전히 명확합니다. 가장 중요한 것은 proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 특정 프로젝트에 대한 사용자 지정 설정이 필요한 경우 표시 됩니다.
ToolmakerSteve

답변:


76

내가 똑같은 것을 찾고 있었기 때문에 후속 조치-여기에 대한 답변은 구식입니다-최근에는 기본 proguard 구성이 sdk 디렉토리에 있으므로 project.properties에 넣으면됩니다.

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt

프로젝트별로 수정하려면 proguard-project.txt를 만들고 줄을 다음과 같이 변경합니다.

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt 

내 프로젝트 (r20에서 생성되었지만 이전 릴리스에서 생성됨)를 보면 위의 방법을 혼합하여 사용하는 것 같습니다.
Tom

26
project.properties에도 #이 파일은 Android 도구에 의해 자동으로 생성되기 때문에 혼란 스럽습니다. #이 파일을 수정하지 마십시오-변경 사항이 지워집니다!
Todd Painton

12
"당신은 이것을 당신의 project.properties에 넣어야합니다". 이 줄은 project.properties에 있지만 기본적으로 주석 처리됩니다. 주석을 제거하십시오.
Braj 2013

113

Android SDK (r20 이상)

project.properties에 참조 된 사전 정의 된 proguard.config를 확인하십시오.

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt

추가 정보 : http://proguard.sourceforge.net/manual/examples.html#androidapplication

Gradle에서 :

buildTypes {
 release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

            ...
  }
 }

여기에서 내가 계속 업데이트하는 proguard "기본"파일을 확인할 수 있습니다. https://medium.com/code-procedure-and-rants/android-my-standard-proguard-ffeceaf65521


Android SDK (r19 이하)

default.properties에 추가 할 수 있습니다. 지금까지 문제없이 수동으로 추가했습니다.

라인을 추가하는 경우 :

proguard.config=proguard.cfg

말했듯이 서명 된 애플리케이션을 내보낼 때만 ProGuard를 사용합니다 (Android 도구 => 서명 된 애플리케이션 내보내기).

Android 2.3 이전에 SDK로 프로젝트를 시작하면 proguard.cfg파일이 생성되지 않습니다 ( default.properties2.3>과 같이 옆에 있음).

자동 생성을 사용하려면 Android 2.3의 SDK로 업데이트하고 기존 소스 (현재 보유한 프로젝트의 소스)로 새 프로젝트를 생성하면됩니다.

자동으로 proguard.cfg채우기가 생성됩니다.

그래도 수동으로 만들려면 다음을 포함해야합니다.

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontwarn android.support.**
-verbose

-dontoptimize
-dontpreverify


-keepattributes *Annotation* 
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment

-keepclasseswithmembernames class * {
    native <methods>;
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembernames class * {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

 -keepclassmembers public class * extends android.view.View {
  void set*(***);
  *** get*();
 }

-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

-keepclassmembers class **.R$* {
  public static <fields>;
}

위의 모든 질문에 답한 것 같습니다.

업데이트 :

라인 별 설명 :

#Use 5 step of optimization 
#-optimizationpasses 5

#When not preverifing in a case-insensitive filing system, such as Windows. This tool will unpack your processed jars,(if using windows you should then use):
-dontusemixedcaseclassnames

#Specifies not to ignore non-public library classes. As of version 4.5, this is the default setting
-dontskipnonpubliclibraryclasses

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).    
-dontoptimize
-dontpreverify

-dontwarn android.support.**

#Specifies to write out some more information during processing. If the program terminates with an exception, this option will print out the entire stack trace, instead of just the exception message.
-verbose

#The -optimizations option disables some arithmetic simplifications that Dalvik 1.0 and 1.5 can't handle. Note that the Dalvik VM also can't handle aggressive overloading (of static fields).
#To understand or change this check http://proguard.sourceforge.net/index.html#/manual/optimizations.html
#-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.

#To repackage classes on a single package
#-repackageclasses ''

#Uncomment if using annotations to keep them.
#-keepattributes *Annotation*

#Keep classes that are referenced on the AndroidManifest
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService
#Compatibility library 
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment

#To maintain custom components names that are used on layouts XML.
#Uncomment if having any problem with the approach below
#-keep public class custom.components.package.and.name.**

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
 -keepclassmembers public class * extends android.view.View {
  void set*(***);
  *** get*();
}

#To remove debug logs:
-assumenosideeffects class android.util.Log {
    public static *** d(...);
    public static *** v(...);
    public static *** w(...);
}

#To avoid changing names of methods invoked on layout's onClick.
# Uncomment and add specific method names if using onClick on layouts
#-keepclassmembers class * {
# public void onClickButton(android.view.View);
#}

#Maintain java native methods 
-keepclasseswithmembernames class * {
    native <methods>;
}


#To maintain custom components names that are used on layouts XML:
-keep public class * extends android.view.View {
    public <init>(android.content.Context);
}
-keep public class * extends android.view.View {
    public <init>(android.content.Context, android.util.AttributeSet);
}
-keep public class * extends android.view.View {
    public <init>(android.content.Context, android.util.AttributeSet, int);
}

#Maintain enums
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

#To keep parcelable classes (to serialize - deserialize objects to sent through Intents)
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}

#Keep the R
-keepclassmembers class **.R$* {
    public static <fields>;
}

###### ADDITIONAL OPTIONS NOT USED NORMALLY

#To keep callback calls. Uncomment if using any
#http://proguard.sourceforge.net/index.html#/manual/examples.html#callback
#-keep class mypackage.MyCallbackClass {
#   void myCallbackMethod(java.lang.String);
#}

#Uncomment if using Serializable 
#-keepclassmembers class * implements java.io.Serializable {
#    private static final java.io.ObjectStreamField[] serialPersistentFields;
#    private void writeObject(java.io.ObjectOutputStream);
#    private void readObject(java.io.ObjectInputStream);
#    java.lang.Object writeReplace();
#    java.lang.Object readResolve();
#}

업데이트 2 :

가장 최근의 ADT / Proguard -keepclasseswithmembers에서-keepclasseswithmembernames


1
@NeTeInStEiN SDK 16 (Android 4.x)으로 업데이트하고 줄을 추가 proguard.config=proguard.cfg했지만 proguard.cfg 파일이 표시되지 않습니다 ... 내보내기를 여러 번 수행 했음에도 불구하고 Eclipse를 다시 시작하는 등의 이유가 무엇인지 아십니까? 그리고 이것을 고치는 방법? 감사.
Bill The Ape 2012 년

1
@NeTeInStEiN 신경 쓰지 마. 내가 직접 만들었어야했다.
Bill The Ape 2012 년

@NeTeInStEiN 프로젝트를 만들 때 빌드 대상이 Android1.1이지만 자동으로 생성 되는 proguard.cfg 파일을 찾았 습니다.
hasanghaforian jul.

1
@NeTeInStEiN 놀라운 남자 ... 정말 시간과 노력에 감사드립니다, 건배 !!
swiftBoy

1
@ user31231234124 요청한 정보를 추가했습니다.
neteinstein

10

ADT 16 project.properties부터는 실제로에서 줄을 추가 할 수 있으며 그대로 유지됩니다. 대상 SDK 버전을 변경해 볼 수 있으며 project.properties그에 따라 업데이트되지만 추가 된 줄은 여전히 ​​존재합니다. 그래서 저는 경고가 잘못된 표현이라고 생각합니다. 이는 파일의 target설정이 프로젝트 설정으로 덮어 쓰여지는 것이 아니라 그 반대가 아니라는 것을 의미합니다 .


4

ProGuard 구성에 대한 변경 사항은 ADT 버전 17에서 이루어졌습니다. ProGuard는 4.4에서 4.7로 업데이트되었으며 구성 파일 참조의 차이점이 이미 언급되었습니다. 기존 프로젝트는 변경되지 않고 그대로 유지되며이 버전과 최신 ADT 버전에 포함 된 새로운 규칙 세트가 없습니다. 위의 ligi 에서 이미 언급 한 새로운 구성 배열에 대한 관련 문서 는 다음에서 사용할 수 있습니다.

http://tools.android.com/recent/proguardimprovements "둘째, 구성 파일이 처리되는 방식이 변경되었습니다."


3

build.properties언급 된대로에 행을 추가 할 수 있습니다 default.properties.


build.properties는 어디에 있습니까? 아니면 만들어야합니까?
Ted Hopp 2011 년

프로젝트 디렉토리, default.properties 옆에 있습니다 (적어도 Android SDK r8 포함).
Eric Lafortune

그것이 그것을 찾고 있던 곳이지만 내 프로젝트에는 그러한 파일이 없습니다. 나는 최신 플러그인을 사용하고 있으며 이것을 확인하기 위해 레벨 8 프로젝트를 만들었습니다.
Ted Hopp

4
build.properties 사용은 Eclipse 빌드가 아닌 Ant 빌드에서만 작동합니다.
Ted Hopp

2016 android studio buld의 build.properties는 어디에 있습니까?
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.