是否可以使用Proguard Android库模块,而不是应用程序模块?

问题描述 投票:7回答:3

我希望有人可以回答我认为基本的Gradle / Proguard问题。

我有一个非常基本的Android项目。该项目包含名为app的主应用程序模块,以及名为AndroidSupport的Android支持库的库模块。

我希望仅在AndroidSupport上运行Proguard(即不在整个应用程序中),因为我在Proguard编辑时在应用程序上运行仪器测试时遇到问题。我希望我可以自己缩小AndroidSupport,这样我就不需要Proguard我的应用程序代码了(因此,避免测试没有运行的问题)。

这是我的app build.gradle。请注意,Proguard已禁用:

apply plugin: 'com.android.application'
android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"
    defaultConfig {
        applicationId "com.example.androidsupportlibproject"
        minSdkVersion 9
        targetSdkVersion 22
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        debug {
            minifyEnabled false //Proguard DISABLED
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile project(':AndroidSupport')
}

我的AndroidSupport模块已启用Proguard:

apply plugin: 'com.android.library'
android {
    compileSdkVersion 22
    buildToolsVersion "22.0.1"
    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 22
    }
    buildTypes {
        release {
            minifyEnabled true  //Proguard ENABLED
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:support-v4:22.2.0'
    compile 'com.android.support:appcompat-v7:22.2.0'
    compile 'com.android.support:recyclerview-v7:22.2.0'
    compile 'com.android.support:support-annotations:22.2.0'
}

我的AndroidSupport模块proguard-rules.pro看起来像:

-dontobfuscate
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.app.** { *; }

app应用程序启用了Proguard并且AndroidSupport禁用了Proguard时,我可以使用consumerProguardFiles proguard-rules.pro来缩小AndroidSupport。 但是当我使用上面粘贴的配置时,我收到以下错误:

Error:Execution failed for task ':AndroidSupport:proguardRelease'.
java.io.IOException: The output jar is empty. Did you specify the proper '-keep' options?`

有谁知道这个设置是否可行?仅在依赖库模块上启用Proguard,而不是在应用程序本身上启用?

提前致谢!

android debugging gradle proguard android-support-library
3个回答
0
投票

你不想保留一些接口 - 库模块的API可见吗?要从您的应用程序模块访问?在这种情况下,您应该将-keep选项添加到库ProGuard中,例如:

-keep,allowshrinking class com.example.androidsupportlibproject.YourClass {
    public <methods>;
    protected <methods>;
    public static <methods>;
    public <init>(...);
}

0
投票

似乎不可能仅在模块上运行Proguard,而不是在整个应用程序上运行。每当我尝试这个,Proguard似乎从我的APK中删除所有代码,因为它可能无法解决测试apk和测试的apk之间的依赖关系。

解决方案是在整个应用程序上运行Proguard并找出如何运行单元测试。请注意,Proguard配置中的testProguardFile指的是测试apk的配置,而不是测试的apk。


0
投票

它可以只用于库模块,而不是'Android Studio'项目中的洞项目。我正在创建一个android inapp sdk。在我的项目中,有lib和app模块,我只成功地模糊了lib模块。

一些提示:将以下代码添加到lib moduele build.gradle文件中。

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

然后在build.gradle的同一目录下,创建,proguard-rules.pro文件。你的proguard代码将会去那里。

© www.soinside.com 2019 - 2024. All rights reserved.