Android
15 posts
Android 14 변경사항, ForegroundServiceType 꼭 입력해야 함

Android 14의 변경사항으로, foreground service를 AndroidManifest에 선언할 때, 항목을 필수로 명시하도록 변경되었습니다. 속성은 Android 10에서 추가되었지만, 필수로 입력해야하는 항목은 아니였습니다. 하지만, Android 14에서 Target SDK API가 14인 앱은 이 항목을 꼭 입력해야 합니다. 만약 입력하지 않으면 를 호출하여 서비스를 실행시킬 때 가 발생하여 동작이 되지 않습니다. 1. 서비스 타입 종류 2. Foreground 서비스 실행을 위한 새로운 권한 3. Foreground 서비스 실행 1. 서비스 타입 종류 에 입력할 수 있는 타입은 아래와 같습니다. health, remoteMessaging, shortService, specialUse, systemExempted 타입은 Android 14에서 신규로 추가되었습니다. 앱의 타입과 맞지 않으면, 구글은 foreground 서비스 대신에 WorkManager나 J…

Android 14부터 Target API 23 미만 앱 설치 불가

Android 14 디바이스에서 Target SDK API(targetSdkVersion) 22 이하로 빌드된 Apk는 설치할 수 없도록 변경되었습니다. 만약 설치하려고 시도하면, 아래와 같은 에러가 발생하며 설치가 실패합니다. 왜 이렇게 변경되었는지, 자세히 알아보겠습니다. App의 최소 SDK API 제한 Android 13 이하에서는 App의 Target SDK API와 관련 없이 모든 Apk가 설치되었습니다. 하지만, Android 14에서는 App의 Target SDK API가 22 이하일 때 설치가 안되도록 변경되었습니다. 이렇게 변경된 이유는, API 22 이하 앱이 보안 측면에서 취약하기 때문입니다. API 22 이하 앱의 경우는, 설치 후 처음 실행할 때 경고 같은 팝업이 뜨고, 앱 실행 시 권한을 앱에 부여할 것인지 물어봅니다. 그 이유는, API 23에서 Runtime permission이 도입되었기 때문으로, API 22 이하에서는 Runtime permiss…

Android 14 신규 컨셉, 사진/동영상의 일부 접근 권한

Android 13 이하에서 앱은 사진/동영상 접근 권한을 사용자에게 요청하면, 모든 파일에 대해서 접근할 수 있었습니다. 하지만, Android 14에서 사진/동영상에 대한 일부 접근 권한 부여 컨셉이 도입되어, 사용자는 파일 1개 또는 몇개만 앱에 접근 권한을 부여할 수 있게 되었습니다. 아래 사진을 보시면, “Select photos and videos” 메뉴가 새로 생겼고, 이 메뉴를 통해 사용자가 앱에 일부 파일 접근 권한만 부여할 수 있습니다. 이런 새로운 컨셉은 사용자의 Privacy를 보호하기 위해서 입니다. 앱은 미디어 접근 권한을 얻고, 무분별하게 파일에 접근했었지만, 사용자는 필요한 파일만 권한을 부여할 수 있기 때문에, 사용자에게 필요한 파일이 무엇인지 왜 이 파일에 접근해야하는지 상세히 안내할 필요가 있습니다. 1. 퍼미션 요청 2. 동작 원리 3. 참고 1. 퍼미션 요청 Android 14에서 일부 접근 권한 방식을 처리하려면 AndroidManifest…

Android 14 - 암시적 인텐트, ActivityNotFoundException 에러 해결

Android 14 디바이스에서 Target SDK API가 34인 앱은 암시적 인텐트로 자신의 Activity를 실행하려고 할 때 아래와 같은 에러가 발생할 수 있습니다. Android 14에서 암시적 인텐트와 대기 중인 인텐트 제한사항라는 변경사항이 추가되었기 때문인데요, 어떤 경우에 문제가 발생하고 해결 방법은 무엇인지 알아보겠습니다. Activity 실행: 에러: 1. Android 14의 변경사항 간단히 말하면, Android 14 디바이스에서 Target SDK API가 34 이상인 앱은, 암시적 인텐트로 로 선언된 Activity는 실행할 수 없습니다. 예를 들어, 아래와 같이 액티비티를 로 선언했을 때 아래와 같은 암시적 인텐트로 실행하면 Activity를 찾을 수 없다는 에러와 함께 이 발생합니다. 이 변경사항은 Target SDK API가 34 이상인 앱에만 적용됩니다. API가 33 이하인 앱은 에러가 발생하지 않고 액티비티가 실행됩니다. 암시적 인텐트는 Int…

