2016-04-14 16 views
6

Tôi có một ứng dụng mà tham khảo ~ 100K phương pháp, với min SDK = 16Chiến lược tốt khi giao dịch với Proguard, MultiDex, Thử nghiệm và Hương vị sản phẩm là gì?

Đây là 2 lựa chọn cho lắp ráp:

  • Proguard teo bó này các phương pháp để chỉ 44K phương pháp
  • Sử dụng nhiều Dex

Bây giờ tôi có một số trường hợp sử dụng chung:

  1. Run và debug trên giả lập và các thiết bị
    • Nó đòi hỏi để chạy càng nhanh càng tốt
  2. làm xét nghiệm (Integration và UI)
    • Nó đòi hỏi để chạy (Tôi có một số vấn đề chạy Espresso với MultiDex)
  3. Hãy aPK Prod
    • Nó đòi hỏi là đáng tin cậy và co càng tốt

Bạn có kẻ một số NHẬN ĐỊNH về chiến lược lắp ráp?

3/Prod

  • Sử dụng Proguard để giảm kích thước apk
  • Sử dụng Proguard xáo trộn
  • Không sử dụng Multidex như hầu hết càng tốt (có thể thất bại)

2/Thử nghiệm

  • Sử dụng minSdkVersion 21 (Tôi đọc bắt đầu bằng 21 cho phép đặt trước dexing, tiết kiệm thời gian)
  • ???

1/Debug

  • Sử dụng minSdkVersion 21 (Tôi đọc mà bắt đầu bằng 21 cho phép trước Dexing, mà tiết kiệm thời gian)
  • ???

Dưới đây là file Gradle:

productFlavors { 
     dev { 
      minSdkVersion 21 
      multiDexEnabled ??? 
      testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
     } 
     prod { 
      // The actual minSdkVersion for the application. 
      minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION 
      multiDexEnabled false 
     } 
    } 
    defaultConfig { 
     applicationId "xxxx" 
     targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION 
     minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION 
     versionCode ANDROID_BUILD_VERSION_CODE 
     versionName ANDROID_BUILD_APP_VERSION_NAME 
    } 

    buildTypes { 
     release { 
      debuggable false 
      ext.enableCrashlytics = true 
      renderscriptOptimLevel 3 
      signingConfig android.signingConfigs.release 
      zipAlignEnabled true 
      minifyEnabled true 
      // shrinkResources true 
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 
     } 
     debug { 
      debuggable true 
      renderscriptOptimLevel 3 
      applicationIdSuffix ".debug" 
      versionNameSuffix "debug" 
      minifyEnabled false 
     } 
    } 

Trả lời

2

Dựa trên đề nghị của @Muzikant, mà tôi chủ yếu là đồng ý, tôi tóm tắt tầm nhìn ngày nay tôi

  • Cố gắng không sử dụng MultiDex nếu có thể.
    • Nó có thể xảy ra để đạt được số với overhead của phương pháp 65K mang lại với các thư viện kiểm tra (để sử dụng MutliDex)
    • Có thể xảy ra MultiDex là nhanh hơn so với quá trình Proguard (để được kiểm tra), vì vậy nó có thể là thú vị để gỡ lỗi
  • Hãy thử sử dụng một gói ứng dụng để thử nghiệm đó là gần nhất với việc phát hành apk

khuyến nghị của tôi là:

01.
  1. như có 3 xây dựng các trường hợp, chỉ cần thực hiện 3 buildTypes:

    • phát hành
    • debug
    • xác nhận (thử nghiệm là một từ dành riêng)
  2. sử dụng 2 hương vị :

    • một bản phát hành với minSdkVersion của ứng dụng của bạn
    • và một cho phát triển sử dụng cập nhật hơn minSdkVersion (tòa nhà nhanh hơn, nhiều tính năng hơn để thử nghiệm, dễ sử dụng hơn ...)
  3. không xáo trộn để gỡ lỗi

  4. cho việc sử dụng Proguard trong giai đoạn thử nghiệm, một từ khóa cụ thể của Gradle DSL là cần thiết testProguardFile('proguard-rules-test.pro')

  5. điểm xây dựng sẽ được sử dụng để gỡ lỗi với testBuildType = "validation"

  6. làm giảm bớt thử nghiệm (ít nhất là cho hệ thống giao diện người dùng và thử nghiệm chức năng trên hệ thống CI)

  7. sử dụng các quy tắc tối ưu hóa Proguard chỉ dành cho phiên bản getDefaultProguardFile('proguard-android-optimize.txt'), để thử nghiệm và gỡ lỗi chỉ cần sử dụng getDefaultProguardFile('proguard-android.txt')

Các kiến ​​trúc của file Proguard của tôi là như sau:

  1. một tập tin chính cho bản phát hànhproguard-rules-release.pro bao gồm một tập hợp các tệp Proguard chuyên dụng với -include proguard-rules-fabric.pro

  2. một tập tin thứ hai cho debugproguard-rules-debug.pro bao gồm proguard-rules-release.pro

  3. một tập tin thứ ba cho debugproguard-rules-dontobfuscate.pro mà vô hiệu hóa obfuscation

  4. một ra nộp đơn xin thử nghiệmproguard-rules-test.pro bao gồm proguard-rules-debug.pro và các quy tắc cần thiết để thử nghiệm

