Android için Eclipse'de ProGuard'ı Etkinleştirme


112

Yeni belgeler Android ProGuard'daki , proje ana dizinindeki default.properties dosyasına bir satır eklemenizi söylüyor. Ancak, bu dosyayı açarken en üstte okudum:

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

Bir şey mi kaçırıyorum?

Ayrıca, ProGuard'ı yalnızca Eclipse'den bir üretim yapısı için etkinleştirmenin bir yolu var mı (yani, bitmiş ürünü ihraç ederken)?


Varsayılan özelliklerin her seferinde yeniden oluşturulacağını kabul ediyorum. Bu nedenle, ilginç bir soru
Aman Alam

Ligi'nin cevabını kabul etmelisiniz, NeTeInStEiN artık tutmuyor ve yeni kullanıcının kafasını karıştırıyor.
Gaurav Agarwal

2
Cevabı güncel olacak şekilde değiştirdim.
neteinstein

Yeni kurulumlar için ligi'nin cevabı hala neteinstein'dan daha net. En önemlisi, proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt belirli bir proje için özel ayarlara ihtiyacınız olup olmadığını gösterir .
ToolmakerSteve

Yanıtlar:


76

sadece bir takip çünkü aynı şeyi arıyordum - ve buradaki cevaplar modası geçmiş - son zamanlarda temel proguard yapılandırması burada sdk dizininde - bu yüzden bunu sadece projenize eklemeniz gerekiyor. özellikler:

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

projeye özgü değişiklikler yapmak istiyorsanız, bir proguard-project.txt oluşturun ve satırı şu şekilde değiştirin:

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

Projeme baktığımda (r20'de, ancak önceki bir sürümde oluşturulmuş) yukarıdaki yöntemlerin bir karışımını kullanıyor gibi görünüyor:
Tom

26
Hala oldukça kafa karıştırıcı çünkü project.properties ayrıca # Bu dosya Android Araçları tarafından otomatik olarak oluşturuldu. # Bu dosyayı değiştirmeyin - DEĞİŞİKLİKLERİNİZ SİLİNECEKTİR!
Todd Painton

12
"sadece bunu project.properties dosyanıza koymanız gerekir". Bu satır project.properties dosyasında yer alacak ancak varsayılan olarak yorumlanacaktır. Sadece açıklamayı kaldırın.
Braj

113

Android SDK (r20 veya üstü)

Lütfen project.properties dosyasında belirtilen önceden tanımlanmış proguard.config dosyasını kontrol edin

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

Daha fazla bilgi: http://proguard.sourceforge.net/manual/examples.html#androidapplication

Gradle'da:

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

            ...
  }
 }

Burada güncellemeye devam ettiğim bir proguard "varsayılan" dosyasını kontrol edebilirsiniz: https://medium.com/code-procedure-and-rants/android-my-standard-proguard-ffeceaf65521


Android SDK (r19 veya daha düşük)

Bunu default.properties'e ekleyebilirsiniz. Şu ana kadar bir sorun yaşamadan manuel olarak ekliyorum.

Satırı eklerseniz:

proguard.config=proguard.cfg

Belirtildiği gibi, yalnızca imzalı uygulamayı dışa aktarırken ProGuard'ı kullanacaktır (Android Araçları => İmzalı Uygulamayı Dışa Aktar)

Projeyi Android 2.3'ten önce SDK ile başlatırsanız, proguard.cfgdosya oluşturulmayacaktır ( default.properties2.3> ' de olduğu gibi).

Otomatik olarak oluşturulmasını sağlamak için, Android 2.3'ün SDK'sına güncellemeniz ve mevcut kaynaklarla (şu anda sahip olduğunuz projenin kaynakları olan) yeni bir proje oluşturmanız yeterlidir.

Otomatik olarak proguard.cfgdolgu oluşturulacaktır.

Yine de manuel olarak oluşturmak istiyorsanız, içermesi gereken şey budur:

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

Sanırım yukarıdaki tüm soruları cevapladım.

GÜNCELLEME :

Satır satır açıklama:

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

GÜNCELLEME 2:

En son ADT / Proguard'da -keepclasseswithmembersbunun yerine-keepclasseswithmembernames


1
@NeTeInStEiN SDK 16'ya (Android 4.x) güncelledim, satırı ekledim proguard.config=proguard.cfgancak proguard.cfg dosyası görünmüyor ... Birden çok kez dışa aktarım yapmasına rağmen, Eclipse'i yeniden başlatıyorum vb. Neden? ve bunu nasıl düzeltebilirim? Teşekkürler.
Bill The Ape

1
@NeTeInStEiN Boş ver. Kendim yaratmam gerektiği ortaya çıktı.
Bill The Ape

@NeTeInStEiN Bir proje oluşturduğumda, derleme hedefi Android1.1 olmasına rağmen , otomatik olarak oluşturulan proguard.cfg dosyasını buldum .
hasanghaforian

1
@NeTeInStEiN İnanılmaz adam ... Zamanınızı ve çabalarınızı gerçekten takdir ediyorum, Şerefe !!
swiftBoy

1
@ user31231234124 İstediğiniz bilgileri ekledi.
neteinstein

10

En azından ADT 16 itibariyle, hattı gerçekten ekleyebilirsiniz project.propertiesve korunacaktır. Hedef SDK sürümünü değiştirmeyi deneyebilir ve project.propertiesbuna göre güncellendiğini ancak eklenen satırın hala orada olduğunu görebilirsiniz. Bu yüzden, uyarının çok kötü ifade edildiğini düşünüyorum; bu, dosyadaki gibi targetayarların proje ayarlarının tersi yerine üzerine yazılacağı anlamına gelir .


4

ProGuard konfigürasyonundaki değişiklikler ADT sürüm 17 ile birlikte geldi. ProGuard 4.4'ten 4.7'ye güncellendi ve konfigürasyon dosyası referansındaki fark zaten not edildi. Mevcut projelerin, bu ve daha yeni ADT sürümlerinde bulunan daha yeni kural kümesi olmadan bırakılarak değişmeden kalacağını unutmayın. Daha yeni konfigürasyon düzenlemesi için yukarıda ligi tarafından belirtilen ilgili dokümanlar şu adreste mevcuttur: -

http://tools.android.com/recent/proguardimproements "İkinci olarak, yapılandırma dosyalarının işlenme şeklini değiştirdik."


3

Çizgiyi build.properties, bölümünde bahsedildiği gibi ekleyebilirsiniz default.properties.


Build.properties nerede? Yoksa onu yaratmam mı gerekiyor?
Ted Hopp

Bu, proje dizininde, default.properties'in yanında (en azından Android SDK r8 ile).
Eric Lafortune

Onu aradığım yer burası ama projelerimin hiçbirinde böyle bir dosya yok. En son eklentiyi kullanıyorum ve bunu kontrol etmek için seviye 8 projesi oluşturdum.
Ted Hopp

4
Build.properties kullanımının Eclipse sürümleri için değil, yalnızca Ant yapıları için işe yaradığı ortaya çıktı.
Ted Hopp

2016 android studio buld'da build.properties nerede?
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.