package:device_info_plus
Flutter 애플리케이션 내에서 현재 장치 정보를 가져옵니다.
앱을 제작할 때 실행되는 디바이스에 맞춰 UI 크기를 조절해야 할 때가 있다. 또한 안드로이드에서는 머테리얼 디자인을 사용한 UI를 보여주고 iOS에서는 쿠퍼티노 디자인에 맞춰 보여주려고 할 수 있다. 그렇다면 이러한 UI를 제작하기 위해선 가장 먼저 무엇이 필요할까? 바로 그 앱이 실행되는 디바이스의 정보가 필요하다. 앱이 안드로이드에서 실행되는지 iOS에서 실행되는지에 대한 정보가 필요한데 그러한 정보를 쉽게 얻을 수 있게 만들어주는 패키지가 바로 package:device_info_plus이다.
이 device_info_plus 패키지는 애플리케이션에서 실행 중인 디바이스에 대한 다양한 정보를 가져올 수 있게 해 준다. 이 패키지는 iOS, Android, 웹, macOS, Linux, Windows 등 다양한 플랫폼을 지원하며, 플랫폼별로 다양한 디바이스 정보를 제공해 준다, 바로 알아보자.
일단 사용하기 위해선 먼저 프로젝트의 pubspec.yaml파일 안에 device_info_plus 패키지를 추가해야 할 것이다.

펍데브(pub.dev)에서 가져와서 프로젝트에 추가해 준다.
flutter pub add device_info_plus

pubspec.yaml 파일 안에 문제없이 들어갔다면 이제 바로 사용해 주면 된다.
사용하는 방법은 아주 간단한데 먼저 DeviceInfoPlugin 클래스의 인스턴스를 생성해줘야 한다.
DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
이제 이 인스턴스를 통해 플랫폼에 따라 적절한 디바이스 정보를 가져올 수 있게 된다.
그다음에는 이제 바로 이 인스턴스를 사용하여 실행 중인 플랫폼을 확인해 줄 수 있다.
if (Platform.isAndroid) {}
현재 프로그램이 실행 중인 환경에 대한 정보를 담고 있는 dart:io의 Platform 클래스의 생성자를 사용해 준다.
이 생성자는 총 6개가 있는데 그 종류는 아래와 같다.
| 속성 (Platform) | 사용 가능 플랫폼 | 설명 |
| Platform.isLinux | Linux | 현재 앱이 Linux 데스크탑 환경에서 실행 중인지에 대한 여부 |
| Platform.isMacOS | macOS | 현재 앱이 macOS 데스크탑 환경에서 실행 중인지에 대한 여부 |
| Platform.isWindows | Windows | 현재 앱이 Windows 환경에서 실행 중인지에 대한 여부 |
| Platform.isAndroid | Android | 현재 앱이 Android에서 실행 중인지에 대한 여부 |
| Platform.isIOS | iOS | 현재 앱이 iOS에서 실행 중인지에 대한 여부 |
| Platform.isFuchsia | Fuchsia (실험적) | 현재 앱이 Fuchsia OS에서 실행 중인지에 대한 여부 |
암튼 이 생성자를 사용해서 현재 실행 중인 플랫폼을 알아내준다. 그런 후 방금 위에서 만들어 놓은 deviceInfoPlugin 객체를 사용하여 현재 실행중인 디바이스의 모든 정보를 받아와 주면 된다.
안드로이드의 경우에는
if (Platform.isAndroid) {
AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo;
}
현재 플랫폼이 안드로이드인 것을 먼저 확인하고 그 이후에 androidInfo()를 호출하여 현재 실행 중인 안드로이드 디바이스의 정보를 androidInfo라는 객체로 인스턴스화시켜 주면 된다. 이제 이 객체를 통해 정보를 가져올 수 있게 된다.
현재 이 androidInfo에서 많은 값들을 가져올 수 있는데 그 값들은 아래와 같다.
| 속성명 | 타입 | 설명 |
| version | AndroidBuildVersion | Android 운영체제 버전 정보 |
| board | String | 기기의 보드 이름 |
| bootloader | String | 부트로더 버전 정보 |
| brand | String | 제품 브랜드 이름 |
| device | String | 디바이스 고유명 |
| display | String | 화면 표시용 빌드 ID 문자열 |
| fingerprint | String | 해당 빌드의 고유 지문 값 |
| hardware | String | 하드웨어 이름 |
| host | String | 빌드된 호스트 시스템 이름 |
| id | String | 빌드 ID 또는 레이블 |
| manufacturer | String | 제조사 이름 |
| model | String | 기기 모델명 |
| product | String | 제품 이름 |
| name | String | 사용자 설정 디바이스 이름 |
| supported32BitAbis | List<String> | 지원하는 32비트 ABI 목록 |
| supported64BitAbis | List<String> | 지원하는 64비트 ABI 목록 |
| supportedAbis | List<String> | 지원하는 모든 ABI 목록 |
| tags | String | 빌드 태그 문자열 |
| type | String | 빌드 타입 (user, eng 등) |
| isPhysicalDevice | bool | 물리 디바이스 여부 |
| freeDiskSize | int | 사용 가능한 디스크 용량 (bytes) |
| totalDiskSize | int | 총 디스크 용량 (bytes) |
| systemFeatures | List<String> | 기기에서 지원하는 시스템 기능 목록 |
| serialNumber | String | 하드웨어 시리얼 넘버 |
| isLowRamDevice | bool | 저사양 기기 여부 |
| physicalRamSize | int | 총 물리적 RAM 크기 (MB) |
| availableRamSize | int | 사용 가능한 RAM 크기 (MB) |
보면 유독 안드로이드가 가져올 수 있는 정보가 많은 것 같다..
암튼 이 값들을 바로 사용해 줄 수 있는데 한번 AVD, 에뮬레이터에서 실행시켜 보겠다.
코드는 아래와 같이 적고 사용해 주었다.
DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
AndroidDeviceInfo? androidInfo;
@override
void initState() {
super.initState();
getDeviceInfo();
}
Future<void> getDeviceInfo() async {
if (Platform.isAndroid) {
final info = await deviceInfoPlugin.androidInfo;
setState(() {
androidInfo = info;
});
}
}
함수의 형태로 iniState()에서 초기값을 넣어주게 만들었다. 이제 값은 androidInfo라는 객체를 하나 새로 만들어서 거기서 불러와줬다.
Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(androidInfo!.version.release.toString()),
Text(androidInfo!.board.toString()),
Text(androidInfo!.bootloader.toString()),
Text(androidInfo!.brand.toString()),
Text(androidInfo!.device.toString()),
Text(androidInfo!.display.toString()),
Text(androidInfo!.fingerprint.toString()),
Text(androidInfo!.hardware.toString()),
Text(androidInfo!.host.toString()),
Text(androidInfo!.id.toString()),
Text(androidInfo!.manufacturer.toString()),
Text(androidInfo!.model.toString()),
Text(androidInfo!.product.toString()),
Text(androidInfo!.device.toString()),
Text(androidInfo!.supported32BitAbis.toString()),
Text(androidInfo!.supported64BitAbis.toString()),
Text(androidInfo!.supportedAbis.toString()),
Text(androidInfo!.tags.toString()),
Text(androidInfo!.type.toString()),
Text(androidInfo!.isPhysicalDevice.toString()),
Text(androidInfo!.freeDiskSize.toString()),
Text(androidInfo!.totalDiskSize.toString()),
Text(androidInfo!.systemFeatures.toString()), // 이게 엄청 데이터가 큼 (실행할 때 뺏음)
Text(androidInfo!.serialNumber.toString()),
Text(androidInfo!.isLowRamDevice.toString()),
Text(androidInfo!.physicalRamSize.toString()),
Text(androidInfo!.totalDiskSize.toString()),
],
)
실행해 보면 아래와 같이 나온다.

