Android 매니페스트 작업Working with the Android Manifest

AndroidManifest.xml은 Android 플랫폼에서 Android에 대한 애플리케이션의 기능 및 요구 사항을 기술할 수 있게 해주는 강력한 파일입니다.AndroidManifest.xml is a powerful file in the Android platform that allows you to describe the functionality and requirements of your application to Android. 하지만 이를 사용한 작업은 쉽지 않습니다.However, working with it is not easy. Xamarin.Android는 매니페스트 자동 생성을 위해 사용되는 사용자 지정 특성을 클래스에 추가하여 이러한 어려움을 최소화하는 데 도움을 줍니다.Xamarin.Android helps to minimize this difficulty by allowing you to add custom attributes to your classes, which will then be used to automatically generate the manifest for you. 목표는 사용자의 99%가 AndroidManifest.xml을 수동으로 수정할 필요가 없도록 하는 것입니다.Our goal is that 99% of our users should never need to manually modify AndroidManifest.xml.

AndroidManifest.xml은 빌드 프로세스 중에 생성되며, Properties/AndroidManifest.xml 내에서 발견된 XML은 사용자 지정 특성으로부터 생성된 XML과 병합됩니다.AndroidManifest.xml is generated as part of the build process, and the XML found within Properties/AndroidManifest.xml is merged with XML that is generated from custom attributes. 그 결과로 병합된 AndroidManifest.xmlobj 하위 디렉터리에 저장됩니다. 예를 들어 디버그 빌드의 경우에는 obj/Debug/android/AndroidManifest.xml에 저장됩니다.The resulting merged AndroidManifest.xml resides in the obj subdirectory; for example, it resides at obj/Debug/android/AndroidManifest.xml for Debug builds. 병합 프로세스는 간단합니다. 코드 내에서 사용자 지정 특성을 사용하여 XML 요소를 생성하고 이 요소를 AndroidManifest.xml삽입합니다.The merging process is trivial: it uses custom attributes within the code to generate XML elements, and inserts those elements into AndroidManifest.xml.

기본 사항The Basics

컴파일 시간에 어셈블리에서 작업으로부터 파생되고 여기에 [Activity] 특성이 선언된 비abstract 클래스를 스캔합니다.At compile time, assemblies are scanned for non-abstract classes that derive from Activity and have the [Activity] attribute declared on them. 그런 후 이러한 클래스 및 특성을 사용해서 매니페스트를 빌드합니다.It then uses these classes and attributes to build the manifest. 예를 들어, 다음 코드를 고려하세요.For example, consider the following code:

namespace Demo
{
    public class MyActivity : Activity
    {
    }
}

그러면 AndroidManifest.xml에 아무 것도 생성되지 않습니다.This results in nothing being generated in AndroidManifest.xml. <activity/> 요소를 생성하려면 [Activity]If you want an <activity/> element to be generated, you need to use the [Activity] 사용자 지정 특성을 사용해야 합니다.custom attribute:

namespace Demo
{
    [Activity]
    public class MyActivity : Activity
    {
    }
}

이 예에서는 다음 xml 조각이 AndroidManifest.xml에 추가됩니다.This example causes the following xml fragment to be added to AndroidManifest.xml:

<activity android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />

[Activity] 특성은 abstract 형식에 영향을 주지 않으며, abstract 형식은 무시됩니다.The [Activity] attribute has no effect on abstract types; abstract types are ignored.

작업 이름Activity Name

Xamarin.Android 5.1부터 작업의 형식 이름은 내보내려는 형식의 정규화된 어셈블리 이름인 MD5SUM을 기준으로 합니다.Beginning with Xamarin.Android 5.1, the type name of an activity is based on the MD5SUM of the assembly-qualified name of the type being exported. 이렇게 하면 서로 다른 두 개의 어셈블리에서 동일한 정규화된 이름을 제공할 수 있으며, 패키징 오류가 발생하지 않습니다.This allows the same fully-qualified name to be provided from two different assemblies and not get a packaging error. (Xamarin.Android 5.1 이전에는 작업의 기본 형식 이름이 소문자 네임스페이스 및 클래스 이름으로부터 생성되었습니다.)(Before Xamarin.Android 5.1, the default type name of the activity was created from the lowercased namespace and the class name.)

