更新 Android Studio 3.5 获得 proguard 警告

Posted

技术标签:

【中文标题】更新 Android Studio 3.5 获得 proguard 警告【英文标题】:Update Android studio 3.5 getting proguard warnings 【发布时间】:2019-12-30 11:02:56 【问题描述】:

自从我将 android Studio 从 3.4 更新到 3.5 后,我在项目中遇到了错误。错误列表如下,似乎 proguard 文件中缺少规则。

但是一旦我提出这些规则:

-dontnote androidx.**
-dontwarn androidx.**

项目正在无限构建,不会完成。我等了 30-40 分钟,根本没有结果。 (通常项目构建时间为4-5分钟)

Note: there were 6 duplicate class definitions.
      (http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass)
Note: the configuration refers to the unknown class 'com.amazonaws.auth.AWS4Signer'
Warning: androidx.appcompat.widget.ActivityChooserView: can't find referenced method 'void saveAttributeDataForStyleable(android.content.Context,int[],android.util.AttributeSet,android.content.res.TypedArray,int,int)' in program class androidx.appcompat.widget.ActivityChooserView
Warning: androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper: can't find referenced method 'boolean isHorizontallyScrollable()' in library class android.widget.TextView
Warning: androidx.appcompat.widget.AppCompatTextViewAutoSizeHelper: can't find referenced method 'android.text.TextDirectionHeuristic getTextDirectionHeuristic()' in library class android.widget.TextView
Warning: androidx.appcompat.widget.ButtonBarLayout: can't find referenced method 'void saveAttributeDataForStyleable(android.content.Context,int[],android.util.AttributeSet,android.content.res.TypedArray,int,int)' in program class androidx.appcompat.widget.ButtonBarLayout
Warning: androidx.appcompat.widget.DrawableUtils: can't find referenced method 'android.graphics.Insets getOpticalInsets()' in library class android.graphics.drawable.Drawable
Warning: androidx.appcompat.widget.DrawableUtils: can't find referenced class android.graphics.Insets
Warning: androidx.appcompat.widget.DrawableUtils: can't find referenced class android.graphics.Insets
Warning: androidx.appcompat.widget.DrawableUtils: can't find referenced class android.graphics.Insets
Warning: androidx.appcompat.widget.DrawableUtils: can't find referenced class android.graphics.Insets
Warning: androidx.appcompat.widget.DrawableUtils: can't find referenced class android.graphics.Insets
Warning: androidx.appcompat.widget.DrawableUtils: can't find referenced class android.graphics.Insets
Warning: androidx.appcompat.widget.ListPopupWindow: can't find referenced method 'void setEpicenterBounds(android.graphics.Rect)' in library class android.widget.PopupWindow
Warning: androidx.appcompat.widget.ListPopupWindow: can't find referenced method 'void setIsClippedToScreen(boolean)' in library class android.widget.PopupWindow
Warning: androidx.appcompat.widget.MenuPopupWindow: can't find referenced method 'void setTouchModal(boolean)' in library class android.widget.PopupWindow
Warning: androidx.appcompat.widget.SearchView: can't find referenced method 'void refreshAutoCompleteResults()' in program class androidx.appcompat.widget.SearchView$SearchAutoComplete
Warning: androidx.camera.camera2.impl.compat.CameraManagerCompat$AvailabilityCallbackExecutorWrapper$1: can't find referenced method 'void onCameraAccessPrioritiesChanged()' in library class android.hardware.camera2.CameraManager$AvailabilityCallback
Warning: androidx.recyclerview.widget.RecyclerView: can't find referenced method 'void saveAttributeDataForStyleable(android.content.Context,int[],android.util.AttributeSet,android.content.res.TypedArray,int,int)' in program class androidx.recyclerview.widget.RecyclerView
Warning: androidx.viewpager2.widget.ViewPager2: can't find referenced method 'void saveAttributeDataForStyleable(android.content.Context,int[],android.util.AttributeSet,android.content.res.TypedArray,int,int)' in program class androidx.viewpager2.widget.ViewPager2

