수색…


소개

이 항목에서는 Xamarin.Android 앱을 출시 모드로 준비하는 방법과 최적화 모드에 대해 설명합니다.

Visual Studio에서 APK 준비하기

앱을 마쳤고 디버그 모드에서 테스트를 마쳤으며 완벽하게 작동합니다. 이제 Google Play 스토어에 게시하도록 준비하려고합니다.

Xamarin 문서는 여기에 좋은 정보를 제공합니다.

https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/publishing_an_application/


Android Manifest

먼저 Visual Studio에서 솔루션 탐색기에서 Xamarin.Android 프로젝트를 마우스 오른쪽 단추로 클릭하고 속성을 선택합니다. 그런 다음 Android Manifest 탭으로 이동하여 다음 화면을 봅니다.

Android Manifest 구성

Android Studio 또는 Eclipse와 달리 AndroidManifest.xml 파일을 작성하여 설정할 필요가 없습니다. Xamarin과 Visual Studio가 그렇게합니다. Activities, BroadcastReceivers 및 Services는 클래스의 특정 속성선언 하여 Android Manifest에 삽입됩니다.

이 화면에서 옵션은 다음과 같습니다.

  • 애플리케이션 이름 : 사용자가 볼 수있는 앱 이름입니다.
  • 패키지 이름 : 패키지 이름입니다. 고유해야합니다. 즉, Google Play 스토어에서 다른 앱의 패키지 이름과 동일한 패키지 이름을 사용해서는 안됩니다.
  • 응용 프로그램 아이콘 : 이것은 Android Studio 또는 Eclipse 프로젝트에서 사용되는 @ drawable / ic_launcher와 동일한 사용자에게 표시되는 아이콘입니다.
  • 버전 번호 : 버전 번호는 버전 관리를 위해 Google Play에서 사용됩니다. 앱의 업데이트 된 버전에 대해 APK를 게시하려면 새 업그레이드마다이 번호에 1을 추가해야합니다.
  • 버전 이름 : 사용자에게 표시 될 버전 이름입니다.
  • 설치 위치 : 기기 저장 장치 또는 SD 카드에 APK를 설치할 위치를 결정합니다.
  • 필요한 사용 권한 : 앱에 필요한 사용 권한을 결정합니다.

안드로이드 옵션

아래 화면에서 컴파일러 옵션을 구성 할 수 있습니다. 여기서 올바른 옵션을 사용하면 APK 크기를 줄이고 오류를 예방할 수 있습니다.

Android 옵션 구성

  • 구성 : 활성 (릴리스) .
  • 플랫폼 : 활성 (모든 CPU) . 이는 Google Play 스토어 용 APK를 제작하는 데 필요합니다. 구성이 디버그로 설정된 경우 Google Play에서이를 허용하지 않습니다.
  • 공유 런타임 사용 : 거짓 . 이 값을 true로 설정하면 APK가 Mono Runtime을 사용하여 실행합니다. Mono Runtime은 USB를 통해 디버깅 할 때 자동으로 설치되지만 릴리스 APK에서는 설치되지 않습니다. Mono Runtime이 장치에 설치되어 있지 않고 APK 릴리스에서이 옵션이 true로 설정되어 있으면 응용 프로그램이 중단됩니다.
  • 선택한 ABI마다 하나의 패키지 (.apk) 생성 : false . 호환성을 위해 최대한 많은 플랫폼에서 APK를 만드십시오.
  • Multi-Dex 사용 : true 이지만 앱이 매우 복잡하지 않은 경우 (즉, 65536 개 미만의 메소드가있는 경우 여기를 참조하십시오 ) false로 설정할 수 있습니다.
  • Proguard 활성화 : . 이렇게하면 앱의 Java 코드를 흐리게 처리하는 Proguard 도구를 사용할 수 있습니다. .NET 코드에는 적용되지 않습니다. .NET 코드를 난독 화하려면 Dotfuscator 를 사용해야합니다. Proamard for Xamarin.Android에 대한 자세한 내용은 여기를 참조하십시오 .
  • 개발자 도구 사용 (디버깅 및 프로파일 링) 사용 : APK 해제의 경우 false 입니다.
  • 링크 : SDK 및 사용자 어셈블리 그러면 Xamarin Linker가 SDK와 코드에서 사용되지 않는 클래스를 모두 제거하여 APK 크기를 줄입니다.

