2015-05-29 16 views
14

Tôi đang sử dụng ProGuard trong AndroidStudio 1.2.1.1 với Gradle 1.2.3.Làm xáo trộn các trường riêng tư bằng cách sử dụng ProGuard

My Gradle của phiên bản build được cấu hình như vậy:

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

Tôi muốn các lĩnh vực riêng của lớp học để được obfuscated.

Dưới đây là tập tin của tôi Proguard config (sau nhiều cố gắng) như bây giờ:

-allowaccessmodification 
-dontskipnonpubliclibraryclasses 
-dontskipnonpubliclibraryclassmembers 
-renamesourcefileattribute SourceFile 
-keepattributes SourceFile,LineNumberTable 
-repackageclasses '' 
-verbose 
[...] 

Nhưng tôi kết thúc, sau khi dịch ngược với androdd từ AndroidGuard, với:

private com.google.android.gms.common.api.GoogleApiClient googleApiClient; 

tôi biết sử dụng obfuscation này là có hạn, nhưng tôi muốn googleApiClient được đổi tên bởi ProGuard. Làm thế nào để làm như vậy?

Đây là refcard.

Có cách nào để làm điều ngược lại với -keepclassmembernames không?

+0

là googleApiClient chỉ không khó hiểu lĩnh vực hoặc là nó giống nhau cho tất cả các lĩnh vực? –

+1

Tôi muốn điều này cho tất cả các trường riêng tư. – shkschneider

Trả lời

8

Bắt từ này: How to tell ProGuard to keep private fields without specifying each field

Theo ProGuard documenation wildcard khớp với bất kỳ lĩnh vực .

Đầu trang, Bạn có thể sử dụng từ chối (!). (http://proguard.sourceforge.net/#manual/usage.html)

tên thuộc tính có thể chứa?, *, Và ** kí hiệu, và họ có thể trước bởi sự! người phủ nhận.

Tôi không có nhiều kinh nghiệm trong lĩnh vực này, vì vậy đúng hơn là phỏng đoán nhưng dễ viết hơn trong nhận xét mới. Một cái gì đó như thế này nên thực hiện công việc (không kiểm tra):

-keepclassmembers class * { //should find all classes 
    !private <fields>;  
    <methods>; 
    <init>; //and keep every field, method, constructor apart from private fields 
} 

Có thể là bạn có thể sử dụng như thế này, nhưng không chắc làm thế nào nó hoạt động với một negator đầu tiên:

-keepclassmembers class * { //should find all classes 
    !private <fields>;  
    *; //should exclude everything except private fields, which should be obfuscated. 
} 
+0

Tôi đã sử dụng lớp '-keepclassmembers my.package {! Private ; được bảo vệ ; công khai ; ; } 'và nhận được những gì tôi muốn: các trường có tên' a', 'b',' c' v.v. Tôi biết điều này có liên quan đến những người phủ nhận, cảm ơn đã dẫn tôi đến đúng cách sử dụng. Tôi sẽ tinh chỉnh việc sử dụng cá nhân của mình, nhưng đó là câu trả lời tôi đang tìm kiếm. – shkschneider

+0

Đây là tệp ProGuard cuối cùng của tôi hoạt động với lỗi Android # 78377: https://gist.github.com/shkschneider/a1c81780cd1f35a7037d – shkschneider

+0

Cảm ơn bạn đã trả lời và nhận phần thưởng! Tôi vui mừng vì bạn đã làm việc dựa trên những gợi ý của tôi, cũng cảm ơn vì đã đưa vào github, đó cũng là một trải nghiệm tốt cho tôi. – czupe

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