Dưới đây là file Gradle:

android { 
    ... 
    compileSdkVersion ANDROID_BUILD_SDK_VERSION 
    buildToolsVersion ANDROID_BUILD_TOOLS_VERSION 

    productFlavors { 
     // Define separate dev and prod product flavors. 
     dev { 
      // dev utilizes minSDKVersion = 21 to allow the Android gradle plugin 
      // to pre-dex each module and produce an APK that can be tested on 
      // Android Lollipop without time consuming dex merging processes. 
      minSdkVersion 21 
      multiDexEnabled false 

     } 
     prod { 
      // The actual minSdkVersion for the application. 
      minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION 
      multiDexEnabled false 
     } 
    } 
    defaultConfig { 
     applicationId "x.y.app.z" 
     targetSdkVersion ANDROID_BUILD_TARGET_SDK_VERSION 
     minSdkVersion ANDROID_BUILD_MIN_SDK_VERSION 
     versionCode ANDROID_BUILD_VERSION_CODE 
     versionName ANDROID_BUILD_APP_VERSION_NAME 
     testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 
    } 
    // point thge build for testing 
    testBuildType = "validation" 

    buildTypes { 
     release { 
      debuggable false 
      ext.enableCrashlytics = true 
      renderscriptOptimLevel 3 
      signingConfig android.signingConfigs.release 
      zipAlignEnabled true 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules-release.pro' 
     } 
     debug { 
      debuggable true 
      renderscriptOptimLevel 3 
      applicationIdSuffix ".debug" 
      versionNameSuffix "debug" 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro', `proguard-rules-dontobfuscate.pro` 
     } 

     validation.initWith(debug) 
     validation { 
      signingConfig android.signingConfigs.release 
      debuggable false 
      renderscriptOptimLevel 3 
      applicationIdSuffix ".test" 
      versionNameSuffix "test" 
      minifyEnabled true 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules-debug.pro' 
      testProguardFile('proguard-rules-test.pro') 
     } 
    } 
... 
} 

tôi vẫn còn có một số điểm mở để giải quyết:

  • Làm thế nào để sử dụng các ký debug tự động của Android Studio về việc phê chuẩn xây dựng ? (nhưng tôi không chắc chắn về tác động)

  • Tôi vẫn phải thêm thuộc tính proguardFiles trong BuildType xác thực trong khi tôi có testProguardFile('proguard-rules-test.pro') bao gồm gỡ lỗi!

+0

có thể thêm validation.initWith (buildTypes.debug) cho điểm mở đầu tiên (để được kiểm tra) – Anthony

+0

Tôi thấy điểm "sử dụng quy tắc Proguard tối ưu hóa chỉ để giải phóng getDefaultProguardFile ('proguard-android-optimization.txt'), để kiểm tra và gỡ lỗi chỉ sử dụng getDefaultProguardFile ('proguard- android.txt ') "được cung cấp. Tại sao chúng tôi không chạy thử nghiệm với mã Tối ưu hóa? Tôi đã thực hiện các thử nghiệm trên mã của mình với sự làm xáo trộn, nhưng tôi đang đối mặt với các vấn đề với mã được tối ưu hóa. –

1

tôi sử dụng Proguard trên cả hai gỡ lỗi và phát hành phiên bản để tránh multidex.

tập tin build.gradle của tôi trông như thế:

debug { 
    minifyEnabled true 
    proguardFiles 'proguard_debug.pro' 
    signingConfig signingConfigs.debug 
    debuggable true 
} 
release { 
    minifyEnabled true 
    proguardFiles 'proguard_release.pro' 
    signingConfig signingConfigs.release 
    debuggable false 
} 

để minimze khác biệt giữa debug và phát hành, và cho phép gỡ lỗi thích hợp của debug xây dựng, các tập tin proguard_debug.pro chứa các hướng dẫn Proguard sau:

-include proguard_release.pro 

-dontobfuscate 
-dontoptimize 
-keep class my.package.name.** {*; } 

Bằng cách đó, tôi chỉ duy trì một cấu hình bảo vệ đơn (trong proguard_release.pro) và phiên bản gỡ lỗi được xây dựng bằng cách sử dụng cùng một cấu hình nhưng không làm xáo trộn mã.

cấu hình đó giải quyết tất cả các vấn đề được đề cập:

  1. Không multidex được yêu cầu (vì vậy không tiến thoái lưỡng nan liệu có nên sử dụng nó với API trên 21, và bạn có thể sử dụng Espresso)
  2. Debug và phát hành xây dựng là cùng, ngoại trừ việc debug build không xáo trộn mã của bạn
+0

OK, tốt. Chỉ cần lưu ý nó cũng có thể có vấn đề gây ra bởi obfuscation! Tuy nhiên việc xây dựng gói ứng dụng thực sự chậm để gỡ lỗi và thử nghiệm. Bạn có thích nghi với sự chậm trễ này không? – Anthony

+0

Xem xét các giải pháp thay thế, đây là giải pháp tốt nhất cho tôi. Obfuscation không phải là một vấn đề vì cấu hình proguard debug có cờ -dontobfuscate – Muzikant

+0

Vâng, tôi chỉ nói rằng obfuscation có thể mang lỗi vào ứng dụng. Điều này cũng tốt để kiểm tra với – Anthony

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