【问题标题】:Publicly release Android Library not proguarding correctly公开发布未正确保护的 Android 库
【发布时间】:2016-01-26 01:22:31
【问题描述】:

我在一个公开发布的 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;
}

但是,该库的发布版本也是在内部使用未保护的,所以我需要三种类型的构建:调试、发布和保护发布。

为此,我的库目前有以下 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 构建脚本。谁能告诉我怎么做?

【问题讨论】:

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


    【解决方案1】:

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

    你的 ProGuard 规则中的这个片段只保留 Parcelable 类型的类成员 - 如果你想保留类/成员的命名,你需要添加一个类似的规则:

    -keepnames class * implements android.os.Parcelable

    您是否有理由不希望对这些类型进行混淆处理?

    【讨论】:

    • 该行是从此处link 的 Android 项目的 proguard 手册示例中复制而来的。而且,为了使 parcelable 类工作,proguard-android.txt 文件包含以下内容: -keepclassmembers class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator CREATOR; }
    • 不能对 CREATOR 类成员进行混淆,以便 Parcelable 对象能够在具有不同保护级别的进程之间可靠地打包和分离自身。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多