Hot Restart là cơ chế tải lại nhanh ứng dụng di động trong quá trình phát triển, trong đó ứng dụng khởi động lại hoàn toàn với mã nguồn được cập nhật. Không giống như biên dịch lại hoàn toàn, Hot Restart sử dụng mã nhị phân đã biên dịch sẵn và chỉ tải lại Dart VM, giúp giảm thời gian chu kỳ phát triển. Theo tài liệu Flutter (2025), một Hot Restart điển hình mất 1 đến 3 giây. Hot Restart đặc biệt hữu ích khi thay đổi trạng thái toàn cục của ứng dụng và mã khởi tạo.
Điểm chính
Hot Restart là cơ chế phát triển trong đó ứng dụng được tải lại hoàn toàn với mã nguồn được cập nhật mà không cần biên dịch lại toàn bộ dự án. Nhà phát triển thay đổi mã, lưu tệp và gửi lệnh khởi động lại qua IDE. Ứng dụng biên dịch lại các tệp đã thay đổi, khởi động lại Dart VM và trải qua toàn bộ vòng đời từ main đến kết xuất cuối cùng của giao diện người dùng.
Hot Restart khác với xây dựng lại hoàn toàn ở chỗ nó sử dụng các thư viện nhị phân đã biên dịch sẵn và framework Flutter mà không biên dịch lại các trình bao bọc gốc. Điều này giảm thời gian chu kỳ phát triển từ vài phút xuống còn vài giây. Theo khảo sát nhà phát triển Flutter (2024), thời gian Hot Restart trung bình là 2,1 giây, nhanh hơn khoảng 97% so với xây dựng lại toàn bộ dự án qua lệnh flutter build.
Cơ chế này đặc biệt được ưa chuộng khi phát triển giao diện người dùng cần kiểm tra thường xuyên các thay đổi trực quan. Nhà phát triển có thể thay đổi màu sắc, kích thước hoặc vị trí của một phần tử và xem kết quả ngay lập tức trên trình mô phỏng hoặc thiết bị thật mà không mất bối cảnh phát triển do biên dịch kéo dài. Điều này tăng tốc đáng kể việc tạo nguyên mẫu lặp.
Khi thực hiện lệnh Hot Restart, một chuỗi các thao tác diễn ra: lưu các tệp đã thay đổi, biên dịch tăng dần các tệp Dart đã thay đổi thành mã máy, khởi động lại Dart VM và thực thi lại điểm vào của ứng dụng. Dart VM là máy ảo thực thi mã Dart ở chế độ JIT (Just-In-Time) trong quá trình phát triển và AOT (Ahead-Of-Time) trong các bản dựng sản xuất.
Trong Hot Restart, ứng dụng trải qua một vòng đời hoàn chỉnh: gọi hàm main, khởi tạo WidgetsFlutterBinding, chạy runApp và xây dựng toàn bộ cây widget từ đầu. Tất cả trạng thái widget, biến và bộ nhớ đệm trước đó đều bị xóa. Điều này đảm bảo ứng dụng ở trạng thái sạch, hoàn toàn giống với trạng thái sau khi cài đặt mới trên thiết bị.
Quy trình có thể được biểu diễn như một chuỗi các bước: nhà phát triển nhấn nút Hot Restart trong IDE, công cụ Flutter gửi lệnh đến thiết bị, thiết bị lưu bộ khung ứng dụng hiện tại, khởi động lại Dart VM với mã mới và chạy lại main. Tất cả các phụ thuộc được đăng ký trong bộ chứa tiêm phụ thuộc đều được tạo lại từ đầu.
Một tính năng chính là mã nhị phân của lớp vỏ gốc (plugin, mã Kotlin, mã Swift) không bị biên dịch lại. Hot Restart chỉ ảnh hưởng đến lớp Dart của ứng dụng, đảm bảo tốc độ khởi động lại cao. Nếu thay đổi ảnh hưởng đến mã gốc, cần thực hiện flutter build đầy đủ.
Flutter sử dụng kiến trúc trong đó mã Dart chạy trên Dart VM và giao diện người dùng được kết xuất qua công cụ Skia hoặc Impeller. Trong Hot Restart, công cụ Flutter khởi động lại một thể hiện cô lập của Dart VM (isolate), tải các tệp .dill đã cập nhật (Dart Intermediate Language) và chạy lại hàm main. Toàn bộ giao diện người dùng được xây dựng lại từ đầu qua lời gọi runApp, đảm bảo tất cả các widget đều được cập nhật.
import 'package:flutter/material.dart';
void main() {
// Sau Hot Restart, hàm này được thực thi lại
var prefs = await SharedPreferences.getInstance();
var themeMode = prefs.getString('theme') ?? 'light';
runApp(MyApp(themeMode: themeMode));
}
Hot Restart và Hot Reload là hai cơ chế phát triển nhanh thường bị nhầm lẫn. Hot Reload tải các thay đổi vào ứng dụng đang chạy mà không mất trạng thái hiện tại, trong khi Hot Restart khởi động lại hoàn toàn ứng dụng. Hot Reload hoạt động nhanh hơn (0,1–1 giây) nhưng không áp dụng các thay đổi ảnh hưởng đến khởi tạo hoặc trường tĩnh của lớp.
Sự khác biệt chính là trạng thái ứng dụng. Hot Reload bảo toàn trạng thái hiện tại của widget: vị trí cuộn, dữ liệu đã nhập, cửa sổ phụ đang mở. Hot Restart đặt lại tất cả trạng thái về ban đầu. Nếu thay đổi chỉ ảnh hưởng đến mã trong phương thức build, Hot Reload là đủ. Nếu thay đổi ảnh hưởng đến main, biến toàn cục hoặc phụ thuộc, cần Hot Restart.
Hot Reload áp dụng thay đổi bằng cách tiêm mã đã cập nhật vào Dart VM mà không khởi động lại isolate. Điều này chỉ có thể đối với các thay đổi không phá vỡ cấu trúc kiểu và không yêu cầu khởi tạo lại widget. Trong Hot Restart, isolate khởi động lại hoàn toàn, cho phép áp dụng mọi thay đổi, bao gồm xóa hoặc đổi tên lớp và phương thức.
Theo nhóm Flutter, Hot Reload mất dưới 1 giây cho hầu hết các thay đổi, trong khi Hot Restart mất 1 đến 3 giây. Đối với khoảng 80% thay đổi giao diện người dùng, Hot Reload là đủ. Hot Restart cần thiết khi thay đổi cấu hình ứng dụng, biến toàn cục, plugin gốc trong lớp bọc Dart và quyết định kiến trúc.
Chiến lược sau được khuyến nghị: sử dụng Hot Reload cho các chỉnh sửa trực quan UI và thay đổi logic nhỏ; chuyển sang Hot Restart khi thay đổi cấu trúc dữ liệu, thêm phụ thuộc hoặc chỉnh sửa mã khởi tạo. Điều này giảm thiểu thời gian chờ và duy trì năng suất phát triển cao.
Cơ chế khởi động lại nóng được triển khai khác nhau tùy theo framework và ngôn ngữ lập trình. Flutter cung cấp triển khai Hot Restart trưởng thành nhất thông qua biên dịch JIT của Dart VM, trong khi React Native sử dụng cơ chế tương tự qua Metro Bundler và JavaScript Core hoặc Hermes.
Trong Flutter, Hot Restart được kích hoạt bằng lệnh r trong terminal sau khi khởi động ứng dụng qua flutter run. Thay vào đó, sử dụng nút Hot Restart trong Android Studio, VS Code hoặc IntelliJ IDEA. Hot Restart chỉ hoạt động ở chế độ debug và không khả dụng trong các bản dựng profile và release. Khi thực hiện, công cụ Flutter biên dịch lại các tệp đã thay đổi sang định dạng kernel và gửi chúng đến thiết bị.
// Trước Hot Restart: phiên bản cũ
class Counter extends StatefulWidget {
final int initialValue = 0;
// Sau Hot Restart: giá trị mới sẽ có hiệu lực
// final int initialValue = 10;
}
class CounterState extends State<Counter> {
int _count = 0;
// Hot Reload giữ _count, Hot Restart đặt lại về 0
}
Một hạn chế của Hot Restart trong Flutter là không thể bảo toàn trạng thái gỡ lỗi. Sau khi khởi động lại, tất cả các điểm dừng đều được giữ lại, nhưng giá trị biến trong trình gỡ lỗi bị đặt lại. Để bảo toàn trạng thái giữa các lần khởi động lại, cơ chế State Restoration được sử dụng.
Trong React Native, khởi động lại nóng được triển khai qua Metro Bundler, một trình đóng gói mô-đun JavaScript. Khi mã thay đổi, Metro xây dựng lại các mô-đun đã thay đổi và gửi gói đã cập nhật đến thiết bị. React Native hỗ trợ Fast Refresh, tương tự Hot Reload, bảo toàn trạng thái của các thành phần hàm bằng React hooks.
Khởi động lại hoàn toàn (Reload) trong React Native tải lại công cụ JavaScript và toàn bộ ứng dụng. Điều này hoàn toàn tương tự Hot Restart trong Flutter. Để kích hoạt, sử dụng Cmd+R trên trình mô phỏng iOS hoặc nhấn R hai lần trên Android. Thời gian khởi động lại hoàn toàn trong React Native thay đổi từ 2 đến 8 giây tùy thuộc vào kích thước gói.
Hot Restart là công cụ không thể thiếu trong một số kịch bản phát triển. Đầu tiên và rõ ràng nhất là thay đổi cấu hình toàn cục của ứng dụng: chủ đề, bản địa hóa, trình cung cấp trạng thái. Nếu bạn đã thay đổi trình cung cấp ở gốc cây widget hoặc thêm mô-đun mới vào bộ chứa DI, Hot Restart đảm bảo khởi tạo chính xác tất cả các thành phần.
Kịch bản thứ hai là thay đổi biến tĩnh và hằng số. Trong Dart, trường tĩnh được khởi tạo một lần khi lớp được tải. Hot Reload không áp dụng thay đổi cho trường tĩnh, vì vậy cần Hot Restart để cập nhật chúng. Điều này đặc biệt quan trọng khi làm việc với hằng số cấu hình, URL API và cờ tính năng.
Kịch bản thứ ba là gỡ lỗi khởi tạo: kiểm tra hoạt động của hàm main, màn hình khởi động, tải phụ thuộc. Với mỗi Hot Restart, ứng dụng trải qua một chu kỳ khởi tạo hoàn chỉnh, cho phép xác định các lỗi chỉ xảy ra khi khởi động — vấn đề với SharedPreferences, lỗi kết nối cơ sở dữ liệu, hết thời gian khởi tạo.
Kịch bản thứ tư là kiểm tra trạng thái rỗng. Hot Restart đặt lại tất cả trạng thái ứng dụng, cho phép kiểm tra hành vi khi khởi chạy lần đầu: hiển thị hướng dẫn, yêu cầu quyền, danh sách rỗng và màn hình chờ. Đối với kiểm tra lặp lại, điều này nhanh hơn đáng kể so với cài đặt lại ứng dụng.
Câu hỏi thường gặp
Hot Restart khởi động lại hoàn toàn ứng dụng và Dart VM, đặt lại trạng thái ban đầu. Hot Reload tiêm thay đổi vào ứng dụng đang chạy, bảo toàn trạng thái UI hiện tại. Hot Reload nhanh hơn nhưng không thể sử dụng cho thay đổi khởi tạo và biến toàn cục.
Trong terminal sau khi chạy flutter run, nhấn phím R (Shift+R) để Hot Restart. Trong Android Studio hoặc VS Code, sử dụng nút Hot Restart trên bảng gỡ lỗi. Lệnh chỉ khả dụng ở chế độ debug.
Một Hot Restart điển hình mất 1 đến 3 giây cho các dự án vừa. Thời gian phụ thuộc vào số lượng tệp Dart, độ phức tạp của cây widget và hiệu suất thiết bị. Đối với dự án lớn, thời gian có thể lên tới 5–8 giây.
Không, Hot Restart chỉ khả dụng ở chế độ debug. Các bản dựng release và profile sử dụng biên dịch AOT, không hỗ trợ tải lại nóng. Để cập nhật mã trong release, cần xây dựng lại hoàn toàn.
Hot Restart không ảnh hưởng đến mã gốc — plugin Kotlin, Swift hoặc Java. Nếu thay đổi được thực hiện trong mã gốc của plugin, cần xây dựng lại toàn bộ dự án. Hot Restart chỉ hiệu quả cho lớp Dart của ứng dụng.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm