minifyEnabled, Android uygulamasında GoogleApi çağrılarını sona erdiriyor [duplicate]
TLDR - minifyEnabled true olduğunda Android uygulamasında Google API ile sorunlar var.
Etkinlikler ve Google toplantıları oluşturmak için Google API kullanan bir Android uygulaması var. O API'leri ile çalışmak için oldukça standart araçları kullanmak - GoogleAuthorizationCodeFlow
, com.google.api.services.calendar.Calendar
, com.google.api.services.calendar.model.Event
. Ben kullanıyorum "Web sunucusu uygulamaları" yetkilendirme yolu yerine "Yüklü uygulamalar" sebepsiz ama zaten ilk çalışması yapılmış gerçektir. Hata ayıklama modumda her şey iyi çalışıyor, ancak yayın moduna geçtiğimde sorunlar ortaya çıkıyor.
GoogleClientSecrets
sırları işleyemez hale geliyor.jsonconsole.developers.google.com
bana verdi. Aynı dosya hata ayıklama modunda iyi çalışıyor, ancak şimdiGoogleClientSecrets.getDetails
null döndürüyor. Komik gerçek -GoogleClientSecrets.toString/GoogleClientSecrets.toPrettyString
dosyadaki verileri gösterin, ancak yapılandırma dosyasındaki tüm alıntılar eksik görünüyor. Sonunda düzeltildi (şimdi json dosyası olmadan clientId / clientSecret kullanarak doğrudan sırlar oluşturuyorum), ancak sorun neden ilk sırada görünüyor?- o düzeltmeden sonra yerine
flow.newAuthorizationUrl().setRedirectUri(redirectUrl).build()
bana verir . RedirectUrl ve clientId doğru bir şekilde okunup kaydedilmesine rağmen "göreli" bölümün çoğu atlanır - ancak Url'de bunların izi yoktur. Bu, benim . Bu zaten gerçek çözümden çok geçici çözüm gibi görünüyor, ancak işler daha sonra daha da kötüleşiyor.https://accounts.google.com/o/oauth2/auth
https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force&client_id=<myClientId>&redirect_uri=<myRedirect>&response_type=code&scope=https://www.googleapis.com/auth/calendar
-keep class com.google.api.client.googleapis.auth.oauth2.*
proguard-rules.pro
- o düzeltmeden sonra yaptığım zaman
Credential credential = getCredential(context);
Calendar service = new Calendar.Builder(HTTP_TRANSPORT,
JSON_FACTORY,
credential)
.setApplicationName(APPLICATION_NAME)
.build();
service.events().insert(calendarId, event)
.setConferenceDataVersion(1)
.setSupportsAttachments(true)
.execute();
küçültmeden iyi sonuç veren mükemmel bir etkinlikle,
c.f.b.a.b.c.b: 404 Not Found
{
"errors" : [ {
"domain" : "global",
"reason" : "notFound",
"message" : "Not Found"
} ],
"code" : 404,
"message" : "Not Found"
}
Bu -keep class com.google.api.services.calendar.* { *; }
benim içinde düzeltilebilirproguard-rules.pro
- Bu düzeltmeden sonra, aynı olay ekleme girişimi bana
W/System.err: java.lang.IllegalArgumentException: key creator
at com.google.api.client.json.JsonParser.parseValue(JsonParser.java:889)
at com.google.api.client.json.JsonParser.parse(JsonParser.java:382)
at com.google.api.client.json.JsonParser.parse(JsonParser.java:355)
at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:87)
at com.google.api.client.json.JsonObjectParser.parseAndClose(JsonObjectParser.java:81)
at com.google.api.client.http.HttpResponse.parseAs(HttpResponse.java:459)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
Bazı testlerden sonra, yukarıdakilerin hepsinin yalnızca minifyEnabled doğru olduğunda göründüğünü fark ettim. MinifyEnabled false ile hepsi bir cazibe gibi çalışır. Şimdiye kadar 3 çözüm buldum
minifyEnabled false
. Dosyalarımın sürümde küçültülmesini seviyorumdontobfuscate
vedontshrink
içindeproguard-rules.pro
. Yardımcı olur, ancak küçültmenin etkisini azaltır.keep class * { *; }
içindeproguard-rules.pro
. Yardımcı olur, ancak küçültmenin etkisini azaltır.
MinifyEnabled gibi standart bir seçeneğin bu kadar büyük ölçekte GoogleAuthorization
standart araçlar yoluyla com.google.api.client.*
olduğu gibi bir şeyi bozacağına inanamıyorum . Yine de aptalca ve bariz hatalar yaptığıma inanabilirim. Şimdilik son pipetim "Web sunucusu uygulamalarından" "Yüklendi" yoluna gidecek, ancak buraya tam olarak büyük umutlar koymuyorum - sorunların ana kaynağı buysa, neden küçültmeden çalışsın ki ...
Tanımlanan davranış neden olabilir? Neyi yanlış yapıyorum?
Yanıtlar
proguard-rules.pro
Yayın yapınızda gizlemeyle ilgili sorunlar bulduğunuzda dosyanıza kural istisnaları eklemek alışılmadık bir uygulama değildir .
ProGuard ile tek başına çalışmak bütün bir konudur, ancak uygulamanızın gizleme aracına istisnalar eklemenin uygulamanızın güvenliğini veya başka bir şeyi baltalayacağını düşünmeyin. Bazı API'ler ve kodlama kalıpları, düzgün çalışabilmek için birkaç istisna gerektirir; Örneğin, veri sınıfları / modelleri ve JNI katmanından gelen her şeyin her zaman gizinin kaldırılması gerekir.
İşte bu konu hakkında hızlı makale hala ikna olmazsan.