Bật ProGuard trong Eclipse cho Android


112

Tài liệu mới về ProGuard cho Android cho biết thêm một dòng vào tệp default.properties trong thư mục chính của dự án. Tuy nhiên, khi mở tệp này, tôi đọc ở trên cùng:

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

Tui bỏ lỡ điều gì vậy?

Ngoài ra, có cách nào để chỉ kích hoạt ProGuard cho bản dựng sản xuất từ ​​Eclipse (tức là khi xuất thành phẩm) không?


Tôi đồng ý với quan điểm của bạn rằng default.properties sẽ được tạo lại mọi lúc. Như vậy, một câu hỏi thú vị của nó
Aman Alam

Bạn nên chấp nhận câu trả lời của ligi, NeTeInStEiN không giữ nữa và gây nhầm lẫn cho người dùng mới.
Gaurav Agarwal

2
Tôi đã thay đổi câu trả lời để được cập nhật.
neteinstein

Câu trả lời của ligi vẫn rõ ràng hơn neteinstein, cho các bản cài đặt mới hơn. Quan trọng nhất, nó cho thấy proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt , nếu bạn cần cài đặt tùy chỉnh cho một dự án cụ thể.
ToolmakerSteve

Câu trả lời:


76

chỉ là tiếp theo vì tôi đang tìm kiếm thứ tương tự - và các câu trả lời ở đây đã lỗi thời - gần đây cấu hình proguard cơ sở ở đây trong sdk dir - vì vậy bạn chỉ phải đặt điều này vào dự án của mình.

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

nếu bạn muốn thực hiện các sửa đổi dành riêng cho dự án, hãy tạo một tệp proguard-project.txt và thay đổi dòng thành:

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

Xem xét dự án của tôi (trong phiên bản r20, nhưng được tạo trong bản phát hành trước), có vẻ như sử dụng kết hợp các phương pháp trên:
Tom

26
Vẫn khá khó hiểu vì project.properties cũng nói # Tệp này được tạo tự động bởi Công cụ Android. # Không sửa đổi tệp này - CÁC THAY ĐỔI CỦA BẠN SẼ BỊ LỖI!
Todd Painton

12
"bạn chỉ phải đưa cái này vào project.properties của mình". Dòng này sẽ ở đó trong project.properties nhưng được nhận xét theo mặc định. Chỉ cần bỏ bình luận nó.
Braj

113

SDK Android (r20 trở lên)

Vui lòng kiểm tra proguard.config được xác định trước được tham chiếu trong project.properties

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

Thông tin thêm: http://proguard.sourceforge.net/manual/examples.html#androidapplication

Trên Gradle:

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

            ...
  }
 }

Tại đây, bạn có thể kiểm tra tệp "mặc định" của proguard mà tôi vẫn cập nhật: https://medium.com/code-procedure-and-rants/android-my-standard-proguard-ffeceaf65521


SDK Android (r19 trở xuống)

Bạn có thể thêm nó vào default.properties. Tôi đã thêm thủ công mà không gặp sự cố cho đến nay.

Nếu bạn thêm dòng:

proguard.config=proguard.cfg

Như đã nói, nó sẽ chỉ sử dụng ProGuard khi xuất ứng dụng đã ký (Công cụ Android => Xuất ứng dụng đã ký)

Nếu bạn bắt đầu dự án với SDK trước Android 2.3, proguard.cfgtệp sẽ không được tạo (bên cạnh default.propertiesnhư trong 2.3>).

Để cho phép tự động tạo nó, chỉ cần cập nhật lên SDK của Android 2.3 và tạo một dự án mới với các nguồn hiện có (là các nguồn của dự án bạn hiện có).

Tự động proguard.cfgđiền sẽ được tạo.

Nếu vẫn còn, bạn muốn tạo nó theo cách thủ công, đây là những gì nó phải chứa:

-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>;
}

Tôi nghĩ rằng tôi đã trả lời tất cả các câu hỏi ở trên.

CẬP NHẬT :

Giải thích từng dòng:

#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();
#}

CẬP NHẬT 2:

Trong lần sử dụng ADT / Proguard gần đây nhất -keepclasseswithmembersthay vì-keepclasseswithmembernames


1
@NeTeInStEiN Tôi đã cập nhật lên SDK 16 (Android 4.x), đã thêm dòng proguard.config=proguard.cfgnhưng tệp proguard.cfg không thấy đâu ... Mặc dù đã thực hiện xuất nhiều lần, khởi động lại Eclipse, v.v. Bạn có biết tại sao không? và làm thế nào để khắc phục điều này? Cảm ơn.
Bill The Ape

1
@NeTeInStEiN Đừng bận tâm. Hóa ra là tôi nên tự tạo ra một cái.
Bill The Ape

@NeTeInStEiN Khi tôi tạo một dự án, mặc dù mục tiêu xây dựng của nó là Android1.1, tôi đã tìm thấy tệp proguard.cfg được tạo tự động.
hasanghaforian

1
@NeTeInStEiN Người đàn ông tuyệt vời ... Thực sự đánh giá cao thời gian và nỗ lực của bạn, Cheers !!
swiftBoy

1
@ user31231234124 Đã thêm thông tin bạn yêu cầu.
neteinstein

10

Kể từ ADT 16 ít nhất, bạn thực sự có thể thêm dòng vào project.propertiesvà nó sẽ được giữ nguyên. Bạn có thể thử thay đổi phiên bản SDK mục tiêu và thấy phiên bản đó project.propertiesđược cập nhật tương ứng nhưng dòng đã thêm vẫn ở đó. Vì vậy, tôi nghĩ rằng cảnh báo chỉ là lời nói xấu; có nghĩa là các cài đặt trong tệp chẳng hạn như targetsẽ bị ghi đè bằng cài đặt dự án, thay vì ngược lại.


4

Các thay đổi đối với cấu hình ProGuard đến với phiên bản ADT 17. ProGuard đã được cập nhật từ 4.4 lên 4.7 và sự khác biệt trong tham chiếu tệp cấu hình đã được giới thiệu. Lưu ý rằng các dự án hiện tại sẽ không thay đổi, không có bộ quy tắc mới hơn được bao gồm trong phiên bản ADT này và mới hơn. Tài liệu liên quan để sắp xếp cấu hình mới hơn, đã được ligi ghi chú ở trên, có sẵn tại: -

http://tools.android.com/recent/proguardimprovements "Thứ hai, chúng tôi đã thay đổi cách xử lý tệp cấu hình."


3

Bạn có thể thêm dòng vào build.properties, như đã đề cập trong default.properties.


Build.properties ở đâu? Hay tôi cần tạo nó?
Ted Hopp

Nó nằm trong thư mục dự án, bên cạnh default.properties (ít nhất là với Android SDK r8).
Eric Lauckyne

Đó là nơi tôi đang tìm kiếm nó, nhưng không có tệp nào như vậy trong bất kỳ dự án nào của tôi. Tôi đang sử dụng plugin mới nhất và vừa tạo một dự án cấp 8 để kiểm tra điều này.
Ted Hopp

4
Nó chỉ ra rằng việc sử dụng build.properties chỉ hoạt động cho các bản dựng Ant, không cho các bản dựng Eclipse.
Ted Hopp

build.properties ở đâu trong buld android studio 2016?
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.