android – 处理Proguard,MultiDex,测试和产品口味时的好策略是什么?

我有一个引用~100K方法的应用程序,最小Sdk = 16

这是2个组装选项:

> Proguard将这一系列方法缩减为仅44K方法
>使用Multi Dex

现在我有一些常见的用例:

>在模拟器和设备上运行和调试

>它需要尽可能快

>做测试(集成和UI)

>它需要运行(我有一些问题运行Espresso与MultiDex)

>制作Prod APK

>它需要尽可能可靠和缩小

你有人对组装策略有一些建议吗?

3 / Prod

>使用Proguard减少APK大小
>使用Proguard进行混淆
>尽量不要使用Multidex(可能会失败)

2 /测试

>使用minSdkVersion 21(我读到从21开始启用pre-dexing,节省时间)
> ???

1 /调试

>使用minSdkVersion 21(我读到从21开始启用pre-dexing,节省时间)
> ???

这是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
        }
    }
最佳答案
基于@Muzikant的提议,我主要同意,我总结了我今天的愿景

>如果可以的话,尽量不要使用MultiDex.

>它可能碰巧达到65K数,方法的开销带来了测试库(所以使用MutliDex)
>可能会发生MultiDex比Proguard进程(要检查)更快,因此调试可能会很有趣

>尝试使用最接近发布APK的APK进行测试

我的建议是:

>因为有3个构建案例,只需制作3个buildTypes:

>发布
>调试
>验证(测试是保留字)

>使用2种口味:

>一个用你的应用程序的minSdkVersion发布
>和一个用于开发,使用更新的minSdkVersion(更快的建筑,更多的功能测试,更容易使用浓缩咖啡……)

>不要混淆调试
>在测试阶段使用Proguard时,Gradle DSL的特定关键字是必需的testProguardFile(‘proguard-rules-test.pro’)
>使用testBuildType =“validation”指出将用于调试的构建
>对模糊进行测试(至少对于CI系统上的UI系统和功能测试)
>使用优化Proguard规则仅发布getDefaultProguardFile(‘proguard-android-optimize.txt’),进行测试和调试只需使用getDefaultProguardFile(‘proguard-android.txt’)

我的Proguard文件的架构如下:

>一个用于发布proguard-rules-release.pro的主文件,其中包含一组专用的Proguard文件,包括-include proguard-rules-fabric.pro
>调试proguard-rules-debug.pro的一秒文件,包括proguard-rules-release.pro
>调试proguard-rules-dontobfuscate.pro的三分之一文件
禁用混淆
>第四个用于测试proguard-rules-test.pro的文件,其中包括proguard-rules-debug.pro和测试所需的规则

这是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')
        }
    }
...
}

我还有一些要点可以解决的问题:

>如何使用Android Studio的自动调试签名进行验证构建? (但我不确定影响)
>我还需要在验证BuildType中添加proguardFiles属性,同时我有包含调试的testProguardFile(‘proguard-rules-test.pro’)!

转载注明原文:android – 处理Proguard,MultiDex,测试和产品口味时的好策略是什么? - 代码日志