Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Retrofit body request is blank with Retrofit, when I use proguard and enable minify and shrinkresources

Tags:

When I set minifyEnabled & shrinkResources to true,the Retrofit body JSON request sent is blank, and when it is set to false then it works perfectly fine.

I have posted the whole gradle file so that, you can help me telling what I am doing wrong.

My Retrofit request json body goes like this when minifyEnabled & shrinkResources is true :

{} 

It works fine when minifyEnabled & shrinkResources is false:

{"Data":"demoToken","Key":"demokey","Token":"2a9a8677-ac79-49d6-9947-d797b3e4d8e5"} 

My gradle looks like this :

   apply {     plugin 'com.android.application'     plugin 'kotlin-android'     plugin 'kotlin-android-extensions'     plugin 'kotlin-kapt'     plugin 'io.fabric'     plugin 'com.google.firebase.firebase-perf' } android {     compileSdkVersion 28     defaultConfig {         applicationId "com.something.theapp"         minSdkVersion 21         targetSdkVersion 28         versionCode 43          versionName "0.6.7"         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"         flavorDimensions "server"         multiDexEnabled true         vectorDrawables.useSupportLibrary = true         javaCompileOptions {             annotationProcessorOptions {                 includeCompileClasspath = true             }         }     }     signingConfigs {         kaira {             storeFile file('key_tts.jks')             storePassword 'android'             keyAlias 'tts_key'             keyPassword 'android'         }     }     buildTypes {         debug {             signingConfig signingConfigs.kaira             minifyEnabled true             shrinkResources true             buildConfigField "boolean", "ALLOW_DATABASE", "false"             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'         }         release {             signingConfig signingConfigs.kaira             minifyEnabled true             shrinkResources true             buildConfigField "boolean", "ALLOW_DATABASE", "false"             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'         }     }      productFlavors {         local {             //buildConfigField "String", "WebServiceUrl", "\"http://192.168.1.136:6264/siteapp/api/\"" //            buildConfigField "String", "WebServiceUrl", "\"http://192.168.1.21:5678/api/\""             //   buildConfigField "String", "WebServiceUrl", "\"http://192.168.1.233:5677/api/\""             //  buildConfigField "String", "WebServiceUrl", "\"http://192.168.1.26:5678/api/\""             //buildConfigField "String", "WebServiceUrl", "\"http://192.168.1.25:5678/api/\"" //            buildConfigField "String", "WebServiceUrl", "\"http://192.168.1.37:5678/api/\"" //            buildConfigField "String", "WebServiceUrl", "\"https://api.forsell.in/api/\""             //  buildConfigField "String", "WebServiceUrl", "\"http://192.168.1.23:5678/api/\""             buildConfigField "String", "WebServiceUrl", "\"http://192.168.1.29:5678/api/\""             buildConfigField "String", "WebUrl", "\"https://someurl.in/\""             buildConfigField "String", "ServerName", "\"-Local\""             dimension "server"             copy {                 from "src/local"                 include "google-services.json"                 into "."             }         }         temp {             buildConfigField "String", "WebServiceUrl", "\"http://api.lezza.in/api/\""             buildConfigField "String", "WebUrl", "\"https://someurl.in/\""             buildConfigField "String", "ServerName", "\"-Local\""             dimension "server"             copy {                 from "src/local"                 include "google-services.json"                 into "."             }         }         live {             buildConfigField "String", "WebServiceUrl", "\"https://api.someurl.in/api/\""             buildConfigField "String", "WebUrl", "\"https://someurl.in/\""             buildConfigField "String", "ExtClientNameNew", "\"ExtClientName:TTS\""             dimension "server"             copy {                 from "src/livegcm"                 include "google-services.json"                 into "."             }         }         staging {             //buildConfigField "String", "WebServiceUrl", "\"http://192.168.1.233:85/api/\""//sunil             //     buildConfigField "String", "WebServiceUrl", "\"http://192.168.1.233:5677/api/\""//devang             //   buildConfigField "String", "WebServiceUrl", "\"http://192.168.1.233:85/api/\""             buildConfigField "String", "WebServiceUrl", "\"https://stageapi.someurl.in/api/\""             buildConfigField "String", "WebUrl", "\"https://stageweb.someurl.in/\""             buildConfigField "String", "ServerName", "\"-Staging\""             dimension "server"             copy {                 from "src/local"                 include "google-services.json"                 into "."             }         }     }     compileOptions {         sourceCompatibility JavaVersion.VERSION_1_8         targetCompatibility JavaVersion.VERSION_1_8     }     sourceSets {         main.java.srcDirs += 'src/main/kotlin'     }     dexOptions {         preDexLibraries = false         javaMaxHeapSize "4g" // 2g should be also OK     }     defaultConfig {         vectorDrawables.useSupportLibrary = true     }     lintOptions {         abortOnError false         disable 'MissingTranslation'     } } repositories {     mavenCentral()     maven { url 'https://maven.fabric.io/public' } }  configurations.all {     resolutionStrategy.eachDependency { DependencyResolveDetails details ->         def requested = details.requested         if (requested.group == 'com.android.support') {             if (!requested.name.startsWith("multidex")) {                 details.useVersion '28.0.0'             }         }     } } dependencies {     def lifecycle_version = "2.0.0"     implementation fileTree(include: ['*.jar'], dir: 'libs')     implementation 'androidx.core:core-ktx:1.0.2'     implementation "android.arch.lifecycle:extensions:$lifecycle_version"     annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"     implementation 'androidx.constraintlayout:constraintlayout:1.1.3'     implementation 'androidx.legacy:legacy-support-v4:1.0.0'     implementation 'androidx.appcompat:appcompat:1.0.2'     implementation 'androidx.vectordrawable:vectordrawable:1.0.0-alpha1'     testImplementation 'junit:junit:4.12'     androidTestImplementation 'androidx.test:runner:1.2.0'     androidTestImplementation('com.android.support.test.espresso:espresso-core:3.0.2') {         exclude group: 'com.google.code.findbugs'     }     implementation 'com.squareup.retrofit2:retrofit:2.5.0'     implementation 'com.squareup.retrofit2:adapter-rxjava2:2.3.0'     implementation 'com.squareup.retrofit2:converter-gson:2.5.0'     implementation 'com.squareup.okhttp3:okhttp:3.12.1'     implementation 'com.squareup.okhttp3:logging-interceptor:3.9.0'     implementation 'com.google.android.material:material:1.0.0'     implementation 'androidx.recyclerview:recyclerview:1.0.0'     implementation 'com.github.bumptech.glide:glide:4.5.0'     implementation 'com.karumi:dexter:5.0.0'     implementation 'com.google.android.gms:play-services-maps:16.1.0'     implementation 'com.google.android.gms:play-services-location:16.0.0'     implementation 'com.google.android.gms:play-services-auth:16.0.1'     implementation 'org.jetbrains.anko:anko-common:0.9'     implementation 'com.google.android.gms:play-services-ads:17.2.0'     implementation 'androidx.multidex:multidex:2.0.1'     implementation project(path: ':imagepicker')     implementation 'androidx.percentlayout:percentlayout:1.0.0'     implementation 'com.google.firebase:firebase-core:16.0.9'     implementation 'com.google.firebase:firebase-inappmessaging-display:17.2.0'     implementation 'com.google.firebase:firebase-messaging:18.0.0'     implementation 'com.google.firebase:firebase-config:17.0.0'     implementation 'com.google.firebase:firebase-perf:17.0.2'     implementation 'com.github.chrisbanes:PhotoView:2.3.0'     implementation 'com.google.android.gms:play-services-places:16.1.0'     implementation 'com.google.android.libraries.places:places:1.1.0'     api 'com.theartofdev.edmodo:android-image-cropper:2.8.+'     implementation 'com.github.faruktoptas:RetrofitRssConverterFactory:0.1.0'     implementation 'com.wang.avi:library:2.1.3'     implementation 'com.facebook.android:facebook-android-sdk:5.4.0'     implementation('com.crashlytics.sdk.android:crashlytics:2.9.8@aar') {         transitive = true     }     implementation 'com.haozhang.libary:android-slanted-textview:1.2'     implementation 'com.facebook.shimmer:shimmer:0.4.0'     implementation 'com.github.freshdesk:freshchat-android:1.5.3'     implementation 'commons-io:commons-io:2.4'     implementation 'com.getkeepsafe.taptargetview:taptargetview:1.12.0'     implementation 'com.razorpay:checkout:1.5.6'     implementation 'com.google.android.gms:play-services-analytics:17.0.0'  } apply plugin: 'com.google.gms.google-services' 

Below is my Main model class

class ServiceRequest {      var Key: String? = "SiteAdminAppkey"     var Token: String? = ""     //    var Slug: String? = "admin"     var Data: Any? = null } 

I am able to get this working by adding @SerializeName annotation but I will have to do it in every model class. In one of my other project, Proguard and everything works without serialization.

like image 512
Salman Shaikh Avatar asked Aug 30 '19 05:08

Salman Shaikh


People also ask

What is @body in retrofit?

Retrofit offers the ability to pass objects within the request body. Objects can be specified for use as HTTP request body by using the @Body annotation. The functionality of Retrofit's @Body annotation hasn't changed in version 2.

What is shrinkResources?

– android developer. Jun 12, 2015 at 10:47. 1. minifyEnabled enables proguard which removes unused classes/code and shrinkResources removes unused resources (pngs, xmls, mostly introduced by libraries which you don't fully utilize).

What is retrofit annotation?

Overview. Retrofit is a type-safe REST client for Android, Java and Kotlin developed by Square. The library provides a powerful framework for authenticating and interacting with APIs and sending network requests with OkHttp. See this guide to understand how OkHttp works.


1 Answers

Add below line in your proguard-rules.pro File

-keepclassmembers,allowobfuscation class * {   @com.google.gson.annotations.SerializedName <fields>; } 

Also add below line in gradle.properties file.

android.enableR8=false 

I face same issue and added above line in the file and its working for me.

like image 143
Mehul Kabaria Avatar answered Nov 11 '22 18:11

Mehul Kabaria