이 기본값을 재정의하고 작업 이름을 명시적으로 지정하려면 Name 속성을 사용하십시오.If you wish to override this default and explicitly specify the name of your activity, use the Name property:

[Activity (Name="awesome.demo.activity")]
public class MyActivity : Activity
{
}

이 예제는 다음 xml 조각을 생성합니다.This example produces the following xml fragment:

<activity android:name="awesome.demo.activity" />

참고

이렇게 이름을 바꾸면 런타임에 형식 조회 속도가 느려질 수 있기 때문에 이전 버전과의 호환성을 위해서만 Name 속성을 사용해야 합니다.You should use the Name property only for backward-compatibility reasons, as such renaming can slow down type lookup at runtime. 작업의 기본 형식 이름이 소문자 네임스페이스 및 클래스 이름 기반인 것으로 예상되는 레거시 코드가 있을 때, 호환성 유지 관리에 대한 팁은 Android 호출 가능 래퍼 이름 지정을 참조하십시오.If you have legacy code that expects the default type name of the activity to be based on the lowercased namespace and the class name, see Android Callable Wrapper Naming for tips on maintaining compatibility.

작업 제목 표시줄Activity Title Bar

기본적으로 Android는 애플리케이션이 실행될 때 애플리케이션에 제목 표시줄을 제공합니다.By default, Android gives your application a title bar when it is run. 여기에 사용되는 값은 /manifest/application/activity/@android:label입니다.The value used for this is /manifest/application/activity/@android:label. 대부분의 경우 이 값은 클래스 이름과 다릅니다.In most cases, this value will differ from your class name. 제목 표시줄에 앱 레이블을 지정하려면 Label 속성을 사용하십시오.To specify your app's label on the title bar, use the Label property. 예를 들어:For example:

[Activity (Label="Awesome Demo App")]
public class MyActivity : Activity
{
}

이 예제는 다음 xml 조각을 생성합니다.This example produces the following xml fragment:

<activity android:label="Awesome Demo App" 
          android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity" />

애플리케이션 선택기에서 시작 가능Launchable from Application Chooser

기본적으로 작업은 Android의 애플리케이션 시작 프로그램 화면에 표시되지 않습니다.By default, your activity will not show up in Android's application launcher screen. 왜냐하면 애플리케이션에서 수행되는 작업이 많을 가능성이 높은데 이것들에 대해 모두 하나씩 아이콘을 만들지는 않기 때문입니다.This is because there will likely be many activities in your application, and you don't want an icon for every one. 애플리케이션 시작 프로그램에서 시작할 수 있는 항목을 지정하려면 MainLauncher 속성을 사용하십시오.To specify which one should be launchable from the application launcher, use the MainLauncher property. 예를 들어:For example:

[Activity (Label="Awesome Demo App", MainLauncher=true)] 
public class MyActivity : Activity
{
}

이 예제는 다음 xml 조각을 생성합니다.This example produces the following xml fragment:

<activity android:label="Awesome Demo App" 
          android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

작업 아이콘Activity Icon

기본적으로 작업에는 시스템에서 제공된 기본 시작 프로그램 아이콘이 부여됩니다.By default, your activity will be given the default launcher icon provided by the system. 사용자 지정 아이콘을 사용하려면 먼저 .png리소스/드로어블에 추가하고 빌드 작업을 AndroidResource로 설정한 후 Icon 속성을 사용하여 사용할 아이콘을 지정합니다.To use a custom icon, first add your .png to Resources/drawable, set its Build Action to AndroidResource, then use the Icon property to specify the icon to use. 예를 들어:For example:

[Activity (Label="Awesome Demo App", MainLauncher=true, Icon="@drawable/myicon")] 
public class MyActivity : Activity
{
}

