Gradle 3.0.0 的 Proguard 问题

Posted

技术标签:

【中文标题】Gradle 3.0.0 的 Proguard 问题【英文标题】:Proguard issues with Gradle 3.0.0 【发布时间】:2018-04-21 03:06:56 【问题描述】:

我正在尝试使用 ProGuard 和新的 Gradle 3.0.0 版本创建一个 APK。我收到了很多关于我认为我在 ProGuard 配置文件中忽略的类的警告。相同的配置适用于 Gradle 2.3.3,但似乎在 3.0.0 上中断。警告太多了,几乎根本没有读取 ProGuard 配置。

我的 build.gradle

buildscript 
    repositories 
        mavenCentral()
        jcenter()
        google()
    
    dependencies 
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'com.google.gms:google-services:3.0.0'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.2'


    




allprojects 
    repositories 
        jcenter()
        maven 
            url 'https://jitpack.io'
        
        maven 
            url 'https://maven.google.com'
        

    

android
 buildTypes 
        release 
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
            signingConfig signingConfigs.release
            lintOptions 
                disable 'MissingTranslation'
            

        




compileSdkVersion 27
buildToolsVersion "27.0.1"
defaultConfig 
minSdkVersion 16
targetSdkVersion 27
testInstrumentationRunner 
"android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true


