我希望有人能回答我认为基本的Gradle / Proguard问题。
我有一个非常基本的Android项目。该项目包含名为app
的主应用程序模块,以及名为AndroidSupport
的Android支持库的库模块。
我希望只在AndroidSupport
上运行Proguard(即不在整个应用程序中),因为我在Proguard-ed上运行应用程序上的仪器测试时遇到问题。
我的希望是我可以自己缩小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,而不是在应用程序本身上启用它?
提前致谢!
答案 0 :(得分:0)
您不想保留一些接口 - 库模块的API可见吗?要从您的应用程序模块访问?在这种情况下,您应该将-keep选项添加到库ProGuard中,例如:
-keep,allowshrinking class com.example.androidsupportlibproject.YourClass {
public <methods>;
protected <methods>;
public static <methods>;
public <init>(...);
}
答案 1 :(得分:0)
似乎不可能仅在模块上运行Proguard,而不是在整个应用程序上运行。 每当我尝试这个时,Proguard似乎会从我的APK中删除所有代码,因为它可能无法解析测试apk和测试的apk之间的依赖关系。
解决方案是在整个应用程序上运行Proguard并找出如何运行单元测试。请注意,Proguard配置中的testProguardFile
是指测试apk的配置,而不是测试的apk。
答案 2 :(得分:0)
它可以只用于图书馆模块,而不是Android Studio&#39;中的洞项目。项目。 我正在创建一个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代码会去那里。