minifyEnabled ในแอป Android หยุดการโทร GoogleApi [ซ้ำกัน]

Dec 16 2020

TLDR - แอป Android มีปัญหากับ Google API เมื่อ minifyEnabled เป็นจริง

มีแอป Android ที่ใช้ Google API สำหรับสร้างกิจกรรมและการประชุมของ Google ฉันจะใช้เครื่องมือมาตรฐานสวยสำหรับการทำงานกับ APIs ที่ GoogleAuthorizationCodeFlow- com.google.api.services.calendar.Calendar, com.google.api.services.calendar.model.Event, ฉันใช้วิธีรับรองความถูกต้องของ"แอปพลิเคชันเว็บเซิร์ฟเวอร์"แทน"แอปพลิเคชันที่ติดตั้ง" โดยไม่มีเหตุผลที่ดี แต่ความจริงที่ว่าฉันทำครั้งแรกได้ผลแล้ว ทั้งหมดทำงานได้ดีในโหมดดีบักของฉัน แต่เมื่อฉันไปที่โหมดรีลีสจะเกิดปัญหา

  • GoogleClientSecretsไม่สามารถประมวลผล secret.json console.developers.google.comให้ฉันได้ ไฟล์เดียวกันทำงานได้ดีในโหมด debug แต่ตอนนี้GoogleClientSecrets.getDetailsคืนค่า null ข้อเท็จจริงที่น่าตลก - GoogleClientSecrets.toString/GoogleClientSecrets.toPrettyStringแสดงข้อมูลจากไฟล์ แต่ดูเหมือนว่าจะไม่มีไฟล์กำหนดค่าคำพูดทั้งหมดที่มี ในที่สุดมันได้รับการแก้ไข (ตอนนี้ฉันกำลังสร้างความลับโดยตรงโดยใช้ clientId / clientSecret โดยไม่มีไฟล์ json) แต่ทำไมปัญหาจึงปรากฏขึ้นเป็นอันดับแรก
  • หลังจากการแก้ไขที่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ส่วน "สัมพัทธ์" ส่วนใหญ่จะถูกข้ามไปแม้ว่า redirectUrl และ clientId จะอ่านและบันทึกได้อย่างถูกต้อง แต่ก็ไม่มีร่องรอยของส่วนเหล่านั้นใน Url นี้ได้รับการแก้ไขด้วยการเพิ่มของฉัน-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();

ด้วยเหตุการณ์ที่ดีอย่างสมบูรณ์แบบซึ่งทำงานได้ดีโดยไม่ต้องลดขนาดฉันก็จะได้รับ

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 false ทุกอย่างจะทำงานเหมือนมีเสน่ห์ จนถึงตอนนี้ฉันพบ 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 ด้วยตัวเองเป็นหัวข้อทั้งหมด แต่อย่าคิดว่าการเพิ่มข้อยกเว้นให้กับเครื่องมือทำให้งงงวยของแอปจะทำลายความปลอดภัยของแอปหรือไม่ API และรูปแบบการเข้ารหัสบางอย่างต้องการข้อยกเว้นเล็กน้อยเพื่อให้ทำงานได้อย่างถูกต้อง เช่นคลาส / โมเดลข้อมูลและทุกสิ่งที่มาจากเลเยอร์ JNI จำเป็นต้องถูกทำให้สับสนเสมอ

นี่เป็นบทความสั้น ๆ ในหัวข้อนี้หากคุณยังไม่มั่นใจ