构建发行版时的Android Gradle插件警告APK

时间:2019-03-26 05:07:44

标签: android gradle android-gradle android-proguard

当我尝试从Android Studio构建发行版APK时,我收到以下Android Gradle插件警告:

library class android.content.res.XmlResourceParser extends or implements program class org.xmlpull.v1.XmlPullParser    
library class android.content.Intent depends on program class org.xmlpull.v1.XmlPullParser  
library class android.content.IntentFilter depends on program class org.xmlpull.v1.XmlSerializer    
library class android.content.IntentFilter depends on program class org.xmlpull.v1.XmlPullParser    
library class android.content.res.ColorStateList depends on program class org.xmlpull.v1.XmlPullParser  
library class android.graphics.drawable.AnimatedVectorDrawable depends on program class org.xmlpull.v1.XmlPullParser    
library class android.graphics.drawable.AnimationDrawable depends on program class org.xmlpull.v1.XmlPullParser 
library class android.graphics.drawable.BitmapDrawable depends on program class org.xmlpull.v1.XmlPullParser    
library class android.graphics.drawable.ClipDrawable depends on program class org.xmlpull.v1.XmlPullParser  
library class android.graphics.drawable.ColorDrawable depends on program class org.xmlpull.v1.XmlPullParser 
library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParser  
library class android.graphics.drawable.DrawableWrapper depends on program class org.xmlpull.v1.XmlPullParser   
library class android.graphics.drawable.GradientDrawable depends on program class org.xmlpull.v1.XmlPullParser  
library class android.graphics.drawable.InsetDrawable depends on program class org.xmlpull.v1.XmlPullParser 
library class android.graphics.drawable.LayerDrawable depends on program class org.xmlpull.v1.XmlPullParser 
library class android.graphics.drawable.RippleDrawable depends on program class org.xmlpull.v1.XmlPullParser    
library class android.graphics.drawable.ScaleDrawable depends on program class org.xmlpull.v1.XmlPullParser 
library class android.graphics.drawable.ShapeDrawable depends on program class org.xmlpull.v1.XmlPullParser 
library class android.graphics.drawable.StateListDrawable depends on program class org.xmlpull.v1.XmlPullParser 
library class android.graphics.drawable.VectorDrawable depends on program class org.xmlpull.v1.XmlPullParser    
library class android.util.Xml depends on program class org.xmlpull.v1.XmlPullParser    
library class android.util.Xml depends on program class org.xmlpull.v1.XmlSerializer    
library class android.util.Xml depends on program class org.xmlpull.v1.XmlPullParser    
library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParser 
there were 32 instances of library classes depending on program classes.    
Exception while processing task java.io.IOException: Please correct the above warnings first.   

这是构建错误:

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:transformClassesAndResourcesWithProguardForRelease'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:103)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:73)
    at org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute(OutputDirectoryCreatingTaskExecuter.java:51)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:59)
    at org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute(ResolveTaskOutputCachingStateExecuter.java:54)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:59)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:101)
    at org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute(FinalizeInputFilePropertiesTaskExecuter.java:44)
    at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:91)
    at org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute(ResolveTaskArtifactStateTaskExecuter.java:62)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:59)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:54)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:34)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker$1.run(DefaultTaskGraphExecuter.java:256)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:249)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:238)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.processTask(DefaultTaskPlanExecutor.java:123)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.access$200(DefaultTaskPlanExecutor.java:79)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:104)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker$1.execute(DefaultTaskPlanExecutor.java:98)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.execute(DefaultTaskExecutionPlan.java:663)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.executeWithTask(DefaultTaskExecutionPlan.java:597)
    at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor$TaskExecutorWorker.run(DefaultTaskPlanExecutor.java:98)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
    at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
    at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.RuntimeException: Job failed, see logs for details
    at com.android.build.gradle.internal.transforms.ProGuardTransform.transform(ProGuardTransform.java:207)
    at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:239)
    at com.android.build.gradle.internal.pipeline.TransformTask$2.call(TransformTask.java:235)
    at com.android.builder.profile.ThreadRecorder.record(ThreadRecorder.java:102)
    at com.android.build.gradle.internal.pipeline.TransformTask.transform(TransformTask.java:230)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:73)
    at org.gradle.api.internal.project.taskfactory.IncrementalTaskAction.doExecute(IncrementalTaskAction.java:50)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:39)
    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:26)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$1.run(ExecuteActionsTaskExecuter.java:124)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:336)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:328)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:199)
    at org.gradle.internal.progress.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:110)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:113)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:95)
    ... 33 more
