학습목표
상황
새로운 화면을 구현하기 위해 액티비티를 추가할 때, 빌드 시 AndroidManifest.xml 내 오류가 떴다.
오류를 해결하기 위해 추가한 xml코드는 아래와 같다.
<activity
android:name=".LoginActivity"
android:exported="true">
exported 속성의 역할
exported 속성은 AndroidManifest.xml 파일에서 액티비티를 정의할 때 사용된다.
특히, 해당 액티비티가 다른 어플리케이션의 구성요소에서 접근할 수 있는지 여부를 결정한다.
exported 속성과 값
intent-filter가 없는 경우, exported 속성의 기본값은 false다.
해당 액티비티는 다른 앱에서 직접적으로 접근할 수 없고, 아래 항목에서만 접근할 수 있다.
exported="true"
intent-filter가 있는 경우에 사용한다.
다른 앱에서 직접적으로 접근할 수 있으며, 명시적 인텐트에서 해당 액티비티의 클래스 이름을 사용하여 호출할 수 있다.
명시적 인텐트를 통한 호출
val intent = Intent()
intent.component = ComponentName("com.example.otherapp", "com.example.otherapp.LoginActivity")
startActivity(intent)
위험성
다른 앱의 개발자가 구성요소 이름을 알아낸다면, 다른 앱이 해당 앱의 구성요소를 실행시킬 수 있다.
따라서 보안 메커니즘, 권한 관리, 외부 앱에서의 액세스에 유의해야 한다.
안드로이드 개발자 문서에서는 외부 앱으로부터 접근을 막기 위해, 다음과 같은 방식을 제시한다.
자신의 앱만 구성 요소를 시작하는 것이 중요할 경우 매니페스트에 인텐트 필터를 선언하지 마세요. 그 대신 해당 구성 요소에 대해 exported 특성을 "false"로 설정하세요.