지금 보이는 것과 같이 현재 실행 중인 에뮬레이터의 대부분의 정보를 볼 수가 있게 된다.
이렇게 안드로이드 환경을 알아봤는데 iOS 환경도 안드로이드와 똑같이 구성해 주면 바로 사용해 줄 수 있다.
다만 안드로이드와 다르게 IosDeviceInfo에서 가져올 수 있는 정보량이 좀 더 적다.
| 속성명 | 타입 | 설명 |
| name | String | 기기 이름 (사용자 지정 또는 시스템 제공) |
| systemName | String | 운영체제 이름 (예: iOS) |
| systemVersion | String | 운영체제 버전 |
| model | String | 운영체제가 제공하는 모델 이름 |
| modelName | String | 상업적 또는 사용자 인식 모델 이름 (예: iPhone 15 Pro) |
| localizedModel | String | 기기의 지역화된 모델 이름 |
| identifierForVendor | String? | 앱 벤더를 위한 고유 식별자 (옵션) |
| isPhysicalDevice | bool | 실제 기기인지 여부 (시뮬레이터가 아님) |
| physicalRamSize | int | 총 물리 메모리 크기 (MB) |
| availableRamSize | int | 현재 사용 가능한 메모리 크기 (MB) |
| isiOSAppOnMac | bool | Mac에서 실행 중인 iOS 앱 여부 |
| utsname | IosUtsname | UNIX 시스템 정보 (`sys/utsname.h` 기반) |
| freeDiskSize | int | 사용 가능한 디스크 용량 (bytes) |
| totalDiskSize | int | 전체 디스크 용량 (bytes) |
그래도 코드는 Android에서 iOS로만 바꿔주면 잘 작동이 될 것이다.
DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();
IosDeviceInfo? iosInfo;
@override
void initState() {
super.initState();
getDeviceInfo();
}
Future<void> getDeviceInfo() async {
if (Platform.isIOS) {
final info = await deviceInfoPlugin.iosInfo;
setState(() {
iosInfo = info;
});
}
}
이렇게 현재 실행 중인 플랫폼의 디바이스 정보를 가져올 수 있는 package:device_info_plus에 대해서 알아보았다. 설명 영상을 보면 분명 package:device_info를 설명하고 있는데 막상 펍데브에 들어가 보니 중단(discontinued)되어 있어서 조금 당황했다. 암튼 간에 이 패키지를 사용하여 앱을 유연하게 구성하기를 기원한다. 도움이 되었길 바라며 마치겠다.