การเปิดใช้งาน ProGuard ใน Eclipse สำหรับ Android


112

เอกสารใหม่เกี่ยวกับProGuard สำหรับ Androidระบุว่าให้เพิ่มบรรทัดลงในไฟล์ default.properties ในโฮมไดเร็กทอรีของโปรเจ็กต์ อย่างไรก็ตามในการเปิดไฟล์นี้ฉันอ่านที่ด้านบน:

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

ฉันพลาดอะไรไปรึเปล่า?

นอกจากนี้ยังมีวิธีเปิดใช้งาน ProGuard สำหรับรุ่นที่ใช้งานจริงจาก Eclipse เท่านั้น (เช่นเมื่อส่งออกผลิตภัณฑ์สำเร็จรูป)


ฉันยอมรับในประเด็นของคุณว่า default.properties จะถูกสร้างใหม่ทุกครั้ง ดังนั้นคำถามที่น่าสนใจ
Aman Alam

คุณควรยอมรับคำตอบของ ligi NeTeInStEiN ไม่ถืออีกต่อไปและทำให้ผู้ใช้ใหม่สับสน
Gaurav Agarwal

2
ฉันได้เปลี่ยนคำตอบให้ทันสมัยแล้ว
neteinstein

คำตอบของ ligi ยังคงชัดเจนกว่าของ neteinstein สำหรับการติดตั้งที่ใหม่กว่า ที่สำคัญที่สุดคือแสดงproguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt ว่าคุณต้องการการตั้งค่าแบบกำหนดเองสำหรับโครงการเฉพาะหรือไม่
ToolmakerSteve

คำตอบ:


76

เพียงแค่ติดตามเพราะฉันกำลังค้นหาสิ่งเดียวกัน - และคำตอบที่นี่ล้าสมัย - เมื่อเร็ว ๆ นี้การกำหนดค่าฐาน proguard อยู่ที่นี่ใน sdk dir - ดังนั้นคุณต้องใส่สิ่งนี้ลงใน 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 แต่สร้างขึ้นในรุ่นก่อนหน้า) ดูเหมือนว่าจะใช้วิธีการข้างต้นผสมผสาน:
ทอม

26
ยังค่อนข้างสับสนเพราะ project.properties ยังบอกว่า # ไฟล์นี้สร้างขึ้นโดยอัตโนมัติโดย Android Tools # อย่าแก้ไขไฟล์นี้การเปลี่ยนแปลงของคุณจะหายไป!
Todd Painton

12
"คุณต้องใส่สิ่งนี้ลงใน project.properties ของคุณเท่านั้น" บรรทัดนี้จะอยู่ใน project.properties แต่แสดงความคิดเห็นโดยค่าเริ่มต้น เพียงแค่ยกเลิกการแสดงความคิดเห็น
Braj

113

Android SDK (r20 หรือสูงกว่า)

โปรดตรวจสอบ proguard.config ที่กำหนดไว้ล่วงหน้าที่อ้างอิงใน project.properties

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 Tools => Export Signed Application)

หากคุณเริ่มโปรเจ็กต์ด้วย SDK ก่อน Android 2.3 proguard.cfgไฟล์จะไม่ถูกสร้างขึ้น (ถัดจากdefault.properties 2.3>)

หากต้องการเปิดใช้งานการสร้างโดยอัตโนมัติเพียงแค่อัปเดตเป็น SDK ของ Android 2.3 และสร้างโครงการใหม่ด้วยแหล่งที่มาที่มีอยู่ (ซึ่งเป็นแหล่งที่มาของโครงการที่คุณมีอยู่ในปัจจุบัน)

โดยอัตโนมัติ 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

1
@NeTeInStEiN ไม่เป็นไร ปรากฎว่าฉันควรจะสร้างขึ้นมาเอง
Bill The Ape

@NeTeInStEiN เมื่อฉันสร้างโปรเจ็กต์แม้ว่าเป้าหมายการสร้างจะเป็น Android1.1 แต่ฉันพบไฟล์proguard.cfgที่สร้างขึ้นโดยอัตโนมัติ
hasanghaforian

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.propertiesdefault.properties


build.properties อยู่ที่ไหน หรือฉันต้องสร้างมันขึ้นมา?
Ted Hopp

ในไดเร็กทอรีโปรเจ็กต์ถัดจาก default.properties (อย่างน้อยก็ใช้ Android SDK r8)
Eric Lafortune

นั่นคือสิ่งที่กำลังมองหา แต่ไม่มีไฟล์ดังกล่าวในโครงการของฉัน ฉันใช้ปลั๊กอินล่าสุดและเพิ่งสร้างโปรเจ็กต์ระดับ 8 เพื่อตรวจสอบสิ่งนี้
Ted Hopp

4
ปรากฎว่าการใช้ build.properties ใช้ได้กับ Ant builds เท่านั้นไม่ใช่สำหรับบิลด์ Eclipse
Ted Hopp

build.properties ในปี 2016 android studio buld อยู่ที่ไหน
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.