2012-06-29 35 views
6

Khi xây dựng và triển khai một tệp thực thi trên Android mà không cần chạy ProGuard, các phương thức không được tham chiếu có được bao gồm trong tệp thi hành cuối cùng không?Các phương pháp không được báo trước có được bao gồm trong bản thực thi cuối cùng không?

Phương pháp không được tham chiếu từ các thư viện bên ngoài cũng được bao gồm?

Hành vi này có phụ thuộc vào trình biên dịch Java hay dex thực hiện tất cả các trang trí, nếu có?

+0

Không phải là bản dupe chính xác, nhưng hãy xem điều này cho rất nhiều thông tin rất hữu ích: http://stackoverflow.com/questions/4912695/what-optimizations-can-i-expect-from-dalvik-and-the-android- toolchain –

+0

@GrahamBorland Cảm ơn, tôi đã xem xét và không thể tìm thấy bất kỳ thông tin nào trong câu hỏi hoặc câu trả lời về việc liệu mã không được tham chiếu có được bao gồm hay không. –

Trả lời

5

tôi thử nghiệm với một lớp đơn giản (tất cả những phương pháp này unreferenced):

public class Test 
{ 
    private void privateMethod() 
    { 
     System.out.println("private"); 
    } 

    protected void protectedMethod() 
    { 
     System.out.println("protected"); 
    } 

    public void publicMethod() 
    { 
     System.out.println("public"); 
    } 

    void method() 
    { 
     System.out.println("method"); 
    } 
} 

tôi biên soạn apk, chiết xuất Test.class và dịch ngược nó (với javap -c). Tôi nhận được kết quả sau. Tôi cũng thử nghiệm với một cái bình thay vì một APK, và kết quả là chính xác như nhau. Tôi đã sử dụng Java 1.6.0_29.

protected void protectedMethod(); 
    Code: 
     0: getstatic  #44    // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldc   #47    // String protected 
     5: invokevirtual #46    // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     8: return   

    public void publicMethod(); 
    Code: 
     0: getstatic  #44    // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldc   #48    // String public 
     5: invokevirtual #46    // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     8: return   

    void method(); 
    Code: 
     0: getstatic  #44    // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldc   #49    // String method 
     5: invokevirtual #46    // Method java/io/PrintStream.println:(Ljava/lang/String;)V 
     8: return   

Có nghĩa chức năng chỉ tin được loại trừ tại thời gian biên dịch.

Tôi cũng đã cố gắng khai báo lớp học final, nhưng kết quả là như nhau.

+2

Điều này cũng có thể phụ thuộc vào trình biên dịch thực tế được sử dụng. Hơn nữa chúng tôi đang trên Android do đó bước dexification cũng có thể tối ưu hóa mã. – Robert

+0

@Robert làm thế nào Dalmas có thể biên dịch thành một gói ứng dụng và tránh dexing? –

+1

Có, tôi đã trích xuất lớp từ classes.dex trong APK (với dex2jar). Tuy nhiên, tôi không biết liệu tối ưu hóa này có xuất phát từ trình biên dịch Java hay từ việc giải thích. – Dalmas

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