एंड्रॉइड ऐप में minifyEnabled GoogleApi कॉल [डुप्लिकेट] तोड़ता है

Dec 16 2020

TLDR - minifyEnabled के सत्य होने पर एंड्रॉइड ऐप को Google API के साथ समस्या होती है।

एक एंड्रॉइड ऐप है जो घटनाओं और Google मीटिंग बनाने के लिए Google API का उपयोग करता है। मैं उन API के साथ कार्य के लिए बहुत मानक उपकरण का उपयोग - GoogleAuthorizationCodeFlow, com.google.api.services.calendar.Calendar, com.google.api.services.calendar.model.Event। मैं बिना किसी अच्छे कारण के "इनस्टॉल एप्लीकेशन्स" के बजाय "वेब सर्वर एप्लिकेशन" के तरीके का उपयोग कर रहा हूं लेकिन इस तथ्य को मैंने पहले ही एक काम बना दिया है। सभी मेरे डिबग मोड में ठीक काम करते हैं, लेकिन जब मैं रिलीज़ मोड पर जाता हूं, तो समस्याएं उत्पन्न होती हैं।

  • GoogleClientSecretsरहस्यों को संसाधित करने में असमर्थ हो जाता है console.developers.google.com। जेसन ने मुझे दिया। समान फ़ाइल डीबग मोड में ठीक काम करती है, लेकिन अब GoogleClientSecrets.getDetailsअशक्त है। मजेदार तथ्य - GoogleClientSecrets.toString/GoogleClientSecrets.toPrettyStringफ़ाइल से डेटा दिखाओ, लेकिन ऐसा लगता है कि सभी उद्धरणों को गायब कर दिया गया है। यह अंततः तय हो गया (अब मैं सीधे क्लाइंटआईड / क्लायंट सेक्रट का उपयोग करके रहस्य बना रहा हूं, बिना जोंस फाइल के), लेकिन समस्या पहले स्थान पर क्यों दिखाई देती है?
  • उस फिक्स के बाद, इसके बजाय flow.newAuthorizationUrl().setRedirectUri(redirectUrl).build()मुझे देता 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। जो पहले से ही वास्तविक समाधान की तुलना में अधिक समाधान की तरह दिखता है, लेकिन चीजें बाद में खराब हो जाती हैं।
  • उसके बाद मैं ठीक करूँगा
    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();

पूरी तरह से अच्छी घटना के साथ, जो बिना minification के ठीक काम करती है, तब मुझे मिलता है

c.f.b.a.b.c.b: 404 Not Found
{
   "errors" : [ {
     "domain" : "global",
     "reason" : "notFound",
     "message" : "Not Found"
   } ],
   "code" : 404,
   "message" : "Not Found"
}

यह -keep class com.google.api.services.calendar.* { *; }मेरे साथ तय किया जा सकता हैproguard-rules.pro

  • उस फिक्स के बाद, इवेंट डालने का वही प्रयास मुझे देता है
    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)

कुछ परीक्षणों के बाद, मैंने देखा, कि उपरोक्त सभी केवल तब दिखाई देते हैं जब minifyEnabled सच होता है। MinifyEnabled झूठ के साथ, सभी एक आकर्षण की तरह काम करता है। अब तक मुझे 3 उपाय मिले

  • minifyEnabled false। मैं अपनी फ़ाइलों की तरह की तरह हालांकि रिलीज में छोटा कर दिया
  • dontobfuscateऔर dontshrinkमें proguard-rules.pro। मदद करता है, लेकिन न्यूनतम करने के प्रभाव को कम करता है।
  • keep class * { *; }में है proguard-rules.pro। मदद करता है, लेकिन न्यूनतम करने के प्रभाव को कम करता है।

मुझे विश्वास नहीं हो रहा है कि minifyEnabled जैसा एक मानक विकल्प इतने बड़े पैमाने पर GoogleAuthorizationमानक उपकरण के माध्यम से कुछ तोड़ देगा com.google.api.client.*। मैं मुझ पर विश्वास कर सकता हूं कि मैं कुछ मूर्खतापूर्ण और स्पष्ट गलतियां कर सकता हूं। मेरा अंतिम पुआल, अब के लिए, "वेब सर्वर अनुप्रयोगों" से "इंस्टॉल्ड" तरीके से जा रहा है, लेकिन मैं यहां बड़ी उम्मीदें नहीं रखता हूं - अगर यह समस्याओं का मुख्य स्रोत था, तो यह बिना किसी संशोधन के काम क्यों करेगा ...

वर्णित व्यवहार क्यों हो सकता है? मैं क्या गलत कर रहा हूं?

जवाब

IvanGarza Dec 16 2020 at 00:22

proguard-rules.proजब भी आपको अपनी रिलीज़ बिल्ड में आपत्ति की समस्या आती है, तो अपनी फ़ाइल में नियम अपवाद जोड़ना कोई असामान्य अभ्यास नहीं है ।

अपने आप ही ProGuard के साथ काम करना एक संपूर्ण विषय है, लेकिन यह मत सोचिए कि आपके ऐप के अपक्षय उपकरण में अपवादों को जोड़ना आपके ऐप की सुरक्षा या व्हाट्सएप को कम कर रहा है। कुछ एपीआई और कोडिंग पैटर्न को ठीक से काम करने के लिए कुछ अपवादों की आवश्यकता होती है; उदाहरण के लिए डेटा वर्ग / मॉडल, और जेएनआई परत से आने वाली हर चीज को हमेशा डी-ऑबफ्यूकेट करने की आवश्यकता होती है।

यदि आप अभी भी आश्वस्त नहीं हैं, तो इस विषय पर एक त्वरित लेख प्रस्तुत करें ।