Android 14에서 스크린샷 감지하는 방법

Android 14의 변경사항으로, 스크린샷을 찍을 때 감지하는 API를 제공하고 있습니다. 스크린샷 감지는 사용자의 Privacy 보호를 위해 사용될 수 있습니다. 어떤 그룹 채팅 방에서 누군가 채팅 화면에 대해서 스크린샷을 찍었을 때, 앱은 이것을 감지하고 채팅방에 있는 다른 사용자에게 누군가 대화 내용을 스크린샷으로 저장했다고 알릴 수 있습니다. 1. API 기능 및 제한 사항 2. API 사용 및 스크린샷 감지 방법 3. 내 앱 화면 캡처 방지 1. API 기능 및 제한 사항 Android 14에서 제공하는 스크린샷 감지 API는 사용자가 하드웨어 버튼 등으로 스크린샷을 캡처하는 경우에만 감지합니다. ADB 등으로 스크린샷을 저장할 때는 감지하지 않습니다. 앱은 callback을 등록할 수 있고, 스크린샷이 감지되면 callback을 통해 이벤트가 전달됩니다. 2. API 사용 및 스크린샷 감지 방법 API를 사용하려면 권한이 필요하며, 다음과 같이 AndroidMani…

[Android] ADB로 프로세스/쓰레드 ID 확인 방법

ADB를 사용하여 현재 안드로이드 디바이스에서 실행 중인 프로세스의 ID(PID)를 확인할 수 있고, 또한 프로세스에 생성된 쓰레드의 ID(TID)를 확인할 수 있습니다. 1. 실행 중인 프로세스 ID 확인 2. 쓰레드 ID(TID) 확인 1. 실행 중인 프로세스 ID 확인 명령어는 현재 실행 중인 모든 프로세스의 상태를 출력합니다. 왼쪽 두번째의 숫자는 PID를 의미합니다. Help 명령어를 확인해보면, 사용할 수 있는 옵션과 어떤 의미인지 알 수 있습니다. 는 모든 프로세스의 모든 정보를 출력하는 의미였습니다. 2. 쓰레드 ID(TID) 확인 특정 PID에 생성된 스레드 ID를(TID) 확인하려면, 아래와 같이 를 입력하면 해당 PID의 TID를 모두 출력합니다. 아래의 경우, PID 470이 갖고 있는 모든 TID 리스트를 출력합니다.

[Android] ADB로 Intent 보내기, 실행시키기

Android에서 Intent는 Activity를 실행시키거나, 브로드캐스트를 보낼 때 사용됩니다. 그래서, Intent를 실행한다거나, 보낸다라는 말은 인텐트를 사용하여 액티비티를 실행하면서 Intent를 전달하면서 인텐트가 갖고 있는 데이터, Extra 등의 정보들도 함께 전달한다는 의미가 됩니다. 코드를 사용하여 이런 동작을 수행할 수 있지만, 테스트 목적으로 ADB를 사용하여 간단히 인텐트를 보내는 방법도 있습니다. 1. 브로드캐스트 인텐트 전달 2. 액티비티 실행 1. 브로드캐스트 인텐트 전달 1.1 Action만 갖고 있는 인텐트 아래와 같이 Action만 갖고 있는 인텐트를 보낼 수 있습니다. 이 인텐트를 수신하는 앱은 명령어에 입력한 Action을 수신하는 Receiver를 등록한 앱들이 됩니다. 1.2 Action, Category를 갖고 있는 Intent 만약 Action과 Category를 함께 갖고 있다면 를 사용하여 카테고리를 입력할 수 있습니다. 1.3 D…

[Android] ADB로 App 데이터/캐시 삭제 방법

ADB를 사용하여 앱 데이터 및 캐시 파일을 삭제할 수 있습니다. 앱 데이터와 캐시 디렉토리는 앱의 전용 공간으로, 다른 앱에서 접근하지 못하고 앱 자신만 접근 가능한 공간입니다. 폰에서 App 정보를 들어가면 앱 데이터를 클리어할 수 있는데요. 만약 자동화 테스트 등으로, 스크립트로 앱 데이터 클리어가 필요한 경우, ADB를 사용하여 삭제할 수 있습니다. 1. adb shell pm clear [package name] 를 입력하면 입력한 패키지의 데이터와 캐시 파일이 모두 삭제됩니다. 앱의 캐시 파일은 앱의 데이터 공간에 포함된 부분이며, 데이터를 삭제하면 캐시도 함께 삭제됩니다. 만약 멀티 유저 환경에서, 특정 유저에 설치된 앱의 데이터, 캐시를 삭제하고 싶다면 를 옵션으로 입력하면 해당 유저의 데이터만 클리어할 수 있습니다. 2. adb shell pm clear —cache-only [package name] 만약 캐시만 삭제하고 데이터는 삭제하고 싶지 않다면, 명령어에 …