Warning: there were 6 unresolved references to classes or interfaces.
         You may need to add missing library jars or update their versions.
         If your code works fine without the missing classes, you can suppress
         the warnings with '-dontwarn' options.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedclass)
Warning: there were 5 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: there were 7 unresolved references to library class members.
         You probably need to update the library versions.
         Alternatively, you may have to specify the option 
         '-dontskipnonpubliclibraryclassmembers'.
         (http://proguard.sourceforge.net/manual/troubleshooting.html#unresolvedlibraryclassmember)

这些是保护规则:

# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in <android sdk path>/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the proguardFiles
# directive in build.gradle.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

# Add any project specific keep options here:

# If your project uses WebView with JS, uncomment the following
# and specify the fully qualified class name to the javascript interface
# class:
#-keepclassmembers class fqcn.of.javascript.interface.for.webview 
#   public *;
#

# Additional config for retaining stacktrace coherence
-dontskipnonpubliclibraryclassmembers
-keepattributes LineNumberTable, SourceFile, Exceptions, RuntimeVisibleAnnotations, AnnotationDefault

# Enums
-keepclassmembers enum *  *; 

# This is for retaining proper names of custom Exceptions
-keep public class * extends java.lang.Exception

# Remove log calls
-assumenosideeffects class android.util.Log 
    public static *** d(...);

-assumenosideeffects class timber.log.Timber 
    public static *** d(...);


# Android
-dontnote android.**
-dontnote com.android.**
## Do not obfuscate but allow shrinking of android-oauth-client
-keepnames class com.wuman.android.auth.**  *; 

# ButterKnife
-keep class butterknife.**  *; 
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder  *; 
-keepclasseswithmembernames class * 
    @butterknife.* <fields>;

-keepclasseswithmembernames class * 
    @butterknife.* <methods>;


# OK
-dontwarn javax.annotation.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
-dontwarn org.codehaus.mojo.animal_sniffer.*
-dontwarn okhttp3.internal.platform.ConscryptPlatform

# Crashlytics
-keep class com.crashlytics.**  *; 
-dontwarn com.crashlytics.**
-dontnote io.fabric.**

# Nucleus (requires default empty constructor, ProGuard removes them)
# https://github.com/konmik/nucleus/issues/126
-keepclassmembers class * extends nucleus5.presenter.Presenter 
    <init>();

-dontwarn nucleus.view.NucleusActionBarActivity
-dontnote nucleus5.**

# Google
-keep class com.google.android.gms.common.api.**  *; 
-dontnote com.google.**
# For using GSON @Expose annotation
-keepattributes *Annotation*

# Firebase
-dontnote com.firebase.**

# Amazon AWS Pinpoint
## Class names are needed in reflection
-keepnames class com.amazonaws.**
-keepclassmembers public class com.amazonaws.auth.AWS4Signer 
   public <init>(...);
## Request handlers defined in request.handlers
-keep class com.amazonaws.services.**.*Handler
## The following are referenced but aren't required to run
-dontwarn com.fasterxml.jackson.**
-dontwarn org.apache.commons.logging.**
## Android 6.0 release removes support for the Apache HTTP client
-dontwarn org.apache.http.**
## The SDK has several references of Apache HTTP client
-dontwarn com.amazonaws.http.**
-dontwarn com.amazonaws.metrics.**
## Spinner indicator
-keep class com.wang.avi.**  *; 
-keep class com.wang.avi.indicators.**  *; 

# Branch.io
-dontwarn com.google.firebase.appindexing.**
-dontwarn com.android.installreferrer.api.**

# Subsampling Scale View
-dontnote com.davemorrissey.**

# RxJava
-dontnote io.reactivex.**

# Realm
-dontnote io.realm.**

# Facebook
-dontnote com.facebook.**

# Dagger
-dontnote dagger.internal.**

# Experimental
-dontwarn **Lambda**

# org.apache.http.legacy (see https://issuetracker.google.com/issues/37070898)
-dontnote android.net.http.*
-dontnote org.apache.commons.codec.**
-dontnote org.apache.http.**

# MapWize
-dontwarn com.mapbox.**
-dontwarn com.unity3d.player.UnityPlayer
-keep class com.navisens.** *;
-keep class org.json.** *;

# ChatKit
-keep class * extends com.stfalcon.chatkit.messages.MessageHolders$OutcomingTextMessageViewHolder 
     public <init>(android.view.View, java.lang.Object);
     public <init>(android.view.View);

-keep class * extends com.stfalcon.chatkit.messages.MessageHolders$IncomingTextMessageViewHolder 
     public <init>(android.view.View, java.lang.Object);
     public <init>(android.view.View);

-keep class * extends com.stfalcon.chatkit.messages.MessageHolders$IncomingImageMessageViewHolder 
     public <init>(android.view.View, java.lang.Object);
     public <init>(android.view.View);

-keep class * extends com.stfalcon.chatkit.messages.MessageHolders$OutcomingImageMessageViewHolder 
     public <init>(android.view.View, java.lang.Object);
     public <init>(android.view.View);


# Twilio
-keep class com.twilio.chat.**  *; 
-keepattributes InnerClasses
#-keep interface com.twilio.chat.**  *; 
#-keep enum com.twilio.chat.**  *; 

## Keep native methods
-keepclasseswithmembernames class com.twilio.chat.** 
    native <methods>;


# Volley
-keep class com.android.volley.**  *;
-dontwarn com.android.volley.**

-keepclassmembers,allowshrinking,allowobfuscation class com.android.volley.NetworkDispatcher 
    void processRequest();

-keepclassmembers,allowshrinking,allowobfuscation class com.android.volley.CacheDispatcher 
    void processRequest();

【问题讨论】:

【参考方案1】:

尝试设置

android 
     compileSDKVersion 29

【讨论】:

您应该尝试解释这有什么帮助以及问题所在。 不知道为什么,但这对我有用,您能解释一下为什么 Sdk 29 有效而 28 无效吗? 之所以有效,是因为 androidx 库太新了,以至于它们引用了在级别 29 中添加的 API。当 proguard 运行时,它会抱怨对它不知道的类的引用,因为这表明你可能是产生一个糟糕的构建。当您使用 andoidx 库针对低于 29 的 API 级别编译项目时,proguard 无法找到所有引用。所以选择是帮助 proguard 用这个答案解决引用,或者告诉 proguard 用 dontwarn 答案保持安静。 @satur9nine 它解决了警告但发布了 apk 崩溃。并且崩溃日志是 android.view.InflateException: Binary XML file line #7: Binary XML file line #6: Error inflating class TextView 有什么线索吗? @GiruBhai 建议您使用完整的堆栈跟踪提出一个新问题。仅凭那一小部分信息不足以诊断。【参考方案2】:

就用这个吧:

-dontwarn androidx.appcompat.widget.**

别忘了删除:

-dontnote androidx.**
-dontwarn androidx.**

【讨论】:

【参考方案3】:

更新 gradle 插件版本

buildscript 
 repositories 

    google()
    jcenter()


dependencies 
    classpath 'com.android.tools.build:gradle:3.5.3'
    classpath 'com.google.gms:google-services:4.3.3'
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files

    

【讨论】:

以上是关于更新 Android Studio 3.5 获得 proguard 警告的主要内容,如果未能解决你的问题,请参考以下文章

安装失败,原因是:'null' - Android Studio 3.5

Android Studio 3.5 重构问题

这个新的 Android studio 3.5 Navigation Drawer 示例代码如何运行

Android Studio 3.5 原因:buildOutput.apkData 不能为空 Clean & Rebuild 已经尝试过

android studio 升级到3.5版本报错gradle无法获取pom文件

Android studio 3.5签名出现异常解决办法