이 예제는 다음 xml 조각을 생성합니다.This example produces the following xml fragment:

<activity android:icon="@drawable/myicon" android:label="Awesome Demo App" 
          android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
</activity>

사용 권한Permissions

Android 매니페스트에 권한을 추가할 때(Android 매니페스트에 권한 추가 참조), 이러한 권한은 Properties/AndroidManifest.xml에 기록됩니다.When you add permissions to the Android Manifest (as described in Add Permissions to Android Manifest), these permissions are recorded in Properties/AndroidManifest.xml. 예를 들어 INTERNET 권한을 설정하면 다음 요소가 Properties/AndroidManifest.xml에 추가됩니다.For example, if you set the INTERNET permission, the following element is added to Properties/AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />

디버그 빌드는 디버그를 더 쉽게 수행하기 위해 일부 권한을 자동으로 설정합니다(예: INTERNETREAD_EXTERNAL_STORAGE). – 이러한 설정은 생성된 obj/Debug/android/AndroidManifest.xml에만 설정되고, 필요한 권한 설정에 사용하도록 표시되지 않습니다.Debug builds automatically set some permissions to make debug easier (such as INTERNET and READ_EXTERNAL_STORAGE) – these settings are set only in the generated obj/Debug/android/AndroidManifest.xml and are not shown as enabled in the Required permissions settings.

예를 들어 obj/Debug/android/AndroidManifest.xml에서 생성된 매니페스트 파일을 검사할 경우 다음과 같이 추가된 권한 요소가 표시될 수 있습니다.For example, if you examine the generated manifest file at obj/Debug/android/AndroidManifest.xml, you may see the following added permission elements:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />

매니페스트의 릴리스 빌드 버전(obj/Debug/android/AndroidManifest.xml)에서 이러한 권한은 자동으로 구성되지 않습니다.In the Release build version of the manifest (at obj/Debug/android/AndroidManifest.xml), these permissions are not automatically configured. 릴리스 빌드로 전환하여 디버그 빌드에서 사용 가능했던 권한이 앱에서 손실되는 것으로 확인되면, 앱의 필요한 권한 설정에서 이 권한을 명시적으로 설정했는지 확인합니다(Mac용 Visual Studio의 빌드 > Android 애플리케이션 또는 Visual Studio의 속성 > Android 매니페스트 참조).If you find that switching to a Release build causes your app to lose a permission that was available in the Debug build, verify that you have explicitly set this permission in the Required permissions settings for your app (see Build > Android Application in Visual Studio for Mac; see Properties > Android Manifest in Visual Studio).

고급 기능Advanced Features

의도된 작업 및 기능Intent Actions and Features

Android 매니페스트는 작업 기능을 설명할 수 있는 방법을 제공합니다.The Android manifest provides a way for you to describe the capabilities of your activity. 이 작업은 의도[IntentFilter]This is done via Intents and the [IntentFilter] 사용자 지정 특성을 통해 수행됩니다.custom attribute. IntentFilterYou can specify which actions are appropriate for your activity with the IntentFilter 생성자로 작업에 적합한 조치와 Categoriesconstructor, and which categories are appropriate with the Categories 속성.property. 최소한 하나 이상의 작업을 제공해야 합니다(작업이 생성자에 제공되는 이유).At least one activity must be provided (which is why activities are provided in the constructor). [IntentFilter]는 여러 번 제공될 수 있으며, 사용할 때마다 <activity/> 내에 <intent-filter/> 요소가 개별적으로 생성됩니다.[IntentFilter] can be provided multiple times, and each use results in a separate <intent-filter/> element within the <activity/>. 예를 들어:For example:

[Activity (Label="Awesome Demo App", MainLauncher=true, Icon="@drawable/myicon")] 
[IntentFilter (new[]{Intent.ActionView}, 
        Categories=new[]{Intent.CategorySampleCode, "my.custom.category"})]
public class MyActivity : Activity
{
}

이 예제는 다음 xml 조각을 생성합니다.This example produces the following xml fragment:

