收缩库代码

时间:2017-04-10 07:22:58

标签: java android gradle

我想隐藏aar文件中的真实代码。我的图书馆的Gradle文件看起来像这样。

apply plugin: 'com.android.library'

android {
    compileSdkVersion 25
    buildToolsVersion '25.0.2'

    defaultConfig {
        minSdkVersion 16
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:25.3.1'
    compile 'com.android.support:recyclerview-v7:25.3.1'
}

我在运行此应用时遇到异常。

Warning:Exception while processing task java.io.FileNotFoundException: E:\MyProjects\TestApp\testLibrary\build\intermediates\proguard-rules\release\aapt_rules.txt (The system cannot find the path specified)
Error:Execution failed for task ':testLibrary:transformClassesAndResourcesWithProguardForRelease'.
> Job failed, see logs for details

如果我将minifyEnabled true更改为minifyEnabled false,那么此应用程序必定会运行,但我可以看到生成的arr文件中的Java文件。

所以我想隐藏Java代码。

1 个答案:

答案 0 :(得分:0)

对于库,您不应提供proguard-rules.pro,而应提供一些proguard-consumer-rules.pro ...,其中包含将库编译为APK软件包时正在应用的配置规则(与通常的做法相反)行为(在构建库时)。

// These rules will be applied when a consumer of this library sets 'minifyEnabled true'.
consumerProguardFiles 'proguard-consumer-rules.pro'

库不会像这样直接被混淆,而只是在以后-无需库的每个使用者都定义自己的ProGuard规则配置。请参阅我上面链接的问题,它的答案之一是提供了一种基本配置,以保留公共方法(这样,一旦被混淆后,该库仍可以使用该库)。 并查看module-android-library的Android测试模板。

我认为,该AAPT错误源于提供一个空的ProGuard配置文件。