Proguard - 排除图书馆

时间:2016-07-04 21:25:47

标签: android proguard

出于测试目的,我的应用中有一些开发人员设置。我有时会包含一个视图库,并尝试最好/最快的方法。即图像加载程序库,如picasso / glide / ion ...

我有一个变量,说明要使用哪个图像加载器。用户无法改变,所以我想跟随:

  • 我不想从我的项目中删除库(或者注释包括out和所有类),也许明天我有一些新东西要测试,我不想再次包含库并编写额外的代码再次
  • 我希望我的发布版本能够完全排除未使用的导入库

我认为这可以通过proguard,有人可以告诉我这是如何工作的,例如基于我发布的3个图像库?或者这对proguard来说不可能吗?

修改

我也对替代解决方案持开放态度,例如c ++ #ifdef左右(我认为这在java中是不可能的)。或者一些预处理器解决方案,可能是通过插件?

1 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

为每个加载lib的图像定义build.gradle中的属性

project.ext {
   picassoEnabled = true
   glideEnabled   = false
   ...
}

然后在buildType配置中,您可以有选择地添加保留相关库的其他规则:

buildTypes {
  release {
    proguardFile getDefaultProguardFile('proguard-android.txt')
    proguardFile 'proguard-project.txt'
    if (project.picassoEnabled) {
      proguardFile 'proguard-picasso.txt'
    }
    if (project.glideEnabled) {
      proguardFile 'proguard-glide.txt'
    }
  }
}

在库的每个proguard配置文件中,您将拥有保留库的规则:

-keep class com.squareup.picasso.** { *; }

现在重要的部分是不要从应用程序中明确引用每个库,而是使用反射,这样ProGuard默认会删除所有库(明确保存的库除外)。