Proguard 警告如下。

    Warning: library class android.animation.FloatArrayEvaluator extends or implements program class android.animation.TypeEvaluator
    Warning: library class android.animation.IntArrayEvaluator extends or implements program class android.animation.TypeEvaluator
    Warning: library class android.animation.PointFEvaluator extends or implements program class android.animation.TypeEvaluator
    Warning: library class android.animation.RectEvaluator extends or implements program class android.animation.TypeEvaluator
    Warning: library class android.app.ActivityManager$TaskDescription extends or implements program class android.os.Parcelable
    Warning: library class android.app.AlarmManager$AlarmClockInfo extends or implements program class android.os.Parcelable
    Warning: library class android.app.AuthenticationRequiredException extends or implements program class android.os.Parcelable
    Warning: library class android.app.AutomaticZenRule extends or implements program class android.os.Parcelable
    Warning: library class android.app.Notification$Action extends or implements program class android.os.Parcelable
    Warning: library class android.app.Notification$DecoratedCustomViewStyle extends or implements program class android.app.Notification$Style
    Warning: library class android.app.Notification$MediaStyle extends or implements program class android.app.Notification$Style
    Warning: library class android.app.Notification$MessagingStyle extends or implements program class android.app.Notification$Style
    Warning: library class android.app.NotificationChannel extends or implements program class android.os.Parcelable
    Warning: library class android.app.NotificationChannelGroup extends or implements program class android.os.Parcelable
    Warning: library class android.app.NotificationManager$Policy extends or implements program class android.os.Parcelable
    Warning: library class android.app.PictureInPictureParams extends or implements program class android.os.Parcelable
    Warning: library class android.app.Presentation extends or implements program class android.app.Dialog
    Warning: library class android.app.RemoteAction extends or implements program class android.os.Parcelable
    Warning: library class android.app.RemoteInput extends or implements program class android.os.Parcelable
    Warning: library class android.app.VoiceInteractor$PickOptionRequest$Option extends or implements program class android.os.Parcelable
    Warning: library class android.app.VoiceInteractor$Prompt extends or implements program class android.os.Parcelable
    Warning: library class android.app.WallpaperColors extends or implements program class android.os.Parcelable
    Warning: library class android.app.admin.ConnectEvent extends or implements program class android.os.Parcelable
    Warning: library class android.app.admin.DeviceAdminService extends or implements program class android.app.Service
    Warning: library class android.app.admin.DnsEvent extends or implements program class android.os.Parcelable
    Warning: library class android.app.admin.NetworkEvent extends or implements program class android.os.Parcelable
    Warning: library class android.app.admin.SecurityLog$SecurityEvent extends or implements program class android.os.Parcelable
    Warning: library class android.app.admin.SystemUpdateInfo extends or implements program class android.os.Parcelable
    Warning: library class android.app.admin.SystemUpdatePolicy extends or implements program class android.os.Parcelable
    Warning: library class android.app.assist.AssistContent extends or implements program class android.os.Parcelable
    Warning: library class android.app.assist.AssistStructure extends or implements program class android.os.Parcelable
    Warning: library class android.app.job.JobInfo extends or implements program class android.os.Parcelable

    Warning: library class android.util.FloatProperty extends or implements program class android.util.Property
    Warning: library class android.util.IntProperty extends or implements program class android.util.Property
    Warning: library class android.view.ActionMode$Callback2 extends or implements program class android.view.ActionMode$Callback
    Warning: library class android.view.Display$HdrCapabilities extends or implements program class android.os.Parcelable
    Warning: library class android.view.Display$Mode extends or implements program class android.os.Parcelable
    Warning: library class android.view.DragAndDropPermissions extends or implements program class android.os.Parcelable
    Warning: library class android.view.KeyboardShortcutGroup extends or implements program class android.os.Parcelable
    Warning: library class android.view.KeyboardShortcutInfo extends or implements program class android.os.Parcelable
    Warning: library class android.view.PointerIcon extends or implements program class android.os.Parcelable
    Warning: library class android.view.WindowAnimationFrameStats extends or implements program class android.os.Parcelable
    Warning: library class android.view.WindowContentFrameStats extends or implements program class android.os.Parcelable
    Warning: library class android.view.WindowId extends or implements program class android.os.Parcelable
    Warning: library class android.view.accessibility.AccessibilityWindowInfo extends or implements program class android.os.Parcelable
    Warning: library class android.view.animation.BaseInterpolator extends or implements program class android.view.animation.Interpolator
    Warning: library class android.view.autofill.AutofillId extends or implements program class android.os.Parcelable
    Warning: library class android.view.autofill.AutofillValue extends or implements program class android.os.Parcelable
    Warning: library class android.view.inputmethod.CursorAnchorInfo extends or implements program class android.os.Parcelable
    Warning: library class android.view.inputmethod.InputContentInfo extends or implements program class android.os.Parcelable
    Warning: library class android.widget.ActionMenuView extends or implements program class android.widget.LinearLayout
    Warning: library class android.widget.ActionMenuView$LayoutParams extends or implements program class android.widget.LinearLayout$LayoutParams

    Warning: library class android.app.RemoteInput depends on program class android.content.Intent
    Warning: library class android.app.RemoteInput depends on program class android.os.Bundle
    Warning: library class android.app.RemoteInput depends on program class android.content.Intent
    Warning: library class android.app.RemoteInput depends on program class android.os.Parcel
    Warning: library class android.app.RemoteInput$Builder depends on program class android.os.Bundle
    Warning: library class android.app.RemoteInput$Builder depends on program class android.os.Bundle
    Warning: library class android.app.SharedElementCallback depends on program class android.view.View
    Warning: library class android.app.SharedElementCallback depends on program class android.graphics.Matrix
    Warning: library class android.app.SharedElementCallback depends on program class android.graphics.RectF
    Warning: library class android.app.SharedElementCallback depends on program class android.os.Parcelable
    Warning: library class android.app.SharedElementCallback depends on program class android.content.Context

    Warning: library class android.media.session.MediaController$TransportControls depends on program class android.net.Uri
    Warning: library class android.media.session.MediaController$TransportControls depends on program class android.os.Bundle
    Warning: library class android.media.session.MediaController$TransportControls depends on program class android.os.Bundle
    Warning: library class android.media.session.MediaController$TransportControls depends on program class android.os.Bundle
    Warning: library class android.media.session.MediaSession depends on program class android.content.Context
    Warning: library class android.media.session.MediaSession depends on program class android.os.Handler
    Warning: library class android.media.session.MediaSession depends on program class android.app.PendingIntent
    Warning: library class android.media.session.MediaSession depends on program class android.app.PendingIntent
    Warning: library class android.media.session.MediaSession depends on program class android.os.Bundle
    Warning: library class android.media.session.MediaSession depends on program class android.os.Bundle
    Warning: library class android.media.session.MediaSession$Callback depends on program class android.os.Bundle
    Warning: library class android.media.session.MediaSession$Callback depends on program class android.os.ResultReceiver
    Warning: library class android.media.session.MediaSession$Callback depends on program class android.content.Intent
    Warning: library class android.media.session.MediaSession$Callback depends on program class android.os.Bundle
    Warning: library class android.media.session.MediaSession$Callback depends on program class android.os.Bundle
    Warning: library class android.media.session.MediaSession$Callback depends on program class android.net.Uri
    Warning: library class android.media.session.MediaSession$Callback depends on program class android.os.Bundle
    Warning: library class android.media.session.MediaSession$Callback depends on program class android.os.Bundle
    Warning: library class android.media.session.MediaSession$Callback depends on program class android.os.Bundle
    Warning: library class android.media.session.MediaSession$Callback depends on program class android.net.Uri
    Warning: library class android.media.session.MediaSession$Callback depends on program class android.os.Bundle
    Warning: library class android.media.session.MediaSession$Callback depends on program class android.os.Bundle
    Warning: library class android.media.session.MediaSession$QueueItem depends on program class android.os.Parcelable$Creator
    Warning: library class android.media.session.MediaSession$QueueItem depends on program class android.os.Parcel
    Warning: library class android.media.session.MediaSession$Token depends on program class android.os.Parcelable$Creator
    Warning: library class android.media.session.MediaSession$Token depends on program class android.os.Parcel
    Warning: library class android.media.session.PlaybackState depends on program class android.os.Parcelable$Creator
    Warning: library class android.media.session.PlaybackState depends on program class android.os.Parcel
    Warning: library class android.media.session.PlaybackState depends on program class android.os.Bundle
    Warning: library class android.media.session.PlaybackState$Builder depends on program class android.os.Bundle
    Warning: library class android.media.session.PlaybackState$CustomAction depends on program class android.os.Parcelable$Creator
    Warning: library class android.media.session.PlaybackState$CustomAction depends on program class android.os.Parcel
    Warning: library class android.media.session.PlaybackState$CustomAction depends on program class android.os.Bundle
    Warning: library class android.media.session.PlaybackState$CustomAction$Builder depends on program class android.os.Bundle
    Warning: library class android.net.Network depends on program class android.os.Parcelable$Creator
    Warning: library class android.net.Network depends on program class android.os.Parcel
    Warning: library class android.os.LocaleList depends on program class android.os.Parcelable$Creator
    Warning: library class android.os.LocaleList depends on program class android.os.Parcel
    Warning: library class android.os.PersistableBundle depends on program class android.os.Parcelable$Creator
    Warning: library class android.os.PersistableBundle depends on program class android.os.Parcel
    Warning: library class android.os.UserManager depends on program class android.os.Bundle
    Warning: library class android.os.UserManager depends on program class android.os.Bundle
    Warning: library class android.provider.DocumentsContract depends on program class android.net.Uri

    Warning: library class android.provider.DocumentsContract depends on program class android.net.Uri
    Warning: library class android.provider.DocumentsContract depends on program class android.net.Uri
    Warning: library class android.provider.DocumentsContract depends on program class android.content.Context
    Warning: library class android.provider.DocumentsContract depends on program class android.net.Uri
    Warning: library class android.provider.DocumentsContract depends on program class android.net.Uri
    Warning: library class android.provider.DocumentsContract depends on program class android.net.Uri
    Warning: library class android.provider.DocumentsContract depends on program class android.net.Uri
    Warning: library class android.provider.DocumentsContract depends on program class android.net.Uri
    Warning: library class android.provider.DocumentsContract depends on program class android.net.Uri
    Warning: library class android.provider.DocumentsContract depends on program class android.content.ContentResolver
    Warning: library class android.provider.DocumentsContract depends on program class android.net.Uri
    Warning: library class android.provider.DocumentsContract depends on program class android.graphics.Point
    Warning: library class android.provider.DocumentsContract depends on program class android.os.CancellationSignal
    Warning: library class android.provider.DocumentsContract depends on program class android.graphics.Bitmap
    Warning: library class android.provider.DocumentsContract depends on program class android.content.ContentResolver
    Warning: library class android.provider.DocumentsContract depends on program class android.net.Uri
    Warning: library class android.provider.DocumentsContract depends on program class android.net.Uri
    Warning: library class android.provider.DocumentsContract depends on program class android.content.ContentResolver
    Warning: library class android.provider.DocumentsContract depends on program class android.net.Uri
    Warning: library class android.provider.DocumentsContract depends on program class android.net.Uri
    Warning: library class android.provider.DocumentsContract depends on program class android.content.ContentResolver
    Warning: library class android.provider.DocumentsContract depends on program class android.net.Uri
    Warning: library class android.provider.DocumentsContract depends on program class android.content.ContentResolver

    Warning: library class android.security.KeyPairGeneratorSpec depends on program class android.content.Context
    Warning: library class android.security.KeyPairGeneratorSpec$Builder depends on program class android.content.Context
    Warning: library class android.service.media.MediaBrowserService depends on program class android.content.Intent
    Warning: library class android.service.media.MediaBrowserService depends on program class android.os.IBinder
    Warning: library class android.service.media.MediaBrowserService depends on program class android.os.Bundle
    Warning: library class android.service.media.MediaBrowserService depends on program class android.os.Bundle
    Warning: library class android.service.media.MediaBrowserService depends on program class android.os.Bundle
    Warning: library class android.service.media.MediaBrowserService depends on program class android.os.Bundle
    Warning: library class android.service.media.MediaBrowserService$BrowserRoot depends on program class android.os.Bundle
    Warning: library class android.service.media.MediaBrowserService$BrowserRoot depends on program class android.os.Bundle

    Warning: library class android.widget.Toolbar depends on program class android.util.AttributeSet
    Warning: library class android.widget.Toolbar depends on program class android.graphics.drawable.Drawable
    Warning: library class android.widget.Toolbar depends on program class android.graphics.drawable.Drawable
    Warning: library class android.widget.Toolbar depends on program class android.content.Context
    Warning: library class android.widget.Toolbar depends on program class android.content.Context
    Warning: library class android.widget.Toolbar depends on program class android.graphics.drawable.Drawable
    Warning: library class android.widget.Toolbar depends on program class android.graphics.drawable.Drawable
    Warning: library class android.widget.Toolbar depends on program class android.view.View$OnClickListener
    Warning: library class android.widget.Toolbar depends on program class android.view.Menu
    Warning: library class android.widget.Toolbar depends on program class android.graphics.drawable.Drawable
    Warning: library class android.widget.Toolbar depends on program class android.graphics.drawable.Drawable
    Warning: library class android.widget.Toolbar depends on program class android.os.Parcelable
    Warning: library class android.widget.Toolbar depends on program class android.os.Parcelable
    Warning: library class android.widget.Toolbar depends on program class android.view.MotionEvent
    Warning: library class android.widget.Toolbar depends on program class android.util.AttributeSet
    Warning: library class android.widget.Toolbar depends on program class android.view.ViewGroup$LayoutParams
    Warning: library class android.widget.Toolbar depends on program class android.view.ViewGroup$LayoutParams
    Warning: library class android.widget.Toolbar depends on program class android.view.ViewGroup$LayoutParams
    Warning: library class android.widget.Toolbar depends on program class android.view.ViewGroup$LayoutParams
    Warning: library class android.widget.Toolbar depends on program class android.view.ViewGroup$LayoutParams
    Warning: library class android.widget.Toolbar depends on program class android.util.AttributeSet
    Warning: library class android.widget.Toolbar depends on program class android.view.ViewGroup$LayoutParams

    Note: there were 15 references to unknown classes.
          You should check your configuration for typos.
          (http://proguard.sourceforge.net/manual/troubleshooting.html#unknownclass)
    Note: there were 21 unresolved dynamic references to classes or interfaces.
          You should check if you need to specify additional program jars.
          (http://proguard.sourceforge.net/manual/troubleshooting.html#dynamicalclass)

    Warning: there were 928 instances of library classes depending on program classes.
             You must avoid such dependencies since the program classes will be processed, while the library classes will remain unchanged.
             (http://proguard.sourceforge.net/manual/troubleshooting.html#dependency)
    Warning: there were 53 unresolved references to program class members.
             Your input classes appear to be inconsistent.
             You may need to recompile the code.
             (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedprogramclassmember)

    Warning: Exception while processing task java.io.IOException: Please correct the above warnings first.
    :transformClassesAndResourcesWithProguardForCouchdbRelease FAILED

    FAILURE: Build failed with an exception.

    * What went wrong:
    Execution failed for task ':transformClassesAndResourcesWithProguardForCouchdbRelease'.
    > Job failed, see logs for details

【问题讨论】:

你必须自己在proguard-rules.pro写proguard规则。 我也有同样的问题。由于某种原因,apk 包含来自 android.jar 的所有类以及存根方法。如果我将-dontwarn android.** 添加到我的proguard-rules.pro 文件中,则会构建apk。当我运行它时,我得到java.lang.RuntimeException: Stub! at android.content.g.<init>(Unknown Source) ... 我也有同样的问题。 APK 在 2.3.3 上成功构建。有更新吗? 我也有同样的问题,请问有更新吗? 在运行发布版本时遇到同样的情况,有没有人找到解决方案?似乎 proguard 根本没有被执行。或者可能是结构的变化? 【参考方案1】:

我已经升级到 gradle 3.0.1 并且大部分警告都消失了。如果您仍在使用 3.0.0,请在您的 proguard 文件中使用它

-dontwarn android.**

不理想,但可以正常工作。

【讨论】:

【参考方案2】:

我遇到了同样的问题,虽然我的情况有点独特,但这是我的解决方案:

升级到新的 3.0.1 版本 (com.android.tools.build:gradle:3.0.1) 后,我看到的警告变少了(最初我有 >3000 个警告)。 我的问题的根源是我使用了一个依赖于整个android框架的库(这个:https://github.com/tony19/logback-android,问题#73)。

我还查看了依赖项 (./gradlew app:dependenices),因为我有依赖于旧 apache http 客户端的库,这也会导致一些警告。我也必须消除它们。

【讨论】:

【参考方案3】:

它可以帮助你 Enabling ProGuard for local library modules no longer affects the library's code. Instead, you should run ProGuard on the app module that consumes the library. https://developer.android.com/studio/build/gradle-plugin-3-0-0-migration.html

【讨论】:

您能否至少通过一个示例来详细说明您的答案?几乎没有网址的答案是没有用的。

以上是关于Gradle 3.0.0 的 Proguard 问题的主要内容,如果未能解决你的问题,请参考以下文章

定义了 Gradle 混乱 id 的 Proguard

AndroidStudio 2.2 构建 gradle 错误(自定义 proguard 文件的路径)

Android Build 使用 Proguard 和 Gradle 失败

构建 Gradle + Proguard + APKLib

Android - 如何消除这些 gradle/proguard 警告?

Android build.gradle 中的 proguard-android-optimize.txt 与 proguard-android.txt