안드로이드에서 targetSdkVersion 34로 설정할 때는 몇 가지 주요 변경 사항과 주의 사항이 있습니다. 주요 사항은 다음과 같다.
1.권한 처리 강화
미디어 파일 권한: Android 14에서는 사진, 동영상, 오디오 파일에 대한 권한 요청이 분리되었습니다.READ_MEDIA_IMAGES,READ_MEDIA_VIDEO,READ_MEDIA_AUDIO와 같은 구체적인 권한을 사용해야 합니다.
알림 권한: Android 13(API 33)부터알림 사용을 위한 권한(POST_NOTIFICATIONS)이 필수적입니다. 사용자가 명시적으로 알림을 허용해야 앱이 알림을 보낼 수 있습니다.
예시:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
requestPermissions(arrayOf(Manifest.permission.POST_NOTIFICATIONS), 100)
}
2.백그라운드 작업 제한 강화
정책 변경: Android 14는 백그라운드 작업에 대한 제약을 더 강화했습니다. 배터리 소모를 줄이기 위해 백그라운드에서 실행되는 작업에 대한 제한이 있으며, 특히앱이 백그라운드에서 실행 중일 때 작업 스케줄링이 더 어려워졌습니다. 이를 해결하기 위해JobScheduler또는 WorkManager를 사용하는 것이 권장됩니다.
3.기본 보안 정책 강화
SAF(Storage Access Framework) 적용 강화: 외부 저장소 접근이 더 제한적이며, 앱이 명시적으로 저장소 접근을 요청하지 않으면 사용자가 이를 거부할 수 있습니다.Scoped Storage적용을 준비해야 하며, 파일 관리는 앱 전용 저장소나 사용자 상호작용을 통해서만 접근해야 합니다.
4.암호화 및 보안
암호화된 네트워크 통신:명시적 암호화가 더 중요해졌습니다. Android 14는 더 엄격한 네트워크 보안 구성을 요구하며, 특히비암호화된 HTTP 요청을 차단하거나 이를 명시적으로 허용하지 않으면 기본적으로 차단됩니다. 앱의network_security_config.xml에서 설정을 확인하고 HTTPS를 권장합니다.
5.개발자 옵션 사용 제한
Android 14에서는 디버그 앱이 아닌 경우,앱 설치 후 개발자 옵션을 통해 설정된 일부 기능이 자동으로 차단될 수 있습니다. 따라서개발자 전용 빌드와배포 빌드에서 설정 차이를 명확히 하고, 배포 빌드에서는 사용자 경험에 영향을 주지 않도록 주의해야 합니다.
6.백그라운드 위치 접근 제한
위치 서비스 관련 변경 사항으로,백그라운드에서 위치 정보를 사용하는 경우에 대해 더 엄격한 권한 요구가 추가되었습니다. Android 10(API 29)부터 백그라운드 위치 권한(ACCESS_BACKGROUND_LOCATION)이 따로 분리되었으며, 이를 명시적으로 요청해야 합니다. 이제 위치 권한을 필요로 하는 경우,Foreground 권한 Background 권한을 각각 별도로 요청해야 합니다.
7.동적 코드 로딩 제한
Android 14에서는 동적 코드 로딩(dynamic code loading)과 관련된 보안 정책이 더 엄격해졌습니다. APK 내에서 동적으로 코드를 로드하는 방식(예: 외부에서 다운받은 Dex 파일 로딩)을 사용한다면, 보안상의 이유로 Google Play 정책 위반이 될 수 있으므로 주의해야 합니다.
8.Non-SDK 인터페이스 사용 제한
Android 14에서는Non-SDK 인터페이스(비공개 API)사용을 제한하는 정책이 강화되었습니다. 이제 비공개 API에 접근하는 것은 더욱 어렵고, 이에 대한 경고나 오류가 발생할 수 있으므로,공식 SDK를 사용하는지점검해야 합니다.
변경 사항: Gradle 8.0에서는jcenter()지원이 완전히 중단되었습니다. 따라서mavenCentral()또는google()로 대체해야 합니다.
이유: JFrog에서 JCenter 저장소를 더 이상 업데이트하지 않기 때문에 더 이상 사용할 수 없습니다.
예시:
repositories {
google()
mavenCentral()
}
4.Java Toolchain 강화
변경 사항: Gradle 8.0에서는 Java toolchain을 보다 엄격하게 관리하며, 잘못된 toolchain 설정이 더 이상 허용되지 않습니다. 또한 자동으로 toolchain을 다운로드할 때 명시적으로 저장소(Repository)를 설정하지 않으면 오류가 발생합니다.
개발중인 어플리케이션 프로젝트(.apk)를 라이브러리 모듈(.aar)로 변경해야 할 경우 설정방법을 알아보도록 하자.
프로젝트 이름은 'mytest'일 경우 다음과 같은 순서로 설정을 변경하도록 하자.
불필요한 소스 파일 제거
라이브러리 파일에 필요한 소스코드를 제외하고 나머지 파일들은 모두 제거하도록 한다.
AndroidManifest.xml 수정
application요소와 앱 관련 설정을 제거하고, 라이브러리에서 필요한 설정만 남겨둡니다.
예를 들어, 권한이나 기본 설정 등을 유지할 수 있습니다.
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.mytest">
<!-- 필요한 권한 및 기타 설정을 여기에 추가 -->
<!-- 예: INTERNET 권한 -->
<uses-permission android:name="android.permission.INTERNET" />
<!-- 필요하다면 다른 권한도 추가 가능 -->
<!-- 라이브러리에서 제공하는 특정 기능을 위한 설정 -->
<!-- 예: 서비스나 리시버 등 -->
<!--
<application>
<service android:name=".MyService" />
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="com.example.mytest.SOME_ACTION" />
</intent-filter>
</receiver>
</application>
-->
</manifest>
'build.gradle.kts' (Project: MyTest)
// Top-level build file where you can add configuration options common to all sub-projects/modules.
plugins {
alias(libs.plugins.android.application) apply false
// 라이브러리 플러그인 추가
alias(libs.plugins.android.library) apply false
alias(libs.plugins.jetbrains.kotlin.android) apply false
}
| AD Length | AD Type | Manufacturer ID | Beacon ID | Major | Minor | TX Power |
iBeacon
| AD Length | AD Type | Manufacturer ID | iBeacon Prefix | UUID | Major | Minor | TX Power |
참고사항 :
Beacon과 iBeacon은 Advertisement Data의 AD Type으로 일반적으로 0xFF(Manufacturer Specific Data)를 사용합니다. 이 AD Type은 제조사에 특화된 데이터를 나타내며, Beacon과 iBeacon은 자체적인 프로토콜을 사용하여 이 부분에 정보를 담습니다.
따라서 Beacon이나 iBeacon으로 방송될 때, Advertisement Data의 AD Type이 0xFF로 설정되는 것이 일반적입니다. 그리고 이 AD Type 뒤에 이어지는 데이터 부분에는 Beacon이나 iBeacon에 대한 고유한 정보가 포함됩니다.
이러한 설정은 Beacon 또는 iBeacon의 프로토콜 스펙에 따라 다를 수 있으므로, 구체적인 Beacon 또는 iBeacon의 문서나 스펙을 참고하여야 합니다. Beacon과 iBeacon은 자체적으로 프로토콜을 정의하고 있기 때문에, 이러한 세부 사항은 제조사 또는 표준에 따라 다르게 정의될 수 있습니다.
BLE Advertising Payload format을 raw data로 부터 분리 추출하는 방법을 알아보겠다.
raw data로 부터 payload 포맷에 대한 이해에 도움이 되길 바란다.
Flags, Manufacturer Specify Data, TX Power Level, Slave Connection Interval Range (BLE 5.0미만), Service UUIDs (Complete UUID 128 bit), Device Name, Service Data, Beacon Adv. Data, iBeacon Adv. Data 등의 포맷을 알아 보겠다.
——————————————————————————————————————————
Flags
02 01 06
——————————————————————————————————————————
AD length : 0x02 (2)
AD Type : 0x01 (1)
- 0x01 : Flags
AD data : 0x06
- 0x06 ( 0000 0110 B )
- Bit 0 : LE Limited Discoverable Mode NO
- Bit 1 : LE General Discoverable Mode YES
- Bit 2 : BR / EDR Not Supported YES
- Bit 3 : Simultaneous LE and BR/EDR to Same Device Capable NO
- Bit 4 : Simultaneous LE and BR/EDR to Same Device Capable (Host) NO
- Bit 5 : Reserved
- Bit 6 : Reserved
- Bit 7 : Reserved
——————————————————————————————————————————
Manufacturer Specific Data
1B FF 59 00 01 C0 11 11 11 11 CC 64 F0 0A 0B 0C 0D 0E 0F 10 11 12 13 14 15 16 17 18
——————————————————————————————————————————
AD length : 0x1B (27)
AD Type : 0xFF (255)
- 0xFF : Manufacturer Specific Data
AD data :
Company Id :
- 0x0059 (89)
Manufacturer Specific Data :
- 0x01C0111111CC64F00A0B0C0D0E0F101112131415161718
- Header of Manufacturer Payload (0) : 0x01 (1)
- MAC Address (1-7) : 0xCC, 0x11, 0x11, 0x11, 0x11, 0xC0
- Battery Value in % (8) : 0x64 (100) %
- Measured RSSI Value (9) : 0xF0 (240)
- Other Value (10-24) : 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18
TX Power Level
Length
Data Type
TX Power Level
0x02 (2)
0x0A (10)
0xFC (-4 dBm)
——————————————————————————————————————————
Tx Power Level
02 0A FC
——————————————————————————————————————————
AD length : 0x02 (2)
AD Type : 0x0A (10)
- 0x0A : Tx Power Level
AD data : 0xFC (-4 dBm)
- 0xFC ( 1111 1100 B )
- 부호 있는 8비트 정수이므로 2의 보수를 취해 값을 구한다.
- 11111100을 반전하면 00000011. 그리고 1을 더하면 00000100. 즉, 값은 -4가 된다.
Slave Connection Interval Range
Length
Data Type
Minimum
Maximum
0x05 (5)
0x12 (18)
0x0006 (7.5ms)
0x0014 (25ms)
——————————————————————————————————————————
Slave Connection Interval Range
05 12 06 00 14 00
——————————————————————————————————————————
AD length : 0x05 (5)
AD Type : 0x12 (18)
- 0x12 : Slave Connection Interval Range
AD data :
- BLE 5.0 미만 버전에서 사용 됨. BLE 5.0 이상에서는 Advertising ID로 변경 됨.
- Slave Connection Interval은 BLE(Bluetooth Low Energy)에서 두 장치 간의 연결 주기를 나타내는 값입니다.
- Connection Interval은 두 연속적인 연결 사이의 시간 간격을 말하며, 이를 설정함으로써 연결의 성능과 전력 소비를 조절할 수 있습니다.
- 최소 값과 최대 값은 16진수로 표현된 값이며, 단위는 1.25ms입니다.
- Connection Interval Min/Max (ms)=16진수 값×1.25
Minimum :
- 0x0006 (6)
- 6 x 1.25 = 7.5 ms
Maximum :
- 0x0014 (20)
- 20 x 1.25 = 25 ms
Service UUIDs (Complete UUID 128 bit)
Length
Data Type
UUID
0x11 (17)
0x07 (7)
0x6E400001-B5A3-F393-E0A9-E50E24DCCA9E
——————————————————————————————————————————
Complete List of 128-bit Service Class UUIDs
11 07 9E CA DC 24 0E E5 A9 E0 93 F3 A3 B5 01 00 40 6E
——————————————————————————————————————————
AD length : 0x11 (17)
AD Type : 0x07 (7)
- 0x12 : Complete List of 128-bit Service Class UUIDs
AD data :
- 0x6E400001-B5A3-F393-E0A9-E50E24DCCA9E
Complete Local Name
Length
Data Type
Complete Local Name
0x0C (12)
0x09 (9)
Nordic_UART (0x4E6F726469635F55415254)
——————————————————————————————————————————
Complete Local Name
0C 09 4E 6F 72 64 69 63 5F 55 41 52 54
——————————————————————————————————————————
AD length : 0x0C (12)
AD Type : 0x09 (9)
- 0x09 : Complete Local Name
AD data :
- Nordic_UART (0x4E6F726469635F55415254)
Beacon Adv. Data
Length
Data Type
Beacon Adv. Data
0x1A (26)
0xFF (255)
0x004C 000215 112233445566778899AABBCCDD
——————————————————————————————————————————
Beacon Adv. Data
| AD Length | AD Type | Manufacturer ID | Beacon ID | Major | Minor | TX Power |
1A FF 00 4C 00 02 15 11 22 33 44 55 66 77 88 99 AA BB CC DD
——————————————————————————————————————————
AD length : 0x1A (26)
AD Type : 0xFF (255)
- 0xFF : Manufacturer Specific Data
AD data :
Manufacturer :
- 0x004C (Beacon을 제조한 회사의 ID)
Beacon ID :
- 0x000215 (Beacon을 식별하는 고유 ID)
Beacon Data :
- 0x112233445566778899AABBCCDD (Beacon 고유 데이터)
- Beacon Data의 세부 사항은 제조사 또는 표준에 따라 다르게 정의될 수 있다.
- 일반적으로 Major, Minor, TX Power를 사용한다.
——————————————————————————————————————————
iBeacon Adv. Data
| AD Length | AD Type | Manufacturer ID | iBeacon Prefix | UUID | Major | Minor | TX Power |
1F FF 4C 00 02 15 E2C56DB5DFFB48D2B060D0F5A71096E0 0001 0002 C5
——————————————————————————————————————————
AD length : 0x1A (26)
AD Type : 0xFF (255)
- 0xFF : Manufacturer Specific Data
AD data :
Manufacturer :
- 0x4C (Beacon을 제조한 회사의 ID)
iBeacon Prefix :
- 0x000215 (Apple이 iBeacon을 식별하기 위한 특별한 값)
UUID :
- 0xE2C56DB5DFFB48D2B060D0F5A71096E0 (16바이트의 Universally Unique Identifier)
Major :
- 0x0001 (주요 범주를 식별하는 값)
Minor :
- 0x0002 (Major 범주 내에서 세부 항목을 식별하는 값)
TX Power :
- 0xC5 (전송 전력을 나타내는 값)
※ Flags, Service Data, Complete Local Name
Flags
Length
Data Type
Service Data
0x02 (2)
0x01 (1)
0x06
Service Data
Length
Data Type
Service Data
0x05 (5)
0x16 (22)
0x6E2ADB02
Complete Local Name
Length
Data Type
Service Data
0x0B (11)
0x09 (9)
0x50205420383034394638
——————————————————————————————————————————
Flags
02 01 06
——————————————————————————————————————————
AD length : 0x02 (2)
AD Type : 0x01 (1)
- 0x01 : Flags
AD data : 0x06
- 0x06 ( 0000 0110 B )
- Bit 0 : LE Limited Discoverable Mode NO
- Bit 1 : LE General Discoverable Mode YES
- Bit 2 : BR / EDR Not Supported YES
- Bit 3 : Simultaneous LE and BR/EDR to Same Device Capable NO
- Bit 4 : Simultaneous LE and BR/EDR to Same Device Capable (Host) NO
- Bit 5 : Reserved
- Bit 6 : Reserved
- Bit 7 : Reserved
——————————————————————————————————————————
Service Data 16-bit UUID
05 16 6E 2A DB 02
——————————————————————————————————————————
AD length : 0x05 (5)
AD Type : 0x16 (22)
- 0x16 : Service Data 16-bit UUID
AD data :
- 0x6E2ADB02
- ServiceData의 값은 해당 서비스의 사양에 따라 정의된다. (사용자 설정 포맷)
- ServiceData UUID를 포함할 경우 [CBUUID: Data] 포맷으로 만들기도 한다.
——————————————————————————————————————————
Complete Local Name
0B 09 50 20 54 20 38 30 34 39 46 38
——————————————————————————————————————————
AD length : 0x0B (11)
AD Type : 0x09 (9)
- 0x09 : Complete Local Name
AD data :
- 0x50205420383034394638
- ASCII 문자열로 변환하면 "P T 8 0 4 9 F 8" 이다.