gregS
gregS

Reputation: 2580

How to configure proguard for Android application using Google Drive SDK?

When Eclipse includes proguard when building the Quickstart: Run a Drive App on Android example application, the application loses its ability to upload files.

The Google API client id appears to be correctly configured given the release version of the application works fine when built without proguard. However that same release version application's file upload doesn't work when built in Eclipse with proguard enabled. Here is my problematic proguard configuration file:

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

And here are the resulting errors displayed in 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

I'm a proguard novice. Any tips on what the correct proguard configuration should be?

UPDATE:
I submitted this problem to the Android issue tracker (issue 54765).

UPDATE 2: Now that the Google Drive Android API is implemented within Google Play Services, my application size has decreased and the setup of proguard is thoroughly documented. Both good things.

Upvotes: 3

Views: 6746

Answers (3)

3c71
3c71

Reputation: 4521

If you're using Google Drive API v3, you only need those:

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

Upvotes: 1

Arunkumar
Arunkumar

Reputation: 224

Just add the below 2 lines in proguard-project.txt

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

Upvotes: 1

Burcu Dogan
Burcu Dogan

Reputation: 9213

Use the following in your proguard-google-api-client.txt to preserve the required attributes and class members.

-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.**

Upvotes: 11

Related Questions