2013-03-22 23 views
15

Tôi đang cố gắng định cấu hình proguard CHỈ loại bỏ cuộc gọi tới android.util.Log khỏi ứng dụng Android của tôi (dành cho bản phát hành bản phát hành). Tôi đặc biệt không muốn proguard để làm bất kỳ obfuscation hoặc minification của mã.Cách định cấu hình proguard CHỈ loại bỏ các cuộc gọi đăng nhập Android

Đây là cấu hình tôi đã cố gắng nhưng nó không loại bỏ các Log cuộc gọi (tôi giả sử vì -keep class **)

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod 

-keep class ** { 
    *; 
} 

-assumenosideeffects class android.util.Log { 
    *; 
} 

phải là những gì tôi yêu cầu thậm chí có thể với Proguard?

Trả lời

30

Bạn có thể loại bỏ các cuộc gọi đăng nhập với tùy chọn này trong proguard-project.txt:

-assumenosideeffects class android.util.Log { 
    public static boolean isLoggable(java.lang.String, int); 
    public static int v(...); 
    public static int i(...); 
    public static int w(...); 
    public static int d(...); 
    public static int e(...); 
} 

Tùy chọn này chỉ liên quan nếu tối ưu hóa là không tàn tật, như trong proguard-android.txt. Bạn cần phải xác định proguard-android-optimize.txt thay vào đó, trong project.properties:

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

Bạn có thể vô hiệu hóa bị thu hẹp và obfuscation nếu bạn muốn. Bạn cũng có thể duy trì API nội bộ của ứng dụng của bạn từ tối ưu hóa nếu bạn muốn:

-keep class myapp.** { *; } 

Vô hiệu hóa các bước sau và giữ tất cả các mã dĩ nhiên không phải là tối ưu từ một điểm ProGuard xem.

+0

Có vẻ như vấn đề là mặc định cấu hình Proguard toàn cầu vô hiệu hóa tối ưu hóa. Hiện tại tôi đã bỏ proguard và gói các cuộc gọi đăng nhập của mình bằng một kiểm tra cờ gỡ lỗi. Dù sao tôi sẽ chấp nhận câu trả lời của bạn vì nó giải quyết được câu hỏi ban đầu của tôi. – UloPe

+0

Tôi nhận thấy cuộc gọi web vẫn có thể hiển thị trong BasicNetwork.logSlowRequests và Request.finish sau đó ... bạn sẽ xóa như thế nào? – askilondz

+0

@Eric Bạn có thể vui lòng cung cấp một số nguồn trên đó không. Nó không giống như tôi không tin bạn, tôi làm. Nhưng vấn đề này là không giải thích được và là một nguồn của rất nhiều đau buồn. – f470071

12

Trong build.gradle

buildTypes { 

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

Trong proguard-rules.pro

-dontwarn ** 
-target 1.7 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 

-optimizations !code/simplification/arithmetic,!code/allocation/variable 
-keep class ** 
-keepclassmembers class *{*;} 
-keepattributes * 

#This will not remove error log 
-assumenosideeffects class android.util.Log { 
    public static boolean isLoggable(java.lang.String, int); 
    public static int v(...); 
    public static int i(...); 
    public static int w(...); 
    public static int d(...); 
    #public static int e(...); 
} 
+1

Điều này không hiệu quả đối với tôi .. Tôi Sao chép/Dán mã của bạn và tôi vẫn còn các bản ghi .. – Majstor

+0

Bạn sẽ thấy các nhật ký lỗi. Loại bỏ # trước khi public static int e (...); và trước khi public static boolean isLoggable (java.lang.String, int); Ngoài ra hãy chắc chắn rằng bạn chạy bản dựng. Các thay đổi dành cho bản phát hành bản phát hành. –

+1

Tôi đã sai Sandeep. Nó hoạt động .. Tôi xin lỗi. Tôi đã quên thay đổi proguard-android.txt -> proguard-android-optimize.txt – Majstor

Các vấn đề liên quan