2012-08-24 12 views
10

Tôi đang sử dụng SDK Android mới nhất (4.1) và tôi đã thử xuất khẩu một lọ đã ký với Proguard được bật. Tuy nhiên, sau khi dịch ngược APK được tối ưu hóa, tôi nhận thấy rằng các phương pháp mà tôi đã dự kiến ​​sẽ được gạch chân thì không.Android Proguard không trực tuyến

Tôi biết rằng Proguard đã chạy vì mã đã bị che khuất một cách chính xác. Vì vậy, để khẳng định điều này, tôi đã thêm phương pháp này để Hoạt động của tôi:

private void testInlining() 
{ 
    mConfig = null; 
} 

phương pháp tư nhân này được gọi là một lần duy nhất trong hoạt động của tôi, và bởi vì nó là tư nhân, nó phải rất rõ ràng để tôi ưu hoa mà nó được gọi là chỉ một lần và nó phải được gạch chân.

Tài liệu cho biết rằng tất cả các tối ưu hóa được bật theo mặc định và Proguard "Các phương thức nội tuyến ngắn hoặc chỉ được gọi một lần".

Có một lá cờ cụ thể mà tôi nên cung cấp cho Proguard để bật nội tuyến không?

EDIT

tập tin cấu hình Proguard My chứa

-optimizationpasses 5 
-allowaccessmodification 
-overloadaggressively 
-repackageclasses '' 
-dontskipnonpubliclibraryclasses 

EDIT

Sau khi sử dụng

-whyareyoukeeping class com.templatecompany.templateappname.EntryPointActivity {*;} 

tôi nhận được lý do tại sao phương pháp này là không inlined:

[proguard] com.templatecompany.templateappname.EntryPointActivity: void testInlining() (20:21) 
[proguard] is invoked by com.templatecompany.templateappname.EntryPointActivity: com.td.media.ivConnection.IvConfig getIvConfig() (14:15) 
[proguard] implements  com.td.widget.MainActivity: com.td.media.ivConnection.IvConfig getIvConfig() 
[proguard] is invoked by com.td.widget.MainActivity: void onCreate(android.os.Bundle) (140:175) 
[proguard] implements  android.app.Activity: void onCreate(android.os.Bundle) 
[proguard] is a library method. 

Nhưng tôi không chắc chắn để xem cách thực tế là phương pháp testInlining được sử dụng trong phương pháp getIvConfig đó là lần lượt được sử dụng bởi phương pháp khác ngăn chặn nội tuyến trên testInlining trong getIvConfig.

+0

Bạn đã thử điều này chưa? -optimizationpasses 5 Thông tin thêm về http://stackoverflow.com/questions/5068251/android-what-are-the-recommended-configurations-for-proguard?rq=1 – user1154664

+0

Were bạn thực sự có thể để có được Proguard để thực hiện bất kỳ phương thức nào gọi nội dòng? Sử dụng proguard-android-optimize.txt và viết một phương thức riêng tư đơn giản trả về một int, tôi không thể xem nó hoạt động: http://paste.ofcode.org/hbpzPe4EdAnDGnNqNTE7c3 – brAzzi64

Trả lời

15

SDK Android mới này vô hiệu hóa tất cả các tối ưu hóa theo mặc định, xem $ {} sdk.dir /tools/proguard/proguard-android.txt:

-dontoptimize 

Cấu hình thay thế tối ưu hóa chỉ vô hiệu hóa một số tối ưu, xem $ {sdk.dir} /tools/proguard/proguard-android-optimize.txt:

-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/* 

Bạn có thể chỉ định tệp cấu hình ưa thích của mình trong project.properties.

Bạn có thể xác minh cấu hình đầy đủ mà ProGuard đang sử dụng bằng cách thêm tùy chọn -printconfiguration.

Một số tối ưu hóa đã bị tắt để tránh lỗi trong các phiên bản cũ của máy ảo Dalvik (! Mã/đơn giản hóa/số học !, mã/đơn giản hóa/truyền) và một số tối ưu hóa có thể đã bị vô hiệu hóa để tránh lỗi trong các phiên bản cũ hơn của ProGuard (! field/*, class/merging/*).

Lưu ý rằng -whyareyoukeeping đề cập đến bước thu hẹp, loại bỏ các lớp/trường/phương thức không cần thiết nói chung. Các phương pháp không được xóa có thể được gạch chân trong bước tối ưu hóa (trừ khi được chỉ định rõ ràng khác với -keep).

+0

Điều đó có ý nghĩa, tôi không biết rằng Theo mặc định, Google đã tắt tối ưu hóa. Cảm ơn rất nhiều, tôi sẽ thử rằng một daccept câu trả lời nếu nó sửa chữa nó. –

1

Trong file build.gradle của mô-đun, bạn nên xem xét:

buildTypes { 
    release { 
     minifyEnabled true 
     shrinkResources true 
     proguardFiles getDefaultProguardFile('proguard-android.txt'), file('proguard-project.txt') 
     signingConfig signingConfigs.release 
    } 
} 

thay proguard-android.txt với proguard-android-optimize.txt, mà không bao gồm các dòng -dontoptimize trong khi vẫn giữ những vấn đề Dalvik đi (xem câu trả lời Eric Lafortune của) .