<activity android:icon="@drawable/myicon" android:label="Awesome Demo App" 
          android:name="md5a7a3c803e481ad8926683588c7e9031b.MainActivity">
  <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
  </intent-filter>
  <intent-filter>
    <action android:name="android.intent.action.VIEW" />
    <category android:name="android.intent.category.SAMPLE_CODE" />
    <category android:name="my.custom.category" />
  </intent-filter>
</activity>

Application 요소Application Element

Android 매니페스트는 또한 전체 애플리케이션에 대해 속성을 선언할 수 있는 방법을 제공합니다.The Android manifest also provides a way for you to declare properties for your entire application. 이 작업은 <application> 요소 및 상대 요소인 Application 사용자 지정 특성을 통해 수행됩니다.This is done via the <application> element and its counterpart, the Application custom attribute. 이러한 설정은 작업별 설정이 아닌 애플리케이션 전체(어셈블리 전체)에 적용되는 설정입니다.Note that these are application-wide (assembly-wide) settings rather than per-Activity settings. 일반적으로 전체 애플리케이션에 대해 <application> 속성을 선언하고 작업별 기준으로 이러한 설정을 (필요에 따라) 재정의합니다.Typically, you declare <application> properties for your entire application and then override these settings (as needed) on a per-Activity basis.

예를 들어 다음 Application 특성이 AssemblyInfo.cs에 추가되어 애플리케이션을 디버그할 수 있고, 사용자가 읽을 수 있는 이름이 My App이며, 모든 작업의 기본 테마로 Theme.Light 스타일이 사용됨을 나타냅니다.For example, the following Application attribute is added to AssemblyInfo.cs to indicate that the application can be debugged, that its user-readable name is My App, and that it uses the Theme.Light style as the default theme for all activities:

[assembly: Application (Debuggable=true,   
                        Label="My App",   
                        Theme="@android:style/Theme.Light")]

이 선언은 다음 XML 조각을 obj/Debug/android/AndroidManifest.xml에 생성합니다.This declaration causes the following XML fragment to be generated in obj/Debug/android/AndroidManifest.xml:

<application android:label="My App" 
             android:debuggable="true" 
             android:theme="@android:style/Theme.Light"
                ... />

이 예에서 앱의 모든 작업은 기본적으로 Theme.Light 스타일로 지정됩니다.In this example, all activities in the app will default to the Theme.Light style. 작업 테마를 Theme.Dialog로 설정하면 해당 작업에만 Theme.Dialog 스타일이 사용되고, 앱에 있는 다른 모든 작업에는 기본적으로 <application> 요소에 설정된 대로 Theme.Light 스타일이 적용됩니다.If you set an Activity's theme to Theme.Dialog, only that Activity will use the Theme.Dialog style while all other activities in your app will default to the Theme.Light style as set in the <application> element.

Application 요소는 <application> 특성을 구성하기 위한 유일한 방법이 아닙니다.The Application element is not the only way to configure <application> attributes. 또한 특성을 Properties/AndroidManifest.xml<application> 요소에 직접 삽입할 수 있습니다.Alternately, you can insert attributes directly into the <application> element of Properties/AndroidManifest.xml. 이러한 설정은 obj/Debug/android/AndroidManifest.xml에 있는 최종 <application> 요소에 병합됩니다.These settings are merged into the final <application> element that resides in obj/Debug/android/AndroidManifest.xml. Properties/AndroidManifest.xml의 내용은 항상 사용자 지정 특성으로 제공되는 데이터를 재정의합니다.Note that the contents of Properties/AndroidManifest.xml always override data provided by custom attributes.

<application> 요소에는 여러 가지 애플리케이션 전체 특성을 구성할 수 있습니다. 이러한 설정들에 대한 자세한 내용은 ApplicationAttribute공용 속성을 참조하십시오.There are many application-wide attributes that you can configure in the <application> element; for more information about these settings, see the Public Properties section of ApplicationAttribute.

사용자 지정 특성 목록List of Custom Attributes