[Android] ADB로 앱 비활성화, 활성화시키는 방법

설정의 App Info에 들어가면, 앱을 활성화/비활성화시키는 버튼가 있습니다. 이 버튼을 누르면 앱은 활성화/비활성화되어 동작하거나 동작 안할 수 있습니다. 그런데, 일반적으로 시스템 앱은 이 메뉴가 제공되지 않습니다. 하지만, ADB를 사용하면 시스템 앱도 활성화/비활성화 시킬 수 있습니다. 1. ADB로 앱 비활성화 아래 명령어는 일반 사용자(Owner 사용자)에 설치된 package name 앱을 비활성화 시키는 명령어입니다. 옵션으로 특정 유저 설정 (User 0은 Owner User의 ID) 결과로 Success가 보이면 성공한 것이고, 실패하면 에러 메시지가 출력됩니다. 2. ADB로 앱 활성화 아래 명령어는 일반 사용자(Owner 사용자)에 설치된 package name 앱을 활성화 시키는 명령어입니다. 옵션으로 특정 유저 설정 (User 0은 Owner User의 ID) 3. 앱이 활성화/비활성화 되었는지 확인하는 방법 을 입력했을 때, 패키지의 정보가 출력되는…

[Android] ADB로 bugreport / dumpstate 로그 추출

ADB를 사용하여 bugreport 및 dumpstate 로그를 추출할 수 있습니다. bugreport(dumpstate) 로그 파일은 로그캣을 포함하여 dumpsys 등, 디바이스의 전반적인 로그가 모두 포함된 로그 파일입니다. 1. adb bugreport [file name] 는 로그를 추출하여 PC에 으로 저장합니다. 경로는 adb 명령어를 입력한 작업 디렉토리 경로에 저장됩니다. 예를 들어, 아래와 같이 명령어를 입력하면 파일이 현재 작업 디렉토리 경로에 저장됩니다. 로그를 추출하는데 시간이 필요하니 조금 기다리시면 추출이 됩니다. 파일 이름을 확인하면, 입력한 파일로 지정됩니다. 2. adb bugreport 명령어만 사용해도 로그 파일을 추출할 수 있습니다. 파일 이름을 지정하지 않았기 때문에, 현재 날짜 기반으로 만들어진 이름으로 파일이 생성됩니다. 아래와 같이 로그를 추출할 수 있고, 추출 후 파일 이름을 확인하면, 임의로 생성된 파일 이름으로 생성됩니다.

[Android] MediaStore에서 사진/동영상/오디오 파일 읽기

Android에서 MediaStore는 디바이스에 저장된 사진/동영상/오디오 등의 미디어 파일을 관리합니다. MediaStore는 Query API를 제공하며, 이 API를 사용하여 파일들을 탐색할 수 있습니다. 예제를 통해 미디어 파일 정보는 가져오는 방법에 대해서 알아보겠습니다. 1. 미디어 파일 접근 권한 2. 모든 이미지 파일 가져오기 3. 모든 비디오 파일 가져오기 4. 모든 오디오 파일 가져오기 1. 미디어 파일 접근 권한 미디어 파일은 OS 버전 별로 요구하는 권한이 조금씩 다릅니다. Android 13에서 는 더 이상 사용되지 않고, 3개의 권한으로 분리되었습니다. 기존에는 1개의 권한으로 모든 종류의 미디어 파일을 읽을 수 있었지만, Android 13부터 미디어 파일 종류에 따라서 READ 권한이 3개로 분리되었습니다. Android 12L 이하 버전 : Android 13 이상 버전 : , , 앱의 AndroidManifest에는 아래와 같이 OS 별로 …

Android 14 미디어 파일 일부 접근 권한(READ_MEDIA_VISUAL_USER_SELECTED)