Caused by: java.io.IOException: Please correct the above warnings first.
    at proguard.Initializer.execute(Initializer.java:485)
    at proguard.ProGuard.initialize(ProGuard.java:271)
    at proguard.ProGuard.execute(ProGuard.java:113)
    at com.android.build.gradle.internal.transforms.BaseProguardAction.runProguard(BaseProguardAction.java:64)
    at com.android.build.gradle.internal.transforms.ProGuardTransform.doMinification(ProGuardTransform.java:262)
    at com.android.build.gradle.internal.transforms.ProGuardTransform.access$000(ProGuardTransform.java:65)
    at com.android.build.gradle.internal.transforms.ProGuardTransform$1.run(ProGuardTransform.java:176)
    at com.android.builder.tasks.Job.runTask(Job.java:47)
    at com.android.build.gradle.tasks.SimpleWorkQueue$EmptyThreadContext.runTask(SimpleWorkQueue.java:41)
    at com.android.builder.tasks.WorkQueue.run(WorkQueue.java:282)
    ... 1 more

由于这些错误,我无法创建发行版APK。但是我可以测试我的应用程序,也可以成功创建调试APK。然后,我尝试创建代码的旧版本的发行版APK,该APK当时没有任何问题,但仍然出现相同的错误。

这是我的build.gradle(应用)文件:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "com.cg.lrceditor"
        minSdkVersion 21
        targetSdkVersion 28
        versionCode 24
        versionName "2.2.3"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        vectorDrawables.useSupportLibrary = true
    }
    buildTypes {
        release {
            shrinkResources true
            minifyEnabled true

            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
        debug {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support:design:28.0.0'
    implementation 'com.android.billingclient:billing:1.1'
    testImplementation 'junit:junit:4.12'
    implementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'org.testng:testng:6.9.6'
}

不知道为什么,但是如果将minifyEnabledshrinkResources都设置为false,则可以成功创建发行版APK。但是应用程序的大小不会得到优化。

我尝试使用-dontwarn org.xmlpull.v1.**中的-ignorewarningsproguard-rules.pro忽略警告,并且能够生成发行版APK,但是当我启动该应用程序时,它崩溃了。这是崩溃的相关堆栈跟踪:

2019-03-26 10:46:28.413 19982-19982/? E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.cg.lrceditor, PID: 19982
    java.lang.NoSuchMethodError: No static method asAttributeSet(Lorg/a/a/a;)Landroid/util/AttributeSet; in class Landroid/util/Xml; or its super classes (declaration of 'android.util.Xml' appears in /system/framework/framework.jar:classes2.dex)
        at android.support.v7.view.g.inflate(SupportMenuInflater.java:125)
        at com.cg.lrceditor.HomePage.onCreateOptionsMenu(HomePage.java:294)
        at android.app.Activity.onCreatePanelMenu(Activity.java:3315)
        at android.support.v4.app.h.onCreatePanelMenu(FragmentActivity.java:364)
        at android.support.v7.view.i.onCreatePanelMenu(WindowCallbackWrapper.java:93)
        at android.support.v7.app.f$a.onCreatePanelMenu(AppCompatDelegateImplBase.java:332)
        at android.support.v7.view.i.onCreatePanelMenu(WindowCallbackWrapper.java:93)
        at android.support.v7.app.m$1.run(ToolbarActionBar.java:1454)
        at android.os.Handler.handleCallback(Handler.java:754)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:163)
        at android.app.ActivityThread.main(ActivityThread.java:6238)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:904)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)

HomePage.java:294getMenuInflater().inflate(R.menu.menu_home_page, menu);


如何在启用minifyEnabledshrinkResources的情况下解决这些问题?

2 个答案:

答案 0 :(得分:0)

  

库类android.content.res.XmlResourceParser扩展或实现程序类org.xmlpull.v1.XmlPullParser

     

库类android.content.Intent取决于程序类org.xmlpull.v1.XmlPullParser

     

库类android.content.IntentFilter取决于程序类org.xmlpull.v1.XmlSerializer

如第一个错误所述,软件包org.xmlpull.v1存在一些问题 因此,请不要理会他们。将此规则添加到您的proguard

-keep class org.xmlpull.v1.** { *; }

答案 1 :(得分:0)

您不了解Proguard规则。请检查this链接以了解Proguard规则。

默认情况下,将缩小所有类文件的使用范围。如果您正在使用任何库,则有责任通过在proguard规则文件中提及这些类来保留这些类。

在proguard文件中尝试此行

-dontwarn org.xmlpull.v1.**