Android 앱의 minifyEnabled로 인해 GoogleApi 호출이 중단됨 [중복]

Dec 16 2020

TLDR-minifyEnabled가 true 인 경우 Android 앱에 Google API에 문제가 있습니다.

이벤트 및 Google 회의를 만들기 위해 Google API를 사용하는 Android 앱이 있습니다. 이러한 API로 작업하기 위해 꽤 표준 도구 GoogleAuthorizationCodeFlowcom.google.api.services.calendar.Calendar,, com.google.api.services.calendar.model.Event. 내가 사용하고 "웹 서버 애플리케이션" 인증 방식 대신에 "설치된 응용 프로그램" 더 좋은 이유에 대한하지만 난 이미 첫 번째 작업을 만든 사실을. 디버그 모드에서는 모두 잘 작동하지만 릴리스 모드로 이동하면 문제가 발생합니다.

  • GoogleClientSecrets비밀을 처리 할 수 ​​없게됩니다 console.developers.google.com. 동일한 파일이 디버그 모드에서 잘 작동하지만 이제는 GoogleClientSecrets.getDetailsnull을 반환합니다. 재미있는 사실- GoogleClientSecrets.toString/GoogleClientSecrets.toPrettyString파일의 데이터를 표시하지만 구성 파일에있는 모든 따옴표가 누락 된 것 같습니다. 결국 수정되었지만 (이제 json 파일없이 clientId / clientSecret을 사용하여 직접 비밀을 만들고 있음) 문제가 처음 나타나는 이유는 무엇입니까?
  • 그 수정 한 후, 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가 true 일 때만 나타납니다. minifyEnabled false를 사용하면 모두 매력처럼 작동합니다. 지금까지 3 가지 해결책을 찾았습니다.

  • minifyEnabled false. 나는 릴리스에서 축소 된 파일을 좋아합니다.
  • dontobfuscatedontshrink에서 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 계층에서 오는 모든 것은 항상 난독 화 해제해야합니다.

여전히 확신이 들지 않는 경우 주제에 대한 빠른 기사 가 있습니다.