Android 14의 새로운 미디어 파일 권한 컨셉, 미디어 파일(사진/동영상)의 일부 액세스 권한에 대해서 알아보겠습니다. Android 13에서는 앱은 미디어 파일 전체 접근 권한만 요청할 수 있었는데, Android 14에서 일부 파일 접근 권한만 요청할 수 있도록 변경되었습니다. 사생활(Privacy) 보호 측면에서 사용자는 앱이 필요한 파일만 접근할 수 있도록 권한을 부여할 수 있습니다. 앱 또한 전체 파일이 필요 없는데 과도한 권한을 사용자에게 요청하지 않아도 되서, 사용자가 앱에게 파일 권한을 거부감 없이 부여해줄 수 있습니다. 1. 새로운 권한 소개 2. 권한 요청 방법 3. 권한 확인 방법 4. 미디어 파일 찾기 & 접근 방법 1. 새로운 권한 소개 Android 13에서는 아래 두개 권한을 사용자에게 요청하여 모든 사진/동영상 파일의 접근 권한을 받을 수 있었습니다. Android 14에서는 위 두개 권한과 함께 권한을 요청하면, 파일 전체가 아닌, 일부 파…

[Android] ADB로 현재 보이는 액티비티 확인

디버깅 목적으로, 현재 Top에 실행 중인 액티비티가 무엇인지 확인하고 싶을 때가 있는데요. ADB 명령어를 이용하여 확인할 수 있습니다. 어떤 명령어로 확인하는지 자세히 알아보겠습니다. 1. ADB로 현재 실행 중인 액티비티 찾기 2. ADB로 현재 실행 중인 액티비티의 PID 찾기 1. ADB로 현재 실행 중인 액티비티 찾기 리눅스나 MAC에서 다음과 같이 adb로 dumpsys 로그에서 현재 Top에 실행 중인 액티비티 이름을 찾을 수 있습니다. grep은 명령어의 출력 내용에서 특정 키워드로 검색되는 문자열 한줄을 찾는 명령어 으로 모든 내용을 출력하고, 거기에서 mCurrentFocus, mFocusedApp, mObscuringWindow에 해당하는 내용을 찾아도 됨 예를 들어, Chrome을 실행한 상태에서 명령어를 입력하면, mObscuringWindow로 Top에 실행 중인 Chrome의 Window 정보가 보이며 여기서 패키지 이름과 액티비티 이름을 찾을 수 있습…

[Android] Adb 화면 캡쳐 & 녹화 명령어

ADB 명령어로 화면을 캡쳐(스크린샷)하거나, 녹화하여 동영상 파일로 저장하는 방법에 대해서 알아보겠습니다. 스크린샷은 폰에서도 쉽게 저장할 수 있지만, 기본적으로 기능을 제공하고 있지 않습니다. 내 화면을 동영상으로 저장하여 다른 사람에게 공유하거나 편집할 때 이런 방법을 사용할 수 있습니다. 1. 스크린샷 저장 adb 명령어로 스크린샷은 아래와 같이 찍을 수 있으며, 특정 경로에 파일을 저장할 수 있습니다. 예를 들어, 아래와 같이 화면을 캡쳐하여 경로 파일에 저장할 수 있습니다. PC에서 파일을 확인해보려면, 아래와 같이 디바이스의 파일을 PC로 가져올 수 있습니다. 파일은 터미널의 현재 작업 디렉토리로 복사됩니다. 2. 화면을 동영상으로 저장 adb 명령어로 동영상은 아래와 같이 촬영 시작하며, 를 눌러 ADB 실행을 종료시키면 촬영이 완료되고, 비디오 파일로 저장됩니다. 예를 들어, 아래와 같은 명령어로 동영상 촬영을 하고, 종료시키면 해당 경로로 파일이 만들어집니다. …

[Android] ADB 앱 삭제 명령어

패키지 이름을 알면, ADB로 특정 앱을 삭제할 수 있습니다. 런처에서 터치로 앱을 삭제시킬 수 있지만 자동화 테스트를 구축하거나, 쉘 명령어로 앱을 삭제시키고 싶을 때 이런 방법을 사용할 수 있습니다. 1. ADB로 앱 삭제 2. ADB로 앱 데이터 삭제 특정 유저 데이터/캐시 삭제 3. 참고 1. ADB로 앱 삭제 다음 명령어로 특정 패키지(앱)를 삭제시킬 수 있습니다. 아래 명령어는 유튜브(com.google.android.youtube) 앱을 삭제합니다. 만약 디바이스에 멀티 유저가 설치되어있고, 특정 사용자에 설치된 앱을 삭제하려면 다음과 같이 옵션을 추가해야 합니다. 아래 예제는 User 0(Owner 사용자)에 설치된 유튜브 앱을 삭제합니다. 2. ADB로 앱 데이터 삭제 ADB로 앱은 삭제하지 않고, 앱의 데이터를 삭제하여 초기화할 수 있습니다. 아래 명령어는 특정 패키지의 데이터를 삭제합니다. 예를 들어 다음과 같이 유튜브 앱의 데이터를 삭제할 수 있으며, 삭제가…