公开发布Android库无法正确进行

时间:2016-01-26 01:22:31

标签: android gradle android-gradle proguard android-proguard

我在公开发布的Android库上工作。而且,对于外部发布,我需要使用以下选项运行proguard:

-keep public class com.example.package_one.* {
  public protected *;
}

-keep public class com.example.package_one.subpackage_one.* {
  public protected *;
}

-keep public class com.example.package_one.subpackage_two.* {
  public protected *;
}

-keep public class com.example.package_one.subpackage_three.* {
  public protected *;
}

-keep public class com.example.package_one.subpackage_four.* {
  public protected *;
}

-keep public class com.example.package_one.subpackage_four.sub_subpackage_one.* {
  public protected *;
}

-keepclassmembers class * implements android.os.Parcelable {
    static ** CREATOR;
}

但是,该库的发布版本也在内部使用了unproguarded,因此我需要三种类型的构建:debug,release和proguarded release。

为此,我目前为我的库提供了以下build.gradle文件:

buildscript {

    repositories {
        mavenCentral()
    }

    dependencies {
       classpath 'com.android.tools.build:gradle:1.3.1'
    }
}

apply plugin: 'com.android.library'

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 17
        targetSdkVersion 23
    }

    sourceSets {
        main {}

        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }

    buildTypes {
        debug {}
        release {}
        proguarded{
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
            'proguard-rules.pro'
        }
    }
}

dependencies {
}

但是,当我尝试创建proguarded构建时,我保留的所有包都会被保留,但是我所有扩展Parcelable的类,除了我要保留的包中的那些,都会被混淆。

我尝试在我的计算机上的proguard-android.txt文件中添加一个错误,并且构建没有崩溃,所以我知道该文件实际上并未被读取。但是我不知道如何使我的所有扩展Parcelable的类都不会被混淆,除了明确告诉proguard不要混淆每一个。

这个相同的proguard文件曾经用于我的旧Ant构建,所以我的猜测是我在某种程度上弄乱了我的gradle构建脚本。谁能告诉你怎么样?

1 个答案:

答案 0 :(得分:0)

-keepclassmembers class * implements android.os.Parcelable { static ** CREATOR; }

ProGuard规则中的此片段仅保留类成员的Parcelable类型 - 如果要保留类/成员的命名,则需要添加类似于以下内容的规则:

-keepnames class * implements android.os.Parcelable

您是否有理由不希望这些类型被混淆?