【问题标题】:How to configure proguard for Android application using Google Drive SDK?如何使用 Google Drive SDK 为 Android 应用程序配置 proguard?
【发布时间】:2013-04-26 06:05:29
【问题描述】:

当 Eclipse 在构建 Quickstart: Run a Drive App on Android 示例应用程序时包含 proguard 时,应用程序将失去上传文件的能力。

Google API 客户端 ID 似乎已正确配置,因为在没有 proguard 的情况下构建应用程序的发布版本时可以正常工作。但是,当在启用了 proguard 的 Eclipse 中构建时,相同的发布版本应用程序的文件上传不起作用。这是我有问题的proguard配置文件:

# To enable ProGuard in your project, edit project.properties
# to define the proguard.config property as described in that file.
#
# Add project specific ProGuard rules here.
# By default, the flags in this file are appended to flags specified
# in ${sdk.dir}/tools/proguard/proguard-android.txt
# You can edit the include path and order by changing the ProGuard
# include property in project.properties.
#
# For more details, see
#   http://developer.android.com/guide/developing/tools/proguard.html

-libraryjars /libs/android-support-v4.jar
-libraryjars /libs/google-api-client-1.13.2-beta.jar
-libraryjars /libs/google-api-client-android-1.13.2-beta.jar
-libraryjars /libs/google-api-services-drive-v2-rev70-1.13.2-beta.jar
-libraryjars /libs/google-http-client-1.13.1-beta.jar
-libraryjars /libs/google-http-client-android-1.13.1-beta.jar
-libraryjars /libs/google-http-client-gson-1.13.1-beta.jar
-libraryjars /libs/google-http-client-jackson-1.13.1-beta.jar
-libraryjars /libs/google-http-client-jackson2-1.13.1-beta.jar
-libraryjars /libs/google-http-client-protobuf-1.13.1-beta.jar
-libraryjars /libs/google-oauth-client-1.13.1-beta.jar
-libraryjars /libs/gson-2.1.jar
-libraryjars /libs/guava-jdk5-13.0.jar
-libraryjars /libs/jackson-core-2.0.5.jar
-libraryjars /libs/jackson-core-asl-1.9.9.jar
-libraryjars /libs/jsr305-1.3.9.jar
-libraryjars /libs/protobuf-java-2.4.1.jar

# Add any project specific keep options here:

-keep class com.google.**
-dontwarn com.google.**

# 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 *;
#}

以下是 logcat 中显示的结果错误:

D/ALSAModule(  162): setHardwareParams: reqBuffSize 1024 channels 2 sampleRate 48000
D/ALSAModule(  162): setHardwareParams: buffer_size 2048, period_size 1024, period_cnt 2
W/System.err(10707): com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
W/System.err(10707): {
W/System.err(10707):   "code": 403,
W/System.err(10707):   "errors": [
W/System.err(10707):     {
W/System.err(10707):       "domain": "usageLimits",
W/System.err(10707):       "message": "Access Not Configured",
W/System.err(10707):       "reason": "accessNotConfigured"
W/System.err(10707):     }
W/System.err(10707):   ],
W/System.err(10707):   "message": "Access Not Configured"
W/System.err(10707): }
W/System.err(10707):    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.b(Unknown Source)
W/System.err(10707):    at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.a(Unknown Source)
W/System.err(10707):    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.b(Unknown Source)
W/System.err(10707):    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.d(Unknown Source)
W/System.err(10707):    at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.e(Unknown Source)
W/System.err(10707):    at com.example.testupload2.a.run(Unknown Source)
W/System.err(10707):    at java.lang.Thread.run(Thread.java:856)
D/overlay (  159): Unset pipe=VG0 dpy=0; Unset pipe=RGB1 dpy=0;
D/alsa_ucm(  162): snd_use_case_set(): uc_mgr 0x40e59388 identifier _verb value Inactive
D/alsa_ucm(  162): Set mixer controls for HiFi Lowlatency enable 0
D/alsa_ucm(  162): snd_use_case_set(): uc_mgr 0x40e59388 identifier _disdev value Camcorder Tx

我是一名新手。有关正确的 proguard 配置应该是什么的任何提示?

更新:
我将此问题提交给 Android 问题跟踪器 (issue 54765)。

更新 2: 现在 Google Drive Android API 在 Google Play Services 中实现,我的应用程序大小已经减小,并且 proguard 的设置是thoroughly documented。都是好东西。

【问题讨论】:

    标签: android eclipse google-drive-api proguard


    【解决方案1】:

    在您的proguard-google-api-client.txt 中使用以下内容来保留所需的属性和类成员。

    -keepattributes Signature,RuntimeVisibleAnnotations,AnnotationDefault
    
    -keepclassmembers class * {
      @com.google.api.client.util.Key <fields>;
    }
    
    -keep class com.google.** { *;}
    -keep interface com.google.** { *;}
    -dontwarn com.google.**
    
    # Needed by google-http-client-android when linking against an older platform version
    -dontwarn com.google.api.client.extensions.android.**
    
    # Needed by google-api-client-android when linking against an older platform version
    -dontwarn com.google.api.client.googleapis.extensions.android.**
    

    【讨论】:

    • 感谢您的回复。尽管您建议的配置规则已经在生成的默认 proguard-google-api-client.txt 中,但您的回复提示我在 proguard-google-api-client.txt 上进行更多搜索,这将我带到了stackoverflow.com/questions/14410520/…,它建议添加-keep class com.google.** { ;} -keep interface com.google.* { ;} -dontwarn com.google.* 这对我有用。因此,将其添加到您的答案中,我会检查它是否已接受。再次感谢。
    • 它不会缩小库那么大。我将与 Java 客户端库团队联系,看看是否存在已知问题。
    • 是的,.apk 的大小从 0.186 MB 增加到 1.009 MB,这些额外的两个 -keep 配置规则。不幸的是,小家伙不工作。
    • 更多细节......小 .apk 以致命异常结束(“java.lang.IllegalArgumentException:无法创建 com.google.abaae 类的新实例,因为它没有可访问的默认值constructor") 但在该异常之前,应用程序成功地将示例图像上传到 Google Drive。
    【解决方案2】:

    只需在 proguard-project.txt 中添加以下 2 行

    -keep class com.google.android.gms.** { ; }
    -dontwarn com.google.android.gms.*
    

    【讨论】:

      【解决方案3】:

      如果您使用的是 Google Drive API v3,则只需要这些:

      -keep class * extends com.google.api.client.json.GenericJson {*;}
      -keep class com.google.api.services.drive.** {*;}
      -keep class com.google.api.client.** {*;}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多