是否可以保护 Android 库模块,但不能保护应用程序模块?

Posted

技术标签:

【中文标题】是否可以保护 Android 库模块,但不能保护应用程序模块?【英文标题】:Is it possible to Proguard an Android library module, but not the application module? 【发布时间】:2015-11-10 14:54:01 【问题描述】:

我希望有人能回答我认为基本的 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,而不在应用程序本身上启用?

提前致谢!

【问题讨论】:

看看这里***.com/questions/27277433/… 【参考方案1】:

可以只保护库模块,而不是“Android Studio”项目中的孔项目。 我正在创建一个 android inapp sdk。在我的项目中,有 lib 和 app 模块,我只成功地混淆了 lib 模块。

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

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

然后在与 build.gradle 相同的目录中,创建 proguard-rules.pro 文件。你的 proguard 代码会放在那里。

【讨论】:

【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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

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

【讨论】:

感谢您的评论。我的库模块只是支持库的容器,不包含额外的应用程序代码。这就是为什么我对-keep class android.support.v4.** *; -keep interface android.support.v4.app.** *; 根本没有保留任何代码感到困惑。

以上是关于是否可以保护 Android 库模块,但不能保护应用程序模块?的主要内容,如果未能解决你的问题,请参考以下文章

简单的密码保护您的 android 应用程序

Android 逆向selinux 进程保护 ( selinux 进程保护 | 宽容模式 Permissive | 强制模式 Enforcing )

Android 逆向selinux 进程保护 ( selinux 进程保护 | 宽容模式 Permissive | 强制模式 Enforcing )

抓取受保护的电子邮件

Android 内容提供商保护级别和不同的密钥

java - 为啥在java中可以具有默认修饰符的类不能受到保护