본문 바로가기
flutter/Package of the Week

Flutter[플러터] / device_info_plus 패키지 사용법 (device_info, 디바이스 정보, 장치, 유연성, 플랫폼, 안드로이드, iOS, 웹, 환경, 실행 정보) device_info_plus (Flutter Package of the Week)

by ch5c 2025. 7. 19.
반응형

package:device_info_plus

Flutter 애플리케이션 내에서 현재 장치 정보를 가져옵니다.

https://youtu.be/8T3g6HU5Odo


앱을 제작할 때 실행되는 디바이스에 맞춰 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:ioPlatform 클래스의 생성자를 사용해 준다.

이 생성자는 총 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)되어 있어서 조금 당황했다. 암튼 간에 이 패키지를 사용하여 앱을 유연하게 구성하기를 기원한다. 도움이 되었길 바라며 마치겠다.

반응형