Android Studio 中带有 Proguard 的 Google Play 服务

Posted

技术标签:

【中文标题】Android Studio 中带有 Proguard 的 Google Play 服务【英文标题】:Google Play Services with Proguard in Android Studio 【发布时间】:2013-05-31 16:13:48 【问题描述】:

我最近从 Eclipse 转到了 android Studios。我的应用程序通过 eclipse 使用 Proguard,现在我已经移动了,我遇到了以下错误。

错误:

ProGuard: [myApp] Warning: com.google.android.gms.auth.GoogleAuthUtil: can't find referenced field 'int auth_client_availability_notification_title' in class com.google.android.gms.R$string
ProGuard: [myApp] Warning: com.google.android.gms.auth.GoogleAuthUtil: can't find referenced field 'int auth_client_play_services_err_notification_msg' in class com.google.android.gms.R$string
ProGuard: [myApp] Warning: com.google.android.gms.auth.GoogleAuthUtil: can't find referenced field 'int auth_client_requested_by_msg' in class com.google.android.gms.R$string
ProGuard: [myApp] Warning: com.squareup.picasso.OkHttpLoader: can't find referenced class com.squareup.okhttp.OkHttpClient
ProGuard: [myApp] Warning: com.squareup.picasso.OkHttpLoader: can't find referenced class com.squareup.okhttp.HttpResponseCache
ProGuard: [myApp]       You should check if you need to specify additional program jars.
ProGuard: [myApp] Warning: there were 9 unresolved references to classes or interfaces.
ProGuard: [myApp]          You may need to specify additional library jars (using '-libraryjars').
ProGuard: [myApp] Warning: there were 3 unresolved references to program class members.
ProGuard: [myApp]          Your input classes appear to be inconsistent.
ProGuard: [myApp]          You may need to recompile them and try again.
ProGuard: [myApp]          Alternatively, you may have to specify the option 
ProGuard: [myApp]          '-dontskipnonpubliclibraryclassmembers'.
ProGuard: [myApp] java.io.IOException: Please correct the above warnings first.
ProGuard: [myApp]   at proguard.Initializer.execute(Initializer.java:321)
ProGuard: [myApp]   at proguard.ProGuard.initialize(ProGuard.java:211)
ProGuard: [myApp]   at proguard.ProGuard.execute(ProGuard.java:86)
ProGuard: [myApp]   at proguard.ProGuard.main(ProGuard.java:492)

Proguard 文件:

# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
-dontshrink

# If you want to enable optimization, you should include the
# following:
# -optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
# -optimizationpasses 5
# -allowaccessmodification
#
# Note that you cannot just include these flags in your own
# configuration file; if you are including this file, optimization
# will be turned off. You'll need to either edit this file, or
# duplicate the contents of this file and remove the include of this
# file from your project's proguard.config path property.

-keepattributes *Annotation*
-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgent
-keep public class * extends android.preference.Preference
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.app.Fragment
-keep public class com.android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * 
        native <methods>;


-keep public class * extends android.view.View 
        public <init>(android.content.Context);
        public <init>(android.content.Context, android.util.AttributeSet);
        public <init>(android.content.Context, android.util.AttributeSet, int);
        public void set*(...);


-keepclasseswithmembers class * 
        public <init>(android.content.Context, android.util.AttributeSet);


-keepclasseswithmembers class * 
        public <init>(android.content.Context, android.util.AttributeSet, int);


-keepclassmembers class * extends android.app.Activity 
     public void *(android.view.View);


# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * 
        public static **[] values();
        public static ** valueOf(java.lang.String);


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


-keep class com.google.android.gms.maps.model.LatLng  *; 

-keepclassmembers class **.R$* 
        public static <fields>;


# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.    We know about them, and they are safe.
-dontwarn android.support.**

#Needed by google-api-client to keep generic types and @Key annotations accessed via reflection
-keepclassmembers class * 
    @com.google.api.client.util.Key <fields>;


-keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault,*Annotation*

-dontwarn sun.misc.Unsafe

#ActionBarSherlock
-keep class android.support.v4.app.**  *; 
-keep interface android.support.v4.app.**  *; 
-keep class com.actionbarsherlock.**  *; 
-keep interface com.actionbarsherlock.**  *; 

-keepattributes *Annotation*

#My android stuff
-keep class javax.annotation.Nullable
-keep class org.apache.http.**  *; 
-dontwarn org.apache.http.**

#PDF stuff
-keep class net.sf.andpdf.crypto.**  *; 
-dontwarn net.sf.andpdf.crypto.**

#Google Analytics
-keep public class com.google.** *;

#Otto
-keepclassmembers class ** 
        @com.squareup.otto.Subscribe public *;
        @com.squareup.otto.Produce public *;


#Google Play service
-keep class * extends java.util.ListResourceBundle 
        protected Object[][] getContents();


#Hockey
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

-keep public class javax.net.ssl.**
-keepclassmembers public class javax.net.ssl.** 
    *;


-keep public class org.apache.http.**
-keepclassmembers public class org.apache.http.** 
    *;


-keepclassmembers class net.hockeyapp.android.UpdateFragment  
    *;


#Butter Knife
-dontwarn butterknife.Views$InjectViewProcessor
-keepclassmembers class **$$ViewInjector *;

【问题讨论】:

类似:***.com/questions/18646899/… 【参考方案1】:

对于“Picasso”库,您只需将其添加到您的 ProGuard 配置中:

-dontwarn com.squareup.okhttp.**

这是因为“毕加索”有一个名为“OkHttp”的可选库。这不包括在内,但也不需要。

对于 Google Play 服务,似乎与库有些不一致。您应该更新您的库文件并清理项目。

【讨论】:

库是做什么用的?希望它不会导致任何 ClassNotFoundExceptions OkHttp 是另一种 HTTP 客户端,可以代替 Android 或 Java 的内置客户端。所以你绝对不需要它,它不会导致任何ClassNotFoundExceptions。我也在使用没有 OkHttp 的 Picasso。更多关于 OkHttp:corner.squareup.com/2013/05/announcing-okhttp.html【参考方案2】:

我最终输入了以下几行,因此 Proguard 停止警告我。构建仍按预期运行。

-dontwarn com.google.android.gms.auth.GoogleAuthUtil
-dontwarn com.squareup.picasso.OkHttpLoader

【讨论】:

您真的应该接受另一个答案,并且可能添加了有关您添加的额外行的评论。 我个人尝试使用通配符来尽可能少地忽略警告。我同意 Marco W. 的答案是一个很好的答案,我投了赞成票。但是,我的答案中提供了我使用的代码,这就是为什么我接受它作为我的问题的答案。

以上是关于Android Studio 中带有 Proguard 的 Google Play 服务的主要内容,如果未能解决你的问题,请参考以下文章

Android Studio 中带有 imageview 的 listview

Visual Studio 2010 中带有 plsql 的 C# [关闭]

在 Visual Studio 10 中带有库的 PDB 文件

Visual Studio 中带有 ASP.NET Web API 项目的 Angular 项目

Visual Studio 2013 中带有 EF6 的 MySQL 连接器

[Material appbar存在时,Android Studio布局预览不起作用