使用Proguard获取警告(使用外部库)

时间:2016-03-15 12:09:02

标签: android proguard

我启用了Proguard,并且我正在尝试构建APK,并且我收到了很多警告,并且不知道如何解决它们。

我使用Retrofit,Jsoup和其他股票库,我收到以下警告:

 Warning:okio.DeflaterSink: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
 Warning:okio.Okio: can't find referenced class java.nio.file.Files
 Warning:okio.Okio: can't find referenced class java.nio.file.Path
 Warning:okio.Okio: can't find referenced class java.nio.file.OpenOption
 Warning:okio.Okio: can't find referenced class java.nio.file.Path
 Warning:okio.Okio: can't find referenced class java.nio.file.OpenOption
 Warning:okio.Okio: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
 Warning:okio.Okio: can't find referenced class java.nio.file.Path
 Warning:okio.Okio: can't find referenced class java.nio.file.OpenOption
 Warning:okio.Okio: can't find referenced class java.nio.file.Path
 Warning:okio.Okio: can't find referenced class java.nio.file.OpenOption
 Warning:okio.Okio: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
 Warning:retrofit2.Platform$Java8: can't find referenced method 'boolean isDefault()' in library class java.lang.reflect.Method
 Warning:retrofit2.Platform$Java8: can't find referenced class java.lang.invoke.MethodHandles$Lookup
 Warning:retrofit2.Platform$Java8: can't find referenced class java.lang.invoke.MethodHandle
 Warning:retrofit2.Platform$Java8: can't find referenced class java.lang.invoke.MethodHandles
 Warning:retrofit2.Platform$Java8: can't find referenced class java.lang.invoke.MethodHandle
 Warning:retrofit2.Platform$Java8: can't find referenced class java.lang.invoke.MethodHandles$Lookup
 Warning:retrofit2.Platform$Java8: can't find referenced class org.codehaus.mojo.animal_sniffer.IgnoreJRERequirement
 Note: the configuration keeps the entry point 'android.support.v7.widget.FitWindowsLinearLayout { void setOnFitSystemWindowsListener(android.support.v7.widget.FitWindowsViewGroup$OnFitSystemWindowsListener); }', but not the descriptor class 'android.support.v7.widget.FitWindowsViewGroup$OnFitSystemWindowsListener'
 Note: the configuration keeps the entry point 'android.support.v7.widget.RecyclerView { void setAccessibilityDelegateCompat(android.support.v7.widget.RecyclerViewAccessibilityDelegate); }', but not the descriptor class 'android.support.v7.widget.RecyclerViewAccessibilityDelegate'
 Note: the configuration keeps the entry point 'android.support.v7.widget.RecyclerView { void setAdapter(android.support.v7.widget.RecyclerView$Adapter); }', but not the descriptor class 'android.support.v7.widget.RecyclerView$Adapter'
 Note: the configuration keeps the entry point 'android.support.v7.widget.RecyclerView { void setRecyclerListener(android.support.v7.widget.RecyclerView$RecyclerListener); }', but not the descriptor class 'android.support.v7.widget.RecyclerView$RecyclerListener'
 Note: the configuration keeps the entry point 'android.support.v7.widget.RecyclerView { void setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager); }', but not the descriptor class 'android.support.v7.widget.RecyclerView$LayoutManager'
 Note: the configuration keeps the entry point 'android.support.v7.widget.RecyclerView { void setRecycledViewPool(android.support.v7.widget.RecyclerView$RecycledViewPool); }', but not the descriptor class 'android.support.v7.widget.RecyclerView$RecycledViewPool'
 Note: the configuration keeps the entry point 'android.support.v7.widget.RecyclerView { void setViewCacheExtension(android.support.v7.widget.RecyclerView$ViewCacheExtension); }', but not the descriptor class 'android.support.v7.widget.RecyclerView$ViewCacheExtension'
 Warning:there were 22 unresolved references to classes or interfaces.
 Warning:there were 1 unresolved references to library class members.
 Warning:Exception while processing task java.io.IOException: Please correct the above warnings first.

这是我的计划:

 -keep class * implements android.os.Parcelable {
   public static final android.os.Parcelable$Creator *;
 }

 ##---------------Begin: proguard configuration for Gson  ----------
 # Gson uses generic type information stored in a class file when working with fields. Proguard
 # removes such information by default, so configure it to keep all of it.
 -keepattributes Signature


 # Gson specific classes
 -keep class com.abohani.tdroms.SharedPreferencesTools { *; }
 #-keep class com.google.gson.stream.** { *; }


 # Application classes that will be serialized/deserialized over Gson
 -keep class com.abohani.tdroms.** { *; }

2 个答案:

答案 0 :(得分:120)

使用ProGuard时,您必须始终解决所有警告

这些警告告诉您库引用了一些代码,并且没有相关的源。这可能也可能不会。这取决于是否有问题的代码被调用。

在这种情况下,可以忽略对Okio和Retrofit2的警告。程序包java.nio.*在Android上不可用,永远不会被调用。您可以放心地忽略这些警告。此外,不会使用Java 8类。

将此添加到您的ProGuard配置中,它应该可以解决您的问题:

-dontwarn okio.**
-dontwarn retrofit2.Platform$Java8

答案 1 :(得分:1)

Retrofit页面已经注意到了proguard构建:

  

平台在Android上不存在的类型上调用Class.forName来确定平台。

     

-dontnote retrofit2.Platform

     

在Java 8 VM上运行时使用的平台。不会在运行时使用。

     

-dontwarn retrofit2.Platform $ Java8

     

保留通用类型信息以供转换器和适配器反射使用。

     

-keepattributes签名

     

保留声明的已检查异常以供Proxy实例使用。

     

-keepattributes Exceptions

在此处查看:http://square.github.io/retrofit/