Để đóng gói ứng dụng web HTML5 thành file APK Android có thể cài đặt, bạn có thể dùng WebView trong dự án Android native, hoặc các framework hiện đại hơn.
Cách truyền thống: Android Studio + WebView (Java/Kotlin)
1. Tạo project Android mới
Mở Android Studio → New Project → "Empty Views Activity" (không phải Compose).
2. Cấu hình WebView trong Layout
<!-- res/layout/activity_main.xml -->
<WebView
android:id="@+id/webview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
3. Cấu hình MainActivity
// MainActivity.java
package com.example.myhtml5app;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;
public class MainActivity extends AppCompatActivity {
private WebView webView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = findViewById(R.id.webview);
WebSettings settings = webView.getSettings();
// BẮT BUỘC: Bật JavaScript
settings.setJavaScriptEnabled(true);
// Tùy chọn: Hỗ trợ zoom, localStorage, v.v.
settings.setDomStorageEnabled(true);
settings.setDatabaseEnabled(true);
settings.setAllowFileAccessFromFileURLs(true);
settings.setAllowUniversalAccessFromFileURLs(true);
// Load file từ assets (offline app)
webView.loadUrl("file:///android_asset/index.html");
// HOẶC load từ URL (online app)
// webView.loadUrl("https://your-website.com");
// Giữ link trong app (không mở trình duyệt ngoài)
webView.setWebViewClient(new WebViewClient() {
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url) {
view.loadUrl(url);
return true;
}
});
}
@Override
public void onBackPressed() {
if (webView.canGoBack()) {
webView.goBack();
} else {
super.onBackPressed();
}
}
}
4. Copy file HTML/CSS/JS vào assets
- Tạo thư mục
app/src/main/assets/(nếu chưa có). - Copy toàn bộ file HTML, CSS, JS, ảnh, font vào đây.
- File chính đặt tên
index.html.
5. Cấp quyền Internet (nếu load URL online)
<!-- AndroidManifest.xml --> <uses-permission android:name="android.permission.INTERNET" />
Cách hiện đại: Framework Cross-platform (Khuyên dùng)
| Framework | Ngôn ngữ | Ưu điểm |
|---|---|---|
| Capacitor (Ionic) | JS/TS + Native | Hiện đại, plugin phong phú, PWA ready, maintain bởi Ionic |
| Cordova/PhoneGap | JS + Native | Cũ, community lớn, nhưng ít maintain |
| React Native + WebView | React/JS | Chia sẻ code React web |
| Flutter + WebView | Dart | Hiệu năng cao, UI đẹp |
| Tauri | Rust + Web | Binary nhỏ, bảo mật, desktop + mobile (beta) |
Ví dụ Capacitor (Nhanh nhất)
# 1. Cài đặt npm init @capacitor/app my-html5-app cd my-html5-app # 2. Build web app (nếu dùng Vite/React/Vue) npm run build # 3. Thêm platform Android npx cap add android # 4. Copy web build vào native npx cap copy android # 5. Mở Android Studio npx cap open android # 6. Build APK/AAB trong Android Studio
So sánh nhanh
| Tiêu chí | WebView Native | Capacitor/Cordova |
|---|---|---|
| Độ phức tạp | Thấp (code Java/Kotlin) | Trung bình (CLI + config) |
| Truy cập API native | Viết bridge thủ công | Plugin sẵn có (Camera, GPS, Push...) |
| Cập nhật | Phát hành APK mới | CodePush / Live Update có thể |
| App Store | Được chấp nhận | Được chấp nhận |
Lưu ý quan trọng
- Google Play yêu cầu targetSdkVersion mới (API 33+ hiện nay).
- App chỉ là WebView có thể bị từ chối nếu không cung cấp giá trị native (offline, push notification, hardware access).
- Test kỹ trên nhiều kích thước màn hình, Android version.
- Xử lý deep link, back button, lifecycle (pause/resume).