Mobile Development Master Roadmap
Technology
Mobile Development Master Roadmap
Overview
Mobile development engineers are specialists who design and develop applications for smartphones and tablets. In 2025, cross-platform frameworks have become mainstream in mobile development, with Flutter and React Native leading the market. At the same time, deep understanding of native development plays an important role in implementing advanced features and performance optimization.
Details
Phase 1: Building Foundation (3-6 months)
Programming Fundamentals
-
JavaScript/TypeScript (for React Native)
- Complete understanding of ES6+
- Asynchronous programming (Promise, async/await)
- Functional programming concepts
- TypeScript type system
-
Dart (for Flutter)
- Basic Dart syntax
- Object-oriented programming
- Asynchronous programming (Future, Stream)
- Null Safety
-
Native Language Basics
- Swift (iOS): Basic syntax, Optionals, Protocols
- Kotlin (Android): Basic syntax, Null Safety, Coroutines
Mobile UI/UX Principles
-
Platform-specific Design Guidelines
- iOS Human Interface Guidelines
- Material Design (Android)
- Responsive layouts
- Accessibility
-
Basic UI Components
- Navigation patterns
- List display and scrolling
- Forms and validation
- Animations and transitions
Phase 2: Cross-platform Development (6-12 months)
Flutter Development
-
Flutter Basics
- Understanding widget tree
- Stateless and Stateful widgets
- Building layouts (Row, Column, Stack)
- Material Design and Cupertino widgets
-
State Management
- Provider
- Riverpod
- BLoC (Business Logic Component)
- GetX
-
Advanced Flutter
- Custom painting
- Platform-specific code (Method Channel)
- Performance optimization
- Flutter Web/Desktop support
React Native Development
-
React Native Basics
- Component lifecycle
- React Hooks
- Styling (StyleSheet, Flexbox)
- Navigation (React Navigation)
-
State Management and Data
- Redux/Redux Toolkit
- MobX
- Context API
- React Query
-
Advanced React Native
- Native module development
- Performance optimization
- New Architecture (Fabric, TurboModules)
- Expo vs Bare React Native
API Integration and Backend
-
RESTful API
- HTTP clients (Dio, Axios)
- Authentication (JWT, OAuth)
- Error handling
-
Real-time Communication
- WebSocket
- Firebase Realtime Database
- GraphQL (Apollo Client)
Phase 3: Native Development and Platform-specific Features (12-18 months)
iOS Development (Swift/SwiftUI)
-
SwiftUI
- Declarative UI
- Combine Framework
- Data binding
- Animations
-
iOS-specific Features
- Core Data
- Core Animation
- ARKit
- HealthKit
- Apple Pay
-
App Store Support
- App Store Connect usage
- Review guidelines
- TestFlight
- App Store Optimization (ASO)
Android Development (Kotlin/Jetpack Compose)
-
Jetpack Compose
- Composable functions
- State management
- Theming and styling
- Animations
-
Android-specific Features
- Room Database
- WorkManager
- CameraX
- Google Pay
- Material You (Material Design 3)
-
Google Play Support
- Google Play Console
- Release management
- A/B testing
- Play Store Optimization
Device Features and Integration
-
Common Features
- Camera and gallery
- Location services (GPS)
- Push notifications
- Local storage
- Biometric authentication
-
Sensors and Hardware
- Accelerometer
- Gyroscope
- Bluetooth/BLE
- NFC
Phase 4: Advanced Skills and Latest Technologies (18-24 months)
Performance Optimization
-
Rendering Optimization
- Virtualized lists
- Image optimization
- Memory management
- Bundle size reduction
-
Network Optimization
- Caching strategies
- Offline support
- Background sync
- Data compression
Testing and Quality Assurance
-
Unit Testing
- Flutter Test
- Jest (React Native)
- XCTest (iOS)
- JUnit (Android)
-
Integration Testing
- Flutter Integration Test
- Detox (React Native)
- XCUITest (iOS)
- Espresso (Android)
-
E2E Testing
- Appium
- Firebase Test Lab
- AWS Device Farm
CI/CD and DevOps
-
Automated Build and Deploy
- GitHub Actions
- Bitrise
- Codemagic
- Fastlane
-
Distribution and Management
- Firebase App Distribution
- Microsoft App Center
- Over-the-Air updates
Latest Trends and Future Technologies
-
AI/ML Integration
- Core ML (iOS)
- ML Kit (Firebase)
- TensorFlow Lite
- On-device AI
-
Emerging Technologies
- Kotlin Multiplatform Mobile
- .NET MAUI
- Flutter for embedded devices
- AR/VR development
-
Web Technology Integration
- Progressive Web Apps (PWA)
- WebAssembly
- Capacitor/Ionic
Advantages and Disadvantages
Advantages
- Huge market: Billions of smartphone users worldwide
- Direct impact: Create products that directly affect users' daily lives
- Cross-platform efficiency: One codebase for multiple platforms
- Continuous demand: Constant high demand in the mobile-first era
- Creative expression: Innovative implementation of UI design and user experience
Disadvantages
- Rapid changes: Continuous adaptation to OS updates and framework changes
- Fragmentation: Complexity of supporting diverse devices, especially on Android
- Review process: Strict review criteria for App Store and Google Play
- Performance requirements: Optimization with limited resources is essential
- Platform dependency: Adapting to Apple and Google policy changes
Reference Pages
- Flutter Official Documentation - Complete Flutter development guide
- React Native Official Documentation - React Native reference
- Apple Developer - iOS development resources
- Android Developers - Android development guide
- Kotlin Official Site - Kotlin language reference
- Swift Official Site - Swift language documentation
- Material Design - Google's design system
- Human Interface Guidelines - Apple's design guide
Code Examples
Flutter: Product List App
// main.dart
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:dio/dio.dart';
// Data model
class Product {
final int id;
final String name;
final double price;
final String imageUrl;
bool isFavorite;
Product({
required this.id,
required this.name,
required this.price,
required this.imageUrl,
this.isFavorite = false,
});
factory Product.fromJson(Map<String, dynamic> json) {
return Product(
id: json['id'],
name: json['name'],
price: json['price'].toDouble(),
imageUrl: json['imageUrl'],
);
}
}
// State management
class ProductProvider extends ChangeNotifier {
List<Product> _products = [];
bool _isLoading = false;
String _error = '';
List<Product> get products => _products;
bool get isLoading => _isLoading;
String get error => _error;
Future<void> fetchProducts() async {
_isLoading = true;
_error = '';
notifyListeners();
try {
final dio = Dio();
final response = await dio.get('https://api.example.com/products');
_products = (response.data as List)
.map((json) => Product.fromJson(json))
.toList();
} catch (e) {
_error = 'Failed to load products: $e';
} finally {
_isLoading = false;
notifyListeners();
}
}
void toggleFavorite(int productId) {
final index = _products.indexWhere((p) => p.id == productId);
if (index != -1) {
_products[index].isFavorite = !_products[index].isFavorite;
notifyListeners();
}
}
}
// Main app
void main() {
runApp(
ChangeNotifierProvider(
create: (_) => ProductProvider(),
child: MyApp(),
),
);
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Product Catalog',
theme: ThemeData(
primarySwatch: Colors.blue,
useMaterial3: true,
),
home: ProductListScreen(),
);
}
}
// Product list screen
class ProductListScreen extends StatefulWidget {
@override
_ProductListScreenState createState() => _ProductListScreenState();
}
class _ProductListScreenState extends State<ProductListScreen> {
@override
void initState() {
super.initState();
Future.microtask(() =>
context.read<ProductProvider>().fetchProducts());
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Products'),
actions: [
IconButton(
icon: Icon(Icons.shopping_cart),
onPressed: () {
// Navigate to cart
},
),
],
),
body: Consumer<ProductProvider>(
builder: (context, provider, child) {
if (provider.isLoading) {
return Center(child: CircularProgressIndicator());
}
if (provider.error.isNotEmpty) {
return Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Text(provider.error),
ElevatedButton(
onPressed: provider.fetchProducts,
child: Text('Retry'),
),
],
),
);
}
return RefreshIndicator(
onRefresh: provider.fetchProducts,
child: GridView.builder(
padding: EdgeInsets.all(16),
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: 0.7,
crossAxisSpacing: 16,
mainAxisSpacing: 16,
),
itemCount: provider.products.length,
itemBuilder: (context, index) {
final product = provider.products[index];
return ProductCard(product: product);
},
),
);
},
),
);
}
}
// Product card widget
class ProductCard extends StatelessWidget {
final Product product;
const ProductCard({Key? key, required this.product}) : super(key: key);
@override
Widget build(BuildContext context) {
return Card(
elevation: 4,
child: InkWell(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => ProductDetailScreen(product: product),
),
);
},
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Expanded(
child: Stack(
children: [
Hero(
tag: 'product-${product.id}',
child: Container(
decoration: BoxDecoration(
image: DecorationImage(
image: NetworkImage(product.imageUrl),
fit: BoxFit.cover,
),
),
),
),
Positioned(
top: 8,
right: 8,
child: IconButton(
icon: Icon(
product.isFavorite
? Icons.favorite
: Icons.favorite_border,
color: Colors.red,
),
onPressed: () {
context
.read<ProductProvider>()
.toggleFavorite(product.id);
},
),
),
],
),
),
Padding(
padding: EdgeInsets.all(8),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
product.name,
style: Theme.of(context).textTheme.titleMedium,
maxLines: 2,
overflow: TextOverflow.ellipsis,
),
SizedBox(height: 4),
Text(
'\$${product.price.toStringAsFixed(2)}',
style: Theme.of(context).textTheme.titleLarge?.copyWith(
color: Theme.of(context).primaryColor,
fontWeight: FontWeight.bold,
),
),
],
),
),
],
),
),
);
}
}
React Native: Task Management App
// App.tsx
import React, { useState, useEffect } from 'react';
import {
SafeAreaView,
StyleSheet,
Text,
View,
FlatList,
TextInput,
TouchableOpacity,
KeyboardAvoidingView,
Platform,
Alert,
} from 'react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import Icon from 'react-native-vector-icons/MaterialIcons';
// Task type definition
interface Task {
id: string;
title: string;
completed: boolean;
createdAt: Date;
}
// Storage key
const STORAGE_KEY = '@tasks';
// Stack navigator
const Stack = createNativeStackNavigator();
// Main screen
const TaskListScreen: React.FC = () => {
const [tasks, setTasks] = useState<Task[]>([]);
const [inputText, setInputText] = useState('');
const [filter, setFilter] = useState<'all' | 'active' | 'completed'>('all');
// Load tasks
useEffect(() => {
loadTasks();
}, []);
// Save tasks
useEffect(() => {
saveTasks();
}, [tasks]);
const loadTasks = async () => {
try {
const jsonValue = await AsyncStorage.getItem(STORAGE_KEY);
if (jsonValue != null) {
setTasks(JSON.parse(jsonValue));
}
} catch (e) {
console.error('Failed to load tasks:', e);
}
};
const saveTasks = async () => {
try {
await AsyncStorage.setItem(STORAGE_KEY, JSON.stringify(tasks));
} catch (e) {
console.error('Failed to save tasks:', e);
}
};
// Add task
const addTask = () => {
if (inputText.trim()) {
const newTask: Task = {
id: Date.now().toString(),
title: inputText.trim(),
completed: false,
createdAt: new Date(),
};
setTasks([newTask, ...tasks]);
setInputText('');
}
};
// Toggle task completion
const toggleTask = (id: string) => {
setTasks(
tasks.map(task =>
task.id === id ? { ...task, completed: !task.completed } : task
)
);
};
// Delete task
const deleteTask = (id: string) => {
Alert.alert(
'Delete Task',
'Are you sure you want to delete this task?',
[
{ text: 'Cancel', style: 'cancel' },
{
text: 'Delete',
style: 'destructive',
onPress: () => setTasks(tasks.filter(task => task.id !== id)),
},
]
);
};
// Filtering
const filteredTasks = tasks.filter(task => {
if (filter === 'active') return !task.completed;
if (filter === 'completed') return task.completed;
return true;
});
// Task item rendering
const renderTask = ({ item }: { item: Task }) => (
<TouchableOpacity
style={styles.taskItem}
onPress={() => toggleTask(item.id)}
onLongPress={() => deleteTask(item.id)}
>
<View style={styles.taskContent}>
<Icon
name={item.completed ? 'check-box' : 'check-box-outline-blank'}
size={24}
color={item.completed ? '#4CAF50' : '#757575'}
/>
<Text
style={[
styles.taskText,
item.completed && styles.taskTextCompleted,
]}
>
{item.title}
</Text>
</View>
</TouchableOpacity>
);
return (
<SafeAreaView style={styles.container}>
<KeyboardAvoidingView
behavior={Platform.OS === 'ios' ? 'padding' : 'height'}
style={styles.container}
>
{/* Header */}
<View style={styles.header}>
<Text style={styles.title}>My Tasks</Text>
<Text style={styles.subtitle}>
{tasks.filter(t => !t.completed).length} active
</Text>
</View>
{/* Filter */}
<View style={styles.filterContainer}>
{(['all', 'active', 'completed'] as const).map(f => (
<TouchableOpacity
key={f}
style={[
styles.filterButton,
filter === f && styles.filterButtonActive,
]}
onPress={() => setFilter(f)}
>
<Text
style={[
styles.filterText,
filter === f && styles.filterTextActive,
]}
>
{f.charAt(0).toUpperCase() + f.slice(1)}
</Text>
</TouchableOpacity>
))}
</View>
{/* Task list */}
<FlatList
data={filteredTasks}
renderItem={renderTask}
keyExtractor={item => item.id}
style={styles.taskList}
contentContainerStyle={styles.taskListContent}
/>
{/* Input field */}
<View style={styles.inputContainer}>
<TextInput
style={styles.input}
value={inputText}
onChangeText={setInputText}
placeholder="Add a new task..."
onSubmitEditing={addTask}
returnKeyType="done"
/>
<TouchableOpacity style={styles.addButton} onPress={addTask}>
<Icon name="add" size={24} color="#fff" />
</TouchableOpacity>
</View>
</KeyboardAvoidingView>
</SafeAreaView>
);
};
// Style definitions
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#f5f5f5',
},
header: {
padding: 20,
backgroundColor: '#fff',
borderBottomWidth: 1,
borderBottomColor: '#e0e0e0',
},
title: {
fontSize: 28,
fontWeight: 'bold',
color: '#333',
},
subtitle: {
fontSize: 16,
color: '#666',
marginTop: 4,
},
filterContainer: {
flexDirection: 'row',
padding: 10,
backgroundColor: '#fff',
borderBottomWidth: 1,
borderBottomColor: '#e0e0e0',
},
filterButton: {
paddingHorizontal: 16,
paddingVertical: 8,
marginHorizontal: 4,
borderRadius: 20,
backgroundColor: '#f0f0f0',
},
filterButtonActive: {
backgroundColor: '#2196F3',
},
filterText: {
color: '#666',
fontWeight: '500',
},
filterTextActive: {
color: '#fff',
},
taskList: {
flex: 1,
},
taskListContent: {
paddingVertical: 10,
},
taskItem: {
backgroundColor: '#fff',
marginHorizontal: 10,
marginVertical: 4,
padding: 16,
borderRadius: 8,
elevation: 2,
shadowColor: '#000',
shadowOffset: { width: 0, height: 1 },
shadowOpacity: 0.2,
shadowRadius: 1.41,
},
taskContent: {
flexDirection: 'row',
alignItems: 'center',
},
taskText: {
flex: 1,
fontSize: 16,
color: '#333',
marginLeft: 12,
},
taskTextCompleted: {
textDecorationLine: 'line-through',
color: '#999',
},
inputContainer: {
flexDirection: 'row',
padding: 10,
backgroundColor: '#fff',
borderTopWidth: 1,
borderTopColor: '#e0e0e0',
},
input: {
flex: 1,
height: 48,
backgroundColor: '#f5f5f5',
borderRadius: 24,
paddingHorizontal: 20,
fontSize: 16,
marginRight: 10,
},
addButton: {
width: 48,
height: 48,
borderRadius: 24,
backgroundColor: '#2196F3',
justifyContent: 'center',
alignItems: 'center',
},
});
// App root
export default function App() {
return (
<NavigationContainer>
<Stack.Navigator>
<Stack.Screen
name="TaskList"
component={TaskListScreen}
options={{ headerShown: false }}
/>
</Stack.Navigator>
</NavigationContainer>
);
}
Native Feature Integration (Camera Usage Example)
// Flutter: Camera feature
import 'package:camera/camera.dart';
import 'package:flutter/material.dart';
import 'package:path_provider/path_provider.dart';
import 'package:path/path.dart' as path;
class CameraScreen extends StatefulWidget {
@override
_CameraScreenState createState() => _CameraScreenState();
}
class _CameraScreenState extends State<CameraScreen> {
CameraController? _controller;
List<CameraDescription>? _cameras;
bool _isReady = false;
@override
void initState() {
super.initState();
_initializeCamera();
}
Future<void> _initializeCamera() async {
try {
_cameras = await availableCameras();
if (_cameras!.isNotEmpty) {
_controller = CameraController(
_cameras![0],
ResolutionPreset.high,
enableAudio: false,
);
await _controller!.initialize();
if (mounted) {
setState(() {
_isReady = true;
});
}
}
} catch (e) {
print('Error initializing camera: $e');
}
}
Future<void> _takePicture() async {
if (!_controller!.value.isInitialized) {
return;
}
try {
final Directory appDir = await getApplicationDocumentsDirectory();
final String picturePath = path.join(
appDir.path,
'${DateTime.now().millisecondsSinceEpoch}.jpg',
);
final XFile picture = await _controller!.takePicture();
await picture.saveTo(picturePath);
// Process the image (navigate to preview screen, etc.)
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => ImagePreviewScreen(imagePath: picturePath),
),
);
} catch (e) {
print('Error taking picture: $e');
}
}
@override
void dispose() {
_controller?.dispose();
super.dispose();
}
@override
Widget build(BuildContext context) {
if (!_isReady || _controller == null) {
return Scaffold(
body: Center(
child: CircularProgressIndicator(),
),
);
}
return Scaffold(
body: Stack(
children: [
CameraPreview(_controller!),
Positioned(
bottom: 50,
left: 0,
right: 0,
child: Center(
child: FloatingActionButton(
onPressed: _takePicture,
child: Icon(Icons.camera_alt),
backgroundColor: Colors.white,
foregroundColor: Colors.black,
),
),
),
],
),
);
}
}
Performance Optimization Techniques
// Flutter: Virtualized list and memory optimization
class OptimizedListView extends StatelessWidget {
final List<Item> items;
const OptimizedListView({Key? key, required this.items}) : super(key: key);
@override
Widget build(BuildContext context) {
return ListView.builder(
// Specify item count for efficiency
itemCount: items.length,
// Adjust cache extent
cacheExtent: 100,
// Item builder
itemBuilder: (context, index) {
return OptimizedListItem(
key: ValueKey(items[index].id),
item: items[index],
);
},
);
}
}
// Memoized list item
class OptimizedListItem extends StatelessWidget {
final Item item;
const OptimizedListItem({
Key? key,
required this.item,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Card(
margin: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: ListTile(
// Lazy loading and caching images
leading: CachedNetworkImage(
imageUrl: item.imageUrl,
placeholder: (context, url) => CircularProgressIndicator(),
errorWidget: (context, url, error) => Icon(Icons.error),
width: 50,
height: 50,
fit: BoxFit.cover,
),
title: Text(item.title),
subtitle: Text(item.description),
trailing: IconButton(
icon: Icon(Icons.favorite_border),
onPressed: () {
// Favorite handling
},
),
),
);
}
}