Device & Package Info Manager
A comprehensive Flutter package for managing device and package information across Flutter applications. This package provides clean, type-safe interfaces for accessing both package and device information with comprehensive utilities for version comparison, validation, caching, and advanced device identification.
Features
π¦ Package Information Management
- Complete Package Info: App name, version, build number, installer store, SDK versions
- Version Utilities: Display version, pre-release detection, version comparison
- Installation Info: Install time, update time, formatted dates
- Validation: Package info validation with detailed error reporting
- Caching: Built-in caching with refresh and clear capabilities
- Debug Tools: Debug information and comprehensive logging
- Safe Access: Null-safe getters with fallback values
π± Device Information Management
- Device Details: Model, manufacturer, brand, device type detection
- System Info: OS version, platform details, kernel information
- Hardware Specs: Architecture support, supported ABIs, board info
- Platform Detection: Android, iOS, Web, Windows, macOS, Linux support
- Device Types: Mobile, tablet, desktop, TV, watch, web detection
- System Features: Hardware capabilities and feature detection
- Comparison Tools: Device and OS version comparison utilities
- Debug & Monitoring: Comprehensive device reports and debug info
π Advanced Device Identification (New!)
- Persistent User ID: Reliable cross-installation user tracking
- Device Locale & Region: Automatic locale and region detection
- Language Preferences: Multi-language preference management
- Privacy-Safe Identification: Anonymized device identifiers
- Architecture Detection: Enhanced ARM64, ARM32, x86 detection
- Cross-Platform Compatibility: Unified API across all platforms
Installation
Add this to your package's pubspec.yaml
file:
dependencies:
device_package_info_manager: ^1.1.2
Then run:
flutter pub get
Quick Start
Package Information
import 'package:device_package_info_manager/device_package_info_manager.dart';
void main() async {
// Initialize package manager (async factory method)
final packageManager = await PackageInfoManagerImpl.create();
// Get complete package info (synchronous after initialization)
final packageInfo = packageManager.getPackageInfo();
print('App: ${packageInfo.safeAppName}');
print('Version: ${packageInfo.displayVersion}');
print('Full Version: ${packageInfo.fullVersionString}');
// Check version properties
print('Is Pre-release: ${packageInfo.isPreRelease}');
print('Has Valid Version: ${packageInfo.hasValidVersion}');
// Version comparison
final otherPackageInfo = AppPackageInfo.empty();
print('Is Newer: ${packageInfo.isNewerThan(otherPackageInfo)}');
// Debug and validation
print('Validation Errors: ${packageManager.getValidationErrors()}');
packageManager.printPackageInfo();
}
Device Information
import 'package:device_package_info_manager/device_package_info_manager.dart';
void main() async {
// Initialize device manager (async factory method)
final deviceManager = await DeviceInfoManagerImpl.create();
// Get complete device info (synchronous after initialization)
final deviceInfo = deviceManager.getDeviceInfo();
print('Device: ${deviceInfo.displayName}');
print('Manufacturer: ${deviceInfo.manufacturer}');
print('OS: ${deviceInfo.fullDeviceInfo}');
// Check device properties
print('Is Physical Device: ${deviceManager.isPhysicalDevice()}');
print('Device Type: ${deviceManager.getDeviceType()}');
print('Supports ARM64: ${deviceManager.supportsArm64()}');
// Platform detection
print('Is Android: ${deviceManager.isAndroid()}');
print('Is iOS: ${deviceManager.isIOS()}');
// Advanced device identification (NEW!)
print('Persistent User ID: ${deviceManager.getPersistentUserId()}');
print('Device Locale: ${deviceManager.getDeviceLocale()}');
print('Device Region: ${deviceManager.getDeviceRegion()}');
print('Primary Language: ${deviceManager.getPrimaryLanguage()}');
print('Preferred Languages: ${deviceManager.getPreferredLanguages()}');
// Generate comprehensive device report
print('Device Report: ${deviceManager.generateDeviceReport()}');
print('Identification Report: ${deviceManager.generateIdentificationReport()}');
}
API Reference
PackageInfoManager
Initialization
// Initialize with async factory method
final packageManager = await PackageInfoManagerImpl.create();
Core Methods
// Get complete package information
AppPackageInfo getPackageInfo()
// Get specific package details
String getAppName()
String getVersion()
String getBuildNumber()
String getPackageName()
String getBuildSignature()
String getInstallerStore()
// Version utilities
String getFullVersionString()
String getDisplayVersion()
bool isPreRelease()
bool hasValidVersion()
// Installation information
DateTime? getInstallTime()
DateTime? getUpdateTime()
String getInstallDateFormatted()
String getUpdateDateFormatted()
// Validation and debugging
bool validatePackageInfo()
List<String> getValidationErrors()
Map<String, String> getDebugInfo()
void printPackageInfo()
DeviceInfoManager
Initialization
// Initialize with async factory method
final deviceManager = await DeviceInfoManagerImpl.create();
Core Methods
// Get complete device information
AppDeviceInfo getDeviceInfo()
// Get specific device details
String getDeviceId()
String getDeviceName()
String getDeviceModel()
String getManufacturer()
String getBrand()
String getOsVersion()
DeviceType getDeviceType()
// Platform detection
bool isPhysicalDevice()
bool isAndroid()
bool isIOS()
bool isWeb()
bool isDesktop()
bool isMobile()
bool isTablet()
// Technical specifications
String? getArchitecture()
List<String> getSupportedAbis()
List<String> getSupported32BitAbis()
List<String> getSupported64BitAbis()
List<String> getSystemFeatures()
// Advanced device identification (NEW!)
String getPersistentUserId()
String? getDeviceLocale()
String getDeviceRegion()
String getPrimaryLanguage()
List<String> getPreferredLanguages()
// Privacy and security
String getAnonymizedDeviceId()
Map<String, String> generatePrivacySafeSummary()
// Debug and monitoring
Map<String, dynamic> getDebugInfo()
String generateDeviceReport()
String generateIdentificationReport()
Models
AppPackageInfo
class AppPackageInfo extends BaseDataModel<AppPackageInfo> {
final String? appName;
final String? packageName;
final String? version;
final String? buildNumber;
final String? buildSignature;
final String? installerStore;
final DateTime? installTime;
final DateTime? updateTime;
final bool isSystemApp;
final int versionCode;
final String? targetSdkVersion;
final String? minSdkVersion;
// Utility getters
String get safeAppName; // Safe app name with fallback
String get displayVersion; // Formatted version display
String get fullVersionString; // Complete version + build number
String get displayName; // App name or package name
bool get isPreRelease; // Detects pre-release versions
bool get hasValidVersion; // Validates version format
bool get isInstalled; // Checks if package is installed
String get installDateFormatted; // Formatted install date
String get updateDateFormatted; // Formatted update date
bool get hasInstallDate; // Install date availability
bool get hasUpdateDate; // Update date availability
// Version comparison methods
bool isNewerThan(AppPackageInfo other);
bool isOlderThan(AppPackageInfo other);
bool isSameVersionAs(AppPackageInfo other);
int compareTo(AppPackageInfo other);
}
AppDeviceInfo
class AppDeviceInfo extends BaseDataModel<AppDeviceInfo> {
// Basic device information
final String deviceId;
final String deviceName;
final String deviceModel;
final String manufacturer;
final String brand;
final String product;
// Operating system information
final String osVersion;
final String osName;
final String platformVersion;
final String platformName;
// Device characteristics
final DeviceType deviceType;
final bool isPhysicalDevice;
final bool isEmulator;
final bool isTablet;
final bool isMobile;
final bool isDesktop;
// Technical specifications
final String? sdkVersion;
final String? kernelVersion;
final String? architecture;
final String? boardName;
final String? bootloader;
final String? display;
final String? fingerprint;
final String? hardware;
final String? host;
final List<String> systemFeatures;
final List<String> supportedAbis;
final List<String> supported32BitAbis;
final List<String> supported64BitAbis;
// Platform-specific fields
final String? systemName; // iOS
final String? systemVersion; // iOS
final String? localizedModel; // iOS
final String? identifierForVendor; // iOS
final Map<String, String> utsname; // Linux/macOS
// Device identification fields (NEW!)
final Locale? deviceLocale; // Device locale setting
final String? deviceRegion; // Device region/country
final List<String> preferredLanguages; // Preferred languages
// Utility getters
String get displayName; // Formatted device display name
String get fullDeviceInfo; // Complete device information
String get safeDeviceName; // Safe device name with fallback
String get safeDeviceModel; // Safe device model with fallback
String get safeManufacturer; // Safe manufacturer with fallback
String get safeBrand; // Safe brand with fallback
String get safeOsVersion; // Safe OS version with fallback
String get safeOsName; // Safe OS name with fallback
String get deviceTypeString; // Device type as string
bool get hasValidDeviceInfo; // Validates device information
bool get supportsArm64; // ARM64 architecture support
bool get supportsArm32; // ARM32 architecture support
bool get supportsX86; // x86 architecture support
// Advanced identification getters (NEW!)
String get persistentUserId; // Reliable persistent user ID
String get anonymizedDeviceId; // Privacy-safe device identifier
String get primaryLanguage; // Primary language code
String get safeDeviceRegion; // Safe region with fallback
// Comparison methods
bool isSameDevice(AppDeviceInfo other);
bool isNewerOsThan(AppDeviceInfo other);
bool isOlderOsThan(AppDeviceInfo other);
bool isSameOsVersionAs(AppDeviceInfo other);
int compareOsVersionWith(AppDeviceInfo other);
}
DeviceType Enum
enum DeviceType {
unknown, // Unable to determine device type
mobile, // Mobile phones
tablet, // Tablet devices
desktop, // Desktop computers
tv, // Smart TVs
watch, // Smartwatches
web, // Web browsers
}
Advanced Usage
Device Identification & Privacy
final deviceManager = await DeviceInfoManagerImpl.create();
// Get persistent user ID for cross-installation tracking
final persistentId = deviceManager.getPersistentUserId();
print('Persistent User ID: $persistentId'); // Safe for Firestore document IDs
// Get device locale and language preferences
final locale = deviceManager.getDeviceLocale();
final region = deviceManager.getDeviceRegion();
final languages = deviceManager.getPreferredLanguages();
print('Locale: $locale');
print('Region: $region');
print('Languages: ${languages.join(', ')}');
// Generate privacy-safe analytics data
final privacySummary = deviceManager.generatePrivacySafeSummary();
print('Privacy-safe summary: $privacySummary');
// Create comprehensive identification report
final identificationReport = deviceManager.generateIdentificationReport();
print('Identification Report:\n$identificationReport');
Enhanced Architecture Detection
final deviceManager = await DeviceInfoManagerImpl.create();
final deviceInfo = deviceManager.getDeviceInfo();
// Check architecture support with enhanced detection
if (deviceManager.supportsArm64()) {
print('Device supports 64-bit ARM architecture');
print('Supported 64-bit ABIs: ${deviceInfo.supported64BitAbis}');
// Load ARM64 optimized assets
} else if (deviceManager.supportsArm32()) {
print('Device supports 32-bit ARM architecture');
print('Supported 32-bit ABIs: ${deviceInfo.supported32BitAbis}');
// Load ARM32 compatible assets
} else if (deviceManager.supportsX86()) {
print('Device supports x86 architecture');
// Load x86 compatible assets
}
// Check specific architecture compatibility
if (deviceManager.isCompatibleWithArchitecture('arm64')) {
print('Device is compatible with ARM64');
}
Version Comparison
final packageManager = await PackageInfoManagerImpl.create();
final currentPackage = packageManager.getPackageInfo();
// Create a reference package for comparison
final targetPackage = AppPackageInfo(
appName: 'MyApp',
version: '2.0.0',
buildNumber: '200',
// ... other fields
);
// Compare versions
if (currentPackage.isOlderThan(targetPackage)) {
print('Update available!');
} else if (currentPackage.isNewerThan(targetPackage)) {
print('You have a newer version');
} else {
print('Versions are the same');
}
// Sort packages by version
final packages = <AppPackageInfo>[/* ... */];
packages.sort((a, b) => a.compareTo(b));
Device Capability Detection
final deviceManager = await DeviceInfoManagerImpl.create();
final deviceInfo = deviceManager.getDeviceInfo();
// Check architecture support
if (deviceManager.supportsArm64()) {
print('Device supports 64-bit ARM architecture');
// Load ARM64 optimized assets
}
// Platform-specific logic
switch (deviceManager.getDeviceType()) {
case DeviceType.mobile:
// Mobile-specific UI
break;
case DeviceType.tablet:
// Tablet-optimized layout
break;
case DeviceType.desktop:
// Desktop interface
break;
default:
// Default fallback
}
// Feature detection
if (deviceManager.hasFeature('android.hardware.camera')) {
print('Device has camera support');
}
// OS version compatibility check
if (deviceManager.isCompatibleWithOsVersion('10.0')) {
print('Device meets minimum OS requirements');
}
Debug and Validation
final packageManager = await PackageInfoManagerImpl.create();
final deviceManager = await DeviceInfoManagerImpl.create();
// Package validation
final validationErrors = packageManager.getValidationErrors();
if (validationErrors.isNotEmpty) {
print('Package validation errors: $validationErrors');
}
// Debug information
final packageDebugInfo = packageManager.getDebugInfo();
final deviceDebugInfo = deviceManager.getDebugInfo();
print('Package Debug: $packageDebugInfo');
print('Device Debug: $deviceDebugInfo');
// Comprehensive device report
final deviceReport = deviceManager.generateDeviceReport();
print('Device Report: $deviceReport');
// Print formatted information
packageManager.printPackageInfo();
Caching Management
final packageManager = await PackageInfoManagerImpl.create();
final deviceManager = await DeviceInfoManagerImpl.create();
// Check if cached info is available
if (packageManager.hasCachedInfo) {
final cachedInfo = packageManager.getCachedPackageInfo();
print('Cached package info: $cachedInfo');
}
// Refresh cache (note: in current implementation, requires new instance)
await packageManager.refreshCache();
// Clear cache
packageManager.clearCache();
Error Handling
try {
// Initialize managers
final packageManager = await PackageInfoManagerImpl.create();
final deviceManager = await DeviceInfoManagerImpl.create();
// Get information
final packageInfo = packageManager.getPackageInfo();
final deviceInfo = deviceManager.getDeviceInfo();
print('Package: ${packageInfo.safeAppName}');
print('Device: ${deviceInfo.displayName}');
} catch (e) {
print('Failed to initialize managers: $e');
// Use fallback or show error to user
}
// Safe data access with fallbacks
final packageInfo = packageManager.getPackageInfo();
final safeName = packageInfo.safeAppName; // Always returns a valid string
final safeVersion = packageInfo.displayVersion; // Always returns a valid string
Platform Support
Platform | Package Info | Device Info | Specific Features |
---|---|---|---|
Android | β Full | β Full | SDK version, supported ABIs, system features, board info, locale detection |
iOS | β Full | β Full | System name/version, localized model, vendor identifier, locale detection |
Web | β Full | β Limited | Browser info, limited device details, user agent analysis |
Windows | β Full | β Full | Windows-specific system information, architecture detection |
macOS | β Full | β Full | macOS system details, utsname info, Apple Silicon detection |
Linux | β Full | β Full | Linux distribution and system details, architecture detection |
Requirements
- Flutter SDK: >= 3.8.1
- Dart SDK: >= 3.8.1
Dependencies
This package uses the following trusted dependencies:
package_info_plus
^8.3.0 - Package information accessdevice_info_plus
^11.5.0 - Device information accessflutter_shared_utilities
^1.0.14 - Base utilities and extensions
Example
Check out the /example
folder for a comprehensive demo app that showcases all features:
cd example
flutter run
The example app demonstrates:
- π± Complete package information display
- π§ Device specifications viewer
- π Version comparison tools
- ποΈ Platform detection examples
- π οΈ Error handling patterns
- π Debug information and validation
- π Caching and refresh functionality
- π NEW! Device identification demo
- π NEW! Locale and language detection
- π‘οΈ NEW! Privacy-safe identification
Testing
This package includes comprehensive tests. Run them with:
flutter test
Contributing
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Add tests for new functionality
- Ensure all tests pass
- Submit a pull request
Please read our contributing guidelines for more details.
Issues & Support
- π Bug Reports: GitHub Issues
- π¬ Questions: GitHub Discussions
- π§ Contact: Open an issue for direct support
License
This project is licensed under the MIT License - see the LICENSE file for details.
Changelog
See CHANGELOG.md for a detailed list of changes and version history.
Libraries
- device_package_info_manager
- A comprehensive Flutter package for managing device and package information across Flutter applications.