2013-12-16 15 views
7

Tôi đã áp dụng ProGuard cho ứng dụng Android của mình.Tại sao Proguard giữ lớp Hoạt động trong Android?

Tôi đang sử dụng

android-studio/sdk/tools/proguard/proguard-android.txt 

như một tập tin cấu hình, thay đổi gì cả.

Trong tập tin này tôi có thể thấy báo cáo kết quả chỉ liên quan đến Hoạt động:

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

Nó sau từ đó các hoạt động tên lớp được obfusctated bởi ProGuard trong khi một số phương pháp được bảo tồn như họ đang có. Điều này là dễ hiểu.

Tuy nhiên, trong ứng dụng của tôi, tôi sau đó tạo ra một lớp Hoạt động từ một chuỗi sử dụng

Class.forName("my.app.MyActivity") 

sau đó tôi bắt đầu Hoạt động này và nó bắt đầu tốt.

Nhưng điều đó có nghĩa là các lớp có nguồn gốc từ Hoạt động không bị làm xáo trộn ??. Nó nên đã thất bại vì ProGuard không có -keep class chỉ thị cho Activity, nó chỉ có -keepclassmembers.

Có thể ai đó, xin vui lòng, giải thích, nếu tôi có thể dựa vào các hành vi tôi quan sát? Hay tôi hiểu sai chỉ thị -keepclassmembers?

+0

Bạn nên đăng toàn bộ tệp, bởi vì dòng đó không đủ để giải thích lý do tại sao nó giữ tên Hoạt động – Raffaele

Trả lời

9

Bởi vì các hoạt động được liệt kê trong tệp kê khai và các lớp được tham chiếu có lưu trữ tự động. Điều này là cần thiết vì khung công tác Android truy cập các điểm vào ứng dụng này thông qua sự phản ánh.

Từ here:

Việc xây dựng quá trình chạy aapt công cụ để tự động tạo tập tin cấu hình bin/proguard.txt, dựa trên AndroidManifest.xml và các file xml khác. Quá trình xây dựng sau đó chuyển tệp cấu hình cho ProGuard. Vì vậy, bản thân ProGuard thực sự không xem xét AndroidManifest.xml, nhưng aapt + ProGuard làm.

3

Từ ProGuard FAQ:

Liệu ProGuard cuộc gọi xử lý Class.forName?

Có. ProGuard tự động xử lý các cấu trúc như Class.forName ("SomeClass") và SomeClass.class. Các lớp được tham chiếu được bảo toàn trong pha thu hẹp và các đối số chuỗi được thay thế đúng trong giai đoạn obfuscation. Với các đối số chuỗi biến, thường không thể xác định các giá trị có thể có của chúng. Ví dụ: chúng có thể được đọc từ tệp cấu hình. Tuy nhiên, ProGuard sẽ lưu ý một số cấu trúc như "(SomeClass) Class.forName (biến) .newInstance()". Đây có thể là dấu hiệu cho thấy lớp hoặc giao diện SomeClass và/hoặc các triển khai của nó có thể cần được bảo toàn. Nhà phát triển có thể điều chỉnh cấu hình của mình cho phù hợp.

Vì vậy, ProGuard thông minh hơn bạn mong đợi: ProGuard sẽ tự động phát hiện và xử lý các trường hợp sử dụng đơn giản cho forName(). Ngay cả khi lớp học không được tham chiếu trong tệp kê khai Android, ProGuard sẽ làm xáo trộn tên lớp trong cả lớp trong cuộc gọi của bạn tới forName().

Đối với hoạt động, nó sẽ không làm tôi ngạc nhiên nếu bạn bị che phủ bởi hành vi này và đầu vào dành riêng cho Android đối với ProGuard là một phần của quá trình xây dựng, như @laalto đề cập đến trong câu trả lời của anh ấy.

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