중대한

특히 프로젝트의 핵심 (PCL 라이브러리)에있는 경우 Xamarin.Linker가 코드에서 사용하지 않는 클래스를 제거하는 경우가 있습니다. 이를 피하려면 Linking을 "Sdk Assemblies Only"로 설정하거나 클래스의 Preserve 속성을 사용하십시오 (예 :

PreserveAttribute.cs

namespace My_App_Core.Models
{
    public sealed class PreserveAttribute : System.Attribute
    {
        public bool AllMembers;
        public bool Conditional;
    }
}

수업 시간 :

using System;

namespace My_App_Core.Models
{
    [Preserve(AllMembers = true)]
    public class ServiceException : Exception
    {
        public int errorCode;

        [Preserve(AllMembers = true)]
        public ServiceException() { }

        [Preserve(AllMembers = true)]
        public ServiceException(int errorCode)
        {
            this.errorCode = errorCode;
        }
    }
}
  • 지원되는 아키텍처 : 호환성을 위해 모두 선택하십시오 .

모든 것을 구성한 후에는 프로젝트를 다시 빌드하여 빌드가 성공적인지 확인하십시오.


출시 모드 용 APK 만들기

릴리스 용 Android 프로젝트 구성을 완료했습니다. 아래의 자습서에서는 Visual Studio에서 APK를 생성하는 방법을 보여줍니다. Xamarin 설명서의 전체 자습서는 다음에서 찾을 수 있습니다.

https://developer.xamarin.com/guides/android/deployment,_testing,_and_metrics/publishing_an_application/part_2_-_signing_the_android_application_package/

APK 파일을 만들려면 솔루션 탐색기에서 Xamarin.Android 프로젝트를 마우스 오른쪽 단추로 클릭하고 보관을 선택하십시오.

솔루션 탐색기 -> Xamarin.Android 프로젝트 -> Archive ...를 마우스 오른쪽 단추로 클릭하십시오.

그러면 아카이브 관리자가 열리고 프로젝트 보관이 시작되어 APK 파일을 만들 준비가됩니다.

프로젝트 보관

프로젝트 보관이 끝나면 배포 ...를 클릭하여 계속 진행합니다.

배포 ...

배포 화면에는 Ad-hoc과 Google Play의 두 가지 옵션이 표시됩니다. 첫 번째는 APK를 만들고 컴퓨터에 저장합니다. 두 번째 앱은 Google Play에 앱을 직접 게시합니다.

첫 번째 기기를 선택하는 것이 좋습니다. 원하는 경우 다른 기기에서 APK를 테스트 할 수 있습니다.

유통 채널

다음 화면에서 APK에 서명하려면 Android 키 저장소가 필요합니다. 이미 가지고있는 경우 가져 오기 ...를 클릭하여 사용할 수 있습니다. 그렇지 않은 경우 +를 클릭하여 새 Android 키 저장소를 만들 수 있습니다.

서명 신원

새로운 Android 키 저장소 화면 만들기 :

새로운 Android 키 저장소 만들기

APK를 만들려면 다른 이름으로 저장을 클릭하십시오. 키 저장소 암호를 입력하라는 메시지가 나타날 수 있습니다.

다른 이름으로 저장

다른 이름으로 저장 -> 폴더 찾기

키 저장소 비밀번호 입력

완료되면 Archives 화면에서 Open Folder를 클릭하여 생성 된 APK 파일을 볼 수 있습니다.

폴더 열기

폴더의 APK

Xamarin.Android APK에서 MultiDex 사용 설정

MultiDex 는 앱이 65,536 가지가 넘는 메소드를 가질 수 있도록 Android APK의 라이브러리입니다.

Android APK에는 Java 코드에서 컴파일 된 생성 된 바이트 코드가 들어있는 Dalvik 실행 파일 (.dex)이 있습니다. 각 .dex 파일에는 최대 65,536 개의 메소드 (2 ^ 16)가 포함될 수 있습니다.

Android 5.0 Lollipop (API 21) 이전의 Android OS 버전은 Dalvik 런타임을 사용하며 APK 당 하나의 .dex 파일 만 지원하며 APK 당 65,536 개의 메소드로 제한됩니다. Android 5.0부터 Android OS는 ART 런타임을 사용합니다. ART 런타임은 한도를 피하면서 APK 당 둘 이상의 .dex 파일을 지원할 수 있습니다.

API 21 이하의 Android 버전에서 65k 메소드 제한을 초과하려면 개발자는 MultiDex 지원 라이브러리를 사용해야합니다. MultiDex는 classes.dex 파일에서이를 참조하는 추가 classes.dex 파일 (classes2.dex, classes3.dex, ...)을 만듭니다. 앱이로드를 시작하면 MultiDexApplication 클래스를 사용하여 추가 .dex 파일을로드합니다.

Android 앱이 API 21 이상 (Android 5.0 Lollipop) 이상의 최소 SDK 버전을 목표로하는 경우 OS가 기본적으로 추가 .dex 파일을 처리하기 때문에 MultiDex 라이브러리를 사용할 필요가 없습니다. 그러나 호환성 이유로 인해 개발자가 구형 Android OS를 지원하려는 경우 MultiDex 라이브러리를 사용해야합니다.


Xamarin.Android 앱에서 MultiDex를 사용하는 방법

먼저 Xamarin.Android 앱에서 MultiDex를 사용하려면 아래의 인쇄 화면과 같이 프로젝트 속성 -> Android 옵션 -> 패키징 -> 다중 Dex 사용으로 이동하십시오.

MultiDex 옵션 사용

그런 다음 앱에 MultiDexApplication 클래스를 만들어야합니다. 프로젝트 루트에서 새 클래스를 만듭니다 (솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가 -> 클래스 또는 Shift + Alt + C). 새 클래스 파일에서 다음 코드를 복사하고 네임 스페이스 Sample을 Xamarin.Android 프로젝트 네임 스페이스의 이름으로 바꿉니다.

using System;
using Android.App;
using Android.Runtime;
using Java.Interop;

namespace Sample
{
    [Register("android/support/multidex/MultiDexApplication", DoNotGenerateAcw = true)]
    public class MultiDexApplication : Application
    {
        internal static readonly JniPeerMembers _members =
        new XAPeerMembers("android/support/multidex/MultiDexApplication", typeof (MultiDexApplication));

        internal static IntPtr java_class_handle;

        private static IntPtr id_ctor;

        [Register(".ctor", "()V", "", DoNotGenerateAcw = true)]
        public MultiDexApplication()
        : base(IntPtr.Zero, JniHandleOwnership.DoNotTransfer)
        {
            if (Handle != IntPtr.Zero)
                return;

            try
            {
                if (GetType() != typeof (MultiDexApplication))
                {
                    SetHandle(
                        JNIEnv.StartCreateInstance(GetType(), "()V"),
                        JniHandleOwnership.TransferLocalRef);
                        JNIEnv.FinishCreateInstance(Handle, "()V");
                    return;
                }

                if (id_ctor == IntPtr.Zero)
                    id_ctor = JNIEnv.GetMethodID(class_ref, "<init>", "()V");
                SetHandle(
                    JNIEnv.StartCreateInstance(class_ref, id_ctor),
                    JniHandleOwnership.TransferLocalRef);
                JNIEnv.FinishCreateInstance(Handle, class_ref, id_ctor);
            }
            finally
            {
            }
        }

        protected MultiDexApplication(IntPtr javaReference, JniHandleOwnership transfer)
            : base(javaReference, transfer)
        {
        }

        internal static IntPtr class_ref
        {
            get { return JNIEnv.FindClass("android/support/multidex/MultiDexApplication", ref java_class_handle); }
        }

        protected override IntPtr ThresholdClass
        {
            get { return class_ref; }
        }

        protected override Type ThresholdType
        {
            get { return typeof (MultiDexApplication); }
        }
    }
}

코드 소스는 여기에 있습니다.

Windows 용 Visual Studio에서 개발하는 경우 프로젝트를 빌드 할 때 classes.dex 파일을 제대로 작성하기 위해 수정해야하는 Android SDK 빌드 도구의 버그가 있습니다.

Android SDK 폴더로 이동하여 빌드 도구 폴더를 열면 다음과 같은 Android SDK 컴파일러 번호가있는 폴더가 생성됩니다.

C : \ android-sdk \ build-tools \ 23.0.3 \

C : \ android-sdk \ build-tools \ 24.0.1 \

C : \ android-sdk \ build-tools \ 25.0.2 \

각 폴더 안에는 classes.dex 파일을 만드는 데 사용되는 배치 스크립트 인 mainClassesDex.bat 라는 파일이 있습니다. 텍스트 편집기 (메모장 또는 메모장 ++)로 각 mainClassesDex.bat 파일을 열고 스크립트에서 블록을 찾아 교체하십시오.

if DEFINED output goto redirect
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder "%disableKeepAnnotated%" "%tmpJar%" "%params%"
goto afterClassReferenceListBuilder
:redirect
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder "%disableKeepAnnotated%" "%tmpJar%" "%params%" 1>"%output%"
:afterClassReferenceListBuilder

블록으로 :

SET params=%params:'=%  
if DEFINED output goto redirect  
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder %disableKeepAnnotated% "%tmpJar%" %params%  
goto afterClassReferenceListBuilder  
:redirect
call "%java_exe%" -Djava.ext.dirs="%frameworkdir%" com.android.multidex.MainDexListBuilder %disableKeepAnnotated% "%tmpJar%" %params% 1>"%output%"  
:afterClassReferenceListBuilder

여기 소스.

변경 후 텍스트 편집기에서 각 mainClassesDex.bat을 저장하십시오.

위 단계를 완료하면 MultiDex로 Xamarin.Android 앱을 성공적으로 빌드 할 수 있습니다.

Xamarin.Android APK에서 ProGuard 사용 설정

ProGuard 는 APK의 Java 코드를 최적화 및 난독 화하고 사용되지 않는 클래스를 제거하는 데 사용되는 빌드 프로세스에 사용되는 도구입니다. ProGuard를 사용할 때 발생하는 APK는 더 작은 크기를 가지며 리버스 엔지니어링하기가 더 어려울 것입니다 (디 컴파일).

ProGuard는 Xamarin.Android 응용 프로그램에서도 사용할 수 있으며 APK 파일 크기를 줄이고 Java 코드를 난독 화합니다. 그러나 ProGuard 난독 화는 Java 코드에만 적용됩니다. .NET 코드를 난독 화하려면 개발자가 Dotfuscator 또는 유사한 도구를 사용해야합니다.


Xamarin.Android 앱에서 ProGuard를 사용하는 방법

먼저 Xamarin.Android 응용 프로그램에서 ProGuard를 활성화하려면 아래 인쇄 화면과 같이 프로젝트 속성 -> Android 옵션 -> 패키징 -> ProGuard 사용으로 이동하십시오.

ProGuard 사용

이렇게하면 앱을 빌드 할 때 ProGuard를 사용할 수 있습니다.

기본적으로 Xamarin.Android는 proguard에 대한 자체 구성을 설정합니다.이 구성은 proguard_project_primary.cfg , proguard_project_references.cfgproguard_xamarin.cfg 파일의 obj/Debug/proguard 또는 obj/Release/proguard 폴더에서 찾을 수 있습니다. 이 세 파일은 ProGuard의 구성으로 결합되며 Xamarin이 빌드 할 때 자동으로 생성됩니다.

개발자가 ProGuard 옵션을 추가로 사용자 정의하려는 경우 proguard.cfg 라는 프로젝트 루트에 파일을 만들 수 있습니다 (확장자가 .cfg 인 경우 다른 이름도 유효하며 Build Action을 ProguardConfiguration으로 설정) 아래 그림과 같이

빌드 동작을 ProguardConfiguration으로 설정

파일에서 사용자 정의 ProGuard에서 옵션은 같은 삽입 할 수 있습니다 -dontwarn , -keep class다른 사람 .

중대한

현재 (4 월 / 2017 년) 현재 일반적으로 다운로드되는 Android SDK에는 Java 1.8을 사용하여 앱을 빌드 할 때 오류가 발생할 수있는 ProGuard의 이전 버전이 있습니다. 빌드 할 때 오류 목록에 다음 메시지가 표시됩니다.

Error
Can't read [C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\MonoAndroid\v7.0\mono.android.jar] 
(Can't process class [android/app/ActivityTracker.class]  (Unsupported class version number [52.0] (maximum 51.0, Java 1.7))) [CREATEMULTIDEXMAINDEXCLASSLIST]

여기 소스.

이 문제를 해결하려면 ProGuard의 최신 버전 ( 여기 )을 다운로드하고 .zip 파일의 내용을 android-sdk\tools\proguard\ 복사해야합니다. ProGuard를 업데이트하면 건물 프로세스가 문제없이 실행됩니다.

그 후에 ProGuard를 사용하여 Xamarin.Android 앱을 성공적으로 구축 할 수 있습니다.

ProGuard 및 링커와 관련된 "신비한"버그

좋은 앱을 만들었고 좋은 결과로 디버그에서 테스트했습니다. 모든 것이 잘 작동했습니다!

그런 다음 앱을 출시 할 준비를하기로 결정했습니다. MultiDex, ProGuard 및 Linker를 설정 한 다음 작동을 멈 춥니 다.

이 튜토리얼은 신비한 버그를 유발할 수있는 ProGuard 및 Linker와 관련된 일반적인 문제를 찾는 데 도움을주기위한 것입니다.


Xamarin.Linker 이해하기

Xamarin.Linker는 Java 코드가 아닌 .NET 코드에서 사용되지 않는 코드와 클래스를 제거하는 빌드 프로세스의 도구입니다. 프로젝트의 속성 -> Android 옵션 -> 링커에는 옵션과 연결하는 선택 상자가 있습니다.

링커 옵션

없음 : 코드가 제거되지 않습니다.

Sdk Assemblies Only :이 옵션은 Xamarin.Linker가 Xamarin 라이브러리에서만 사용되지 않는 코드를 검사하도록합니다. 이 옵션은 안전합니다.

Sdk 및 사용자 어셈블리 :이 옵션을 사용하면 Xamarin.Linker가 Xamarin 라이브러리 및 프로젝트 코드 (PCL, Xamarin 구성 요소 및 NuGet 패키지 포함)에서 사용하지 않는 코드를 확인합니다. 이 옵션은 항상 안전하지는 않습니다!

Sdk 및 User Assemblies 옵션을 사용할 때 Xamarin.Linker는 코드의 일부가 실제로 많이 사용될 때 사용되지 않는다고 생각할 수 있습니다! 이로 인해 일부 라이브러리가 제대로 작동하지 않게되고 앱에 버그가 발생할 수 있습니다.

Xamarin.Linker가 코드를 제거하지 못하게하려면 다음 세 가지 옵션이 있습니다.

  1. 연결 옵션을 None 또는 Sdk Assemblies Only로 설정하십시오.
  2. 어셈블리 연결 건너 뛰기;
  3. 보존 속성 사용.

예제 2. 링크 어셈블리 건너 뛰기 :

아래 예제에서 Xamarin.Linker를 사용하면 더 이상 인터넷에 연결할 수 없어 제대로 작동하는 NuGet Package ( Octokit )가 작동하지 않게됩니다.

[0:] ERROR
[0:] SOURCE: mscorlib
[0:] MESSAGE: Object reference not set to an instance of an object.
[0:] STACK TRACE:   at Octokit.PocoJsonSerializerStrategy.DeserializeObject (System.Object value, System.Type type) [0x003d8] in D:\repos\octokit.net\Octokit\SimpleJson.cs:1472 
  at Octokit.Internal.SimpleJsonSerializer+GitHubSerializerStrategy.DeserializeObject (System.Object value, System.Type type) [0x001c3] in D:\repos\octokit.net\Octokit\Http\SimpleJsonSerializer.cs:165 
  at Octokit.SimpleJson.DeserializeObject (System.String json, System.Type type, Octokit.IJsonSerializerStrategy jsonSerializerStrategy) [0x00007] in D:\repos\octokit.net\Octokit\SimpleJson.cs:583 
  at Octokit.SimpleJson.DeserializeObject[T] (System.String json, Octokit.IJsonSerializerStrategy jsonSerializerStrategy) [0x00000] in D:\repos\octokit.net\Octokit\SimpleJson.cs:595 
  at Octokit.Internal.SimpleJsonSerializer.Deserialize[T] (System.String json) [0x00000] in D:\repos\octokit.net\Octokit\Http\SimpleJsonSerializer.cs:21 
  at Octokit.Internal.JsonHttpPipeline.DeserializeResponse[T] (Octokit.IResponse response) [0x000a7] in D:\repos\octokit.net\Octokit\Http\JsonHttpPipeline.cs:62 
  at Octokit.Connection+<Run>d__54`1[T].MoveNext () [0x0009c] in D:\repos\octokit.net\Octokit\Http\Connection.cs:574 
--- End of stack trace from previous location where exception was thrown ---

라이브러리를 다시 시작하려면 아래 그림과 같이 프로젝트 -> 속성 -> Android 옵션 -> 링커에있는 어셈블리 링크 건너 뛰기 필드에 패키지 참조 이름을 추가해야합니다.

어셈블리 링크 건너 뛰기에 대한 프로젝트 참조 추가

그 후 도서관은 문제없이 일하기 시작했습니다.

예제 3. Preserve 속성 사용 :

Xamarin.Linker는 사용하지 않는 코드가 대부분 프로젝트 핵심 모델 클래스의 코드라고 인식합니다.

연결 프로세스 중에 클래스를 유지하려면 Preserve 특성을 사용할 수 있습니다.

먼저 프로젝트 코어에 PreserveAttribute.cs 라는 클래스를 만들고 다음 코드를 삽입하고 네임 스페이스를 프로젝트의 네임 스페이스로 바꿉니다.

PreserveAttribute.cs :

namespace My_App_Core.Models
{
    public sealed class PreserveAttribute : System.Attribute
    {
        public bool AllMembers;
        public bool Conditional;
    }
}

프로젝트 코어의 각 모델 클래스에 아래 예제와 같이 Preserve 특성을 삽입하십시오.

Country.cs :

using System;
using System.Collections.Generic;

namespace My_App_Core.Models
{
    [Preserve(AllMembers = true)]
    public class Country
    {
        public String name { get; set; }
        public String ISOcode { get; set; }

        [Preserve(AllMembers = true)]
        public Country(String name, String ISOCode)
        {
            this.name = name;
            this.ISOCode = ISOCode;
        }
    }
}

그런 다음 연결 프로세스가 더 이상 보존 된 코드를 제거하지 않습니다.


ProGuard 이해하기

ProGuard는 Java 코드에서 사용되지 않는 코드와 클래스를 제거하는 빌드 프로세스의 도구입니다. 또한 코드를 난독 화하고 최적화합니다.

그러나 ProGuard는 때로는 사용하지 않는 것으로 인식하는 코드를 제거 할 수 있습니다. 이를 방지하려면 개발자는 Android Device Monitor 및 Visual Studio Debug에서 응용 프로그램을 디버깅하고 제거 된 클래스를 찾아서 ProGuard 구성 파일을 구성하여 클래스를 유지해야합니다.

아래 예제에서 ProGuard는 AXML 레이아웃 파일에 사용 된 두 클래스 (Android.Support.V7.Widget.FitWindowsLinearLayout 및 Android.Support.Design.Widget.AppBarLayout)를 제거했지만 코드에서 사용되지 않는 것으로 인식되었습니다. 이 제거로 인해 활동 레이아웃을 렌더링 할 때 Java 코드에서 ClassNotFoundException이 발생했습니다.

layout_activitymain.axml :

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.DrawerLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activitymain_drawerlayout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true" <!-- ### HERE ### -->
    tools:openDrawer="start">
    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:fitsSystemWindows="true">
        <!-- ### HERE ## -->
        <android.support.design.widget.AppBarLayout
            android:id="@+id/activitymain_appbarlayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:theme="@style/AppTheme.AppBarOverlay">
...

SetContentView에서 레이아웃을 만들 때 LogCat에 오류가 표시됨 :

LogCat에 오류 표시

이 오류를 수정하려면 프로젝트의 ProGuard 구성 파일에 다음 행을 추가해야합니다.

-keep public class android.support.v7.widget.FitWindowsLinearLayout
-keep public class android.support.design.widget.AppBarLayout

그 후 레이아웃을 만들 때 더 이상 오류가 표시되지 않았습니다.

ProGuard 경고

ProGuard는 프로젝트를 빌드 한 후 오류 목록에 경고를 표시하기도합니다. 그들은 당신의 앱이 괜찮은지 아닌지에 대한 질문을 제기하지만, 특히 당신의 앱이 성공적으로 구축되면 모든 경고가 문제가되는 것은 아닙니다.

사용하는 경우 그 한 가지 예는 피카소 ProGuard에서를 사용하는 경우,이 같은 경고가 표시 될 수 있습니다 : 라이브러리를 okio.Okio: can't find referenced class (...) 또는 can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [okhttp.jar:META-INF/MANIFEST.MF]) (...) ,하지만 앱이 빌드되고 라이브러리가 문제없이 작동합니다.



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow