2016-08-05 19 views
5

Như tôi biết có một số lớp không nên bị làm xáo trộn và tên của chúng phải được lưu giữ như 'Hoạt động'. Tuy nhiên tôi muốn các lớp khác và các gói bên trong mã của tôi được đổi tên. đây là build.gradle bên trong thư mục ứng dụng: áp dụng plugin: 'com.android.application'Android: Cấu hình Proguard để làm xáo trộn tên và phương thức của lớp

android { 
    compileSdkVersion 23 
    buildToolsVersion "23.0.3" 

    defaultConfig { 
     applicationId "apt.eve.good.morning" 
     minSdkVersion 14 
     targetSdkVersion 23 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      minifyEnabled true 
      shrinkResources true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 


} 

dependencies { 
    compile fileTree(include: ['*.jar'], dir: 'libs') 
    testCompile 'junit:junit:4.12' 
    compile 'com.android.support:support-v4:23.4.0' 
    compile 'com.android.support:appcompat-v7:23.4.0' 
    compile 'com.android.support:design:23.4.0' 
} 

tôi sử dụng cấu hình Proguard này cho ứng dụng của tôi (app\proguard-rules.pro):

-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-useuniqueclassmembernames 
-verbose 

-keepattributes *Annotation* 
-keep public class com.google.vending.licensing.ILicensingService 
-keep public class com.android.vending.licensing.ILicensingService 

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native 
-keepclasseswithmembernames class * { 
    native <methods>; 
} 

# 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*(); 
} 
-allowobfuscations class * 
# We want to keep methods in Activity that could be used in the XML attribute onClick 
-keepclassmembers class * extends android.app.Activity { 

    public void *(android.view.View); 
} 

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations 
-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 

-keepclassmembers class * implements android.os.Parcelable { 
    public static final android.os.Parcelable$Creator CREATOR; 
} 

-keepclassmembers class **.R$* { 
    public static <fields>; 
} 

# The support library contains references to newer platform versions. 
# Don't warn about those in case this app is linking against an older 
# platform version. We know about them, and they are safe. 
-dontwarn android.support.** 

# Understand the @Keep support annotation. 
-keep class android.support.annotation.Keep 

-keep @android.support.annotation.Keep class * {*;} 

-keepclasseswithmembers class * { 
    @android.support.annotation.Keep <methods>; 
} 

-keepclasseswithmembers class * { 
    @android.support.annotation.Keep <fields>; 
} 

-keepclasseswithmembers class * { 
    @android.support.annotation.Keep <init>(...); 
} 

Nó làm tối ưu hóa nhưng như Tôi đã kiểm tra bên trong classses.dex tất cả các tên lớp vẫn không thay đổi. Vì vậy, tôi muốn biết những gì tôi bị mất trong tập tin cấu hình của tôi mà không phải là obfuscating tên lớp/phương pháp?

P.S.1 Tôi đã tìm kiếm một số câu hỏi nhưng tôi không thể tưởng tượng điều gì sai ở đây.

P.S.2 Tôi đã định cấu hình đúng studio android và các thay đổi về cấu hình proguard được áp dụng mà không gặp vấn đề gì với tệp .apk được phát hành của tôi.

+0

gửi build gradle của bạn tập tin – petey

+0

Nơi nào bạn kiểm tra kết quả của obfuscation? Tôi không chắc chắn 100%, nhưng tôi nghĩ rằng trong dự án của tôi, các tệp '.dex' bị xáo trộn nằm trong' build/intermediates/transforms/dex/** ', bất kỳ lớp/dex nào khác trong' build/** 'trông giống như đầu ra của bước xây dựng trước khi obfuscation. Cuối cùng, kết quả '.apk' /' .aar' sẽ bị làm xáo trộn, vì vậy nếu bạn giải nén cái đó, và các lớp không bị xáo trộn, thì cái gì đó không hoạt động như mong đợi. – Ped7g

+0

@ Ped7g Tôi sử dụng dex2jar để chuyển đổi dex bên trong apk của tôi thành tệp jar. Sau đó, tôi sử dụng [jd-gui] (http://jd.benow.ca/#jd-gui-overview) để dịch ngược tệp jar và khi tôi kiểm tra không có tên obfuscation bên trong mã của tôi. tất cả các lớp và các gói vẫn có cùng tên. – VSB

Trả lời

6

Đảm bảo bạn kiểm tra các tệp .dex bị xáo trộn.

Với tập lệnh xây dựng gradle phổ biến, các thư mục build/** có thể chứa một số phiên bản không rõ ràng của các tệp .dex/.class.

Cuối cùng kết quả .apk/.aar sẽ bị làm xáo trộn, vì vậy nếu bạn giải nén nó, và các lớp không bị xáo trộn, thì một cái gì đó không hoạt động như mong đợi.

Như OP đã lưu ý, việc xác minh công cụ [tháo gỡ] của bạn hoạt động chính xác cũng rất quan trọng.

Xem dạng nhị phân .dex từ .apk thường đủ để phát hiện [un] biểu tượng bị xáo trộn (thử với lớp chưa được chuẩn bị. Biểu tượng dễ đọc ngay cả trong trình soạn thảo văn bản, trong chuỗi .dex bị xáo trộn. aa "," ab ", ... cũng thường thấy rõ).

Cũng chạy nhiệm vụ bảo vệ gradle theo cách thủ công với tùy chọn tiết có thể giúp xác định xem trình bảo vệ có được chạy hay không và tệp nào.

+0

Đề xuất petey để kiểm tra bản đồ tập tin tốt hơn nhiều, chỉ cần đảm bảo nó mới (sửa đổi datetime == cca. build), và bạn có thể kiểm tra dễ dàng tất cả các biểu tượng bị xáo trộn (và tìm kiếm các ký hiệu "nhạy cảm" để xác minh chúng bị làm xáo trộn, như mong đợi). Không cần bất kỳ công cụ bổ sung nào để có được cái nhìn tổng quan chi tiết về thành công obfuscation. (và phương pháp nhị phân của tôi có thể được sử dụng chỉ để xác minh rằng .apk thực sự chứa kết quả mong đợi, như tệp bản đồ gợi ý ... nếu bạn thực sự hoang tưởng). – Ped7g

1

Bạn đã thay đổi

minifyEnabled=true 

Bên trong ứng dụng -> build.gradle?

buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 
     } 
    } 
3

Dựa trên tệp gradle của bạn (minifyEnabled=true) và cấu hình bảo vệ. Dường như bạn đang ở trong tình trạng tốt.

Để nhanh chóng xác nhận rằng ứng dụng của bạn làm xáo trộn các lớp học của bạn, hãy kiểm tra tệp mapping.txt kết quả khi bạn tạo bản phát hành bản phát hành. Tệp này "cung cấp bản dịch giữa lớp, phương thức và tên trường bị che khuất và ban đầu".

Đây là ví dụ về ánh xạ.txt rằng obsfucates thư viện hockeyapp:

net.hockeyapp.android.tasks.AttachmentDownloader -> net.hockeyapp.android.d.a: 
    java.util.Queue queue -> a 
    boolean downloadRunning -> b 
    67:67:net.hockeyapp.android.tasks.AttachmentDownloader getInstance() -> a 

Lots biết thêm có thể được tìm thấy trong "Shrink Mã và Tài nguyên của bạn" bài viết ở đây: https://developer.android.com/studio/build/shrink-code.html

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