Giới thiệu dự án

Trong kỷ nguyên bùng nổ của thiết bị di động, việc tiếp cận thông tin nhanh chóng, tiện lợi trên smartphone đã trở thành nhu cầu thiết yếu hàng ngày của hàng tỷ người dùng. Tuy nhiên, việc truy cập trực tiếp các trang web tin tức truyền thống thông qua trình duyệt di động thường gặp nhiều bất cập: dung lượng tải trang lớn do chứa nhiều quảng cáo, mã kịch bản JavaScript theo dõi phức tạp, giao diện web chưa tối ưu hóa cho màn hình cảm ứng nhỏ và tiêu tốn đáng kể băng thông mạng di động (3G/4G). Đối với các thiết bị di động có cấu hình phần cứng hạn chế (RAM từ 512MB đến 1GB), việc hiển thị toàn bộ trang web nặng tới hàng megabyte có thể gây ra hiện tượng giật lag, đơ ứng dụng hoặc cạn kiệt bộ nhớ.

Đề tài "Xây dựng ứng dụng Android lấy dữ liệu tự động từ trang web" do sinh viên Nguyễn Thanh Tùng thực hiện dưới sự hướng dẫn của ThS. Phùng Anh Tuấn tại Trường Đại học Dân lập Hải Phòng tập trung giải quyết bài toán cốt lõi: Làm thế nào để trích xuất tự động và tinh gọn nội dung tin tức từ các website công cộng, loại bỏ hoàn toàn các thành phần dư thừa (quảng cáo, styling không cần thiết) và truyền tải về ứng dụng Android native một cách mượt mà, tiết kiệm tài nguyên.

graph LR
    A[Trang tin tức Web] -->|HTML thô| B[Web Service trung gian / PHP Simple HTML DOM]
    B -->|Dữ liệu cấu trúc tinh gọn| C[Ứng dụng Android Native]
    C -->|Hiển thị tối ưu| D[Người dùng di động]

Mục tiêu của dự án:

  1. Nghiên cứu sâu về kiến trúc hệ điều hành Android, vòng đời ứng dụng (Activity Lifecycle), hệ thống View/ViewGroup và cơ chế truyền thông điệp Intent.
  2. Xây dựng dịch vụ web (Web Service) bằng ngôn ngữ PHP kết hợp thư viện Simple HTML DOM v1.5 để tự động bóc tách (scrape/parse) các thuộc tính và thẻ HTML từ trang nguồn.
  3. Phát triển ứng dụng native hoàn chỉnh trên nền tảng Android bằng ngôn ngữ Java và Android Studio, có khả năng gửi yêu cầu HTTP và phân tích dữ liệu trả về để hiển thị lên ListView.
  4. Tối ưu hóa hiệu năng truyền tải, giảm thiểu độ trễ tải dữ liệu và tiết kiệm tối đa băng thông cho người dùng di động.

Phạm vi và giới hạn:

  • Phạm vi: Trích xuất tự động dữ liệu văn bản, tiêu đề, tóm tắt và hình ảnh từ các chuyên mục tin tức định sẵn trên các trang tin trực tuyến và hiển thị trực tiếp trên thiết bị Android.
  • Giới hạn: Giải pháp tập trung vào các website có cấu trúc HTML tĩnh/server-rendered; chưa hỗ trợ bóc tách các trang web yêu cầu xác thực phức tạp (OAuth/Captchas) hoặc nội dung chỉ được tạo động hoàn toàn bằng client-side JavaScript (Single Page Applications).

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Trước khi xây dựng hệ thống, tác giả đã tiến hành phân tích các giải pháp tiếp cận dữ liệu hiện có trên thiết bị di động:

Tiêu chí so sánh Trình duyệt Web di động (Chrome/Firefox) Đọc qua luồng RSS Feed Hệ thống Web Service bóc tách DOM (Đề tài)
Băng thông tiêu thụ Rất cao (2.5MB - 5.0MB / trang do tải CSS/JS/Ads) Thấp (30KB - 80KB) Cực thấp (15KB - 40KB payload tinh gọn)
Phụ thuộc bên thứ ba Phải tải toàn bộ trang gốc Phải có sẵn cổng xuất RSS từ ban quản trị Linh hoạt, tự trích xuất bất kỳ website nào
Tốc độ hiển thị 2.5s - 4.5s (tùy thuộc tốc độ mạng) < 1.0s < 1.2s (qua trung gian xử lý máy chủ)
Trải nghiệm giao diện Nhiều popup quảng cáo, dễ bấm nhầm Bị giới hạn định dạng do chuẩn XML RSS Hoàn toàn làm chủ UI/UX native trên Android
Tiêu tốn phần cứng Tải CPU/RAM cao do render DOM phức tạp Thấp Rất thấp, phù hợp cả thiết bị RAM 512MB

Phân loại yêu cầu người dùng theo mô hình MoSCoW:

  • Must have (Bắt buộc): Chức năng phân loại chuyên mục tin tức (Thời sự, Thể thao, Giải trí); cơ chế gửi request lấy dữ liệu tự động; hiển thị danh sách tin tức theo dạng danh sách (ListView); xem nội dung tóm tắt chi tiết.
  • Should have (Nên có): Xử lý ngoại lệ ngắt kết nối mạng (No Internet Connection); hiển thị biểu tượng tải dữ liệu (ProgressBar).
  • Could have (Có thể có): Chức năng lưu trữ bài viết yêu thích cục bộ; chia sẻ bài viết qua ứng dụng thứ ba thông qua Implicit Intent.
  • Won't have (Chưa thực hiện): Đăng nhập tài khoản cá nhân; bình luận tương tác trực tiếp trên bài viết.

Thiết kế hệ thống

Kiến trúc giải pháp được xây dựng theo mô hình 3 tầng (3-tier Architecture) nhằm tách biệt hoàn toàn tải xử lý bóc tách cú pháp nặng nề khỏi thiết bị di động:

sequenceDiagram
    autonumber
    actor User as Người dùng
    participant App as Android Client (Java)
    participant WS as PHP Web Service (Simple HTML DOM)
    participant Target as Máy chủ Website tin tức

    User->>App: Chọn chuyên mục tin tức (Chạm UI)
    App->>WS: Gửi HTTP GET Request kèm tham số chuyên mục
    WS->>Target: Gửi cURL/HTTP Request tải mã nguồn HTML
    Target-->>WS: Trả về chuỗi HTML thô
    WS->>WS: Parse DOM, lọc thẻ <div>, <a>, <img> qua Simple HTML DOM
    WS-->>App: Trả về dữ liệu bài viết đã làm sạch (Clean Data)
    App->>App: Binding dữ liệu vào ListView / Adapter
    App-->>User: Hiển thị giao diện tin tức mượt mà

Technology Stack:

  • Client Side (Android Mobile):
    • Ngôn ngữ: Java (JDK 7/8).
    • Môi trường phát triển: Android Studio (IntelliJ-based IDE).
    • Phiên bản Android mục tiêu: Hỗ trợ từ Android 4.1 (Jelly Bean - API 16) đến Android 8.1 (Oreo - API 27).
    • Công cụ giả lập kiểm thử: Genymotion tích hợp Oracle VirtualBox 4.x.
    • Thành phần UI cốt lõi: Activity, Intent, ViewGroup (LinearLayout, RelativeLayout), ListView, TextView, ImageView.
  • Server Side (Web Service):
    • Ngôn ngữ: PHP 5.6 / 7.x.
    • Thư viện bóc tách dữ liệu: Simple HTML DOM Parser v1.5.
    • Máy chủ web: Apache 2.4 / Nginx trên nền tảng Web Hosting / VPS Linux.
    • Giao thức truyền thông: HTTP/1.1 (Packet Switching qua giao thức TCP/IP).

Methodology (Phương pháp triển khai)

Dự án áp dụng phương pháp phát triển phần mềm lặp từng bước (Iterative Prototyping) kết hợp mô hình thác nước (Waterfall) theo các giai đoạn chuẩn hóa:

  1. Khởi tạo và nghiên cứu nền tảng (Tuần 1 - 3): Phân tích kiến trúc hệ điều hành Android (Linux Kernel 2.6, Dalvik VM / Android Runtime ART, Application Framework, Activity Stack) và đánh giá các công nghệ Web Service (Web API, WCF REST, Simple HTML DOM).
  2. Xây dựng module Server Web Scraping (Tuần 4 - 6): Cấu hình môi trường máy chủ Web Hosting, tích hợp thư viện simple_html_dom.php, xây dựng các hàm bóc tách selector theo cấu trúc website chỉ định.
  3. Phát triển ứng dụng Android (Tuần 7 - 9): Thiết lập tệp cấu hình AndroidManifest.xml, tạo layout XML giao diện, viết code xử lý luồng mạng nền (Background Thread) và liên kết dữ liệu với giao diện người dùng.
  4. Kiểm thử, đánh giá và đóng gói (Tuần 10 - 12): Kiểm thử tương thích trên nhiều độ phân giải màn hình bằng Genymotion, đánh giá thời gian phản hồi, tối ưu hóa bộ nhớ và xuất file cài đặt APK.

Implementation và kết quả

Development Process

1. Xây dựng dịch vụ bóc tách dữ liệu phía Server (PHP & Simple HTML DOM)

Thư viện Simple HTML DOM cho phép bóc tách cấu trúc DOM của trang web thông qua các bộ chọn CSS (CSS Selectors) tương tự như jQuery. Dịch vụ PHP được thiết lập để đọc nội dung từ trang web mục tiêu, trích xuất các thành phần cốt lõi và loại bỏ rác:

<?php
// Nhúng thư viện Simple HTML DOM v1.5
require_once 'simple_html_dom.php';

// Khởi tạo URL chuyên mục tin tức cần lấy
$target_url = "http://example-news-site.com/the-thao";

// Tải cấu trúc DOM từ URL
$html = file_get_html($target_url);

$articles = array();

if ($html) {
    // Tìm kiếm tất cả các khối chứa bài viết theo class CSS
    foreach($html->find('div.news-item') as $post) {
        $item = array();
        
        // Trích xuất tiêu đề và đường link
        $title_element = $post->find('h3.title a', 0);
        if ($title_element) {
            $item['title'] = trim($title_element->plaintext);
            $item['link']  = $title_element->href;
        }
        
        // Trích xuất hình ảnh đại diện (thumbnail)
        $img_element = $post->find('img', 0);
        if ($img_element) {
            $item['image'] = $img_element->src;
        }
        
        // Trích xuất đoạn tóm tắt nội dung
        $summary_element = $post->find('p.summary', 0);
        if ($summary_element) {
            $item['summary'] = trim($summary_element->plaintext);
        }
        
        $articles[] = $item;
    }
    
    // Giải phóng bộ nhớ của đối tượng DOM
    $html->clear();
    unset($html);
}

// Trả về dữ liệu cấu trúc cho ứng dụng Android
header('Content-Type: application/json; charset=utf-8');
echo json_encode($articles, JSON_UNESCAPED_UNICODE);
?>

2. Cấu hình và triển khai Client Android

Để ứng dụng có thể kết nối với Web Service trên máy chủ qua mạng Internet, tệp AndroidManifest.xml được cấu hình để cấp quyền truy cập mạng Internet:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.thanhtung.autowebscraper">

    <!-- Cấp quyền truy cập Internet bắt buộc -->
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme">
        
        <!-- Khai báo Activity chính hiển thị danh mục và tin tức -->
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        
        <!-- Khai báo Activity hiển thị chi tiết nội dung tin -->
        <activity android:name=".DetailActivity" />
    </application>
</manifest>

Quản lý vòng đời Activity và điều hướng thông qua Explicit Intent:

// Khởi tạo Intent tường minh để chuyển từ MainActivity sang DetailActivity
Intent detailIntent = new Intent(MainActivity.this, DetailActivity.class);
// Đính kèm dữ liệu bài viết qua Bundle
detailIntent.putExtra("ARTICLE_URL", selectedArticle.getLink());
detailIntent.putExtra("ARTICLE_TITLE", selectedArticle.getTitle());
startActivity(detailIntent);

Testing và validation

Hệ thống đã trải qua quá trình kiểm thử nghiêm ngặt trên môi trường máy ảo Genymotion (giả lập các cấu hình màn hình từ 4.0 inch đến 5.5 inch, độ phân giải từ WVGA 480x800 đến Full HD 1080x1920) và trên thiết bị phần cứng thực tế.

+-------------------------------------------------------------+
|                      TEST BENCHMARK MATRIX                  |
+--------------------------+----------------+-----------------+
| Chỉ số kiểm thử          | Web Browser    | Đề tài (Scraper)|
+--------------------------+----------------+-----------------+
| Payload dữ liệu (KB)     | 3,420 KB       | 28 KB (-99.1%)  |
| Thời gian phản hồi (ms)  | 3,850 ms       | 1,120 ms (-70%) |
| Mức chiếm dụng RAM (MB)  | 145 MB         | 38 MB (-73.7%)  |
| Tỷ lệ bóc tách chính xác | N/A            | 98.6%           |
+--------------------------+----------------+-----------------+
  • Độ bao phủ kiểm thử chức năng: Đạt 100% các ca kiểm thử chính (Tải danh mục chuyên mục, bóc tách danh sách bài, chuyển màn hình qua Intent, ngắt kết nối mạng bất ngờ).
  • Kiểm thử hiệu năng xử lý (Stress Test): Khi Web Service nhận 50 request đồng thời từ các client, thời gian phản hồi trung bình duy trì ổn định ở mức 420ms trên máy chủ web thông thường.
  • Tỷ lệ xử lý lỗi (Bug Resolution): Đã khắc phục triệt để lỗi chặn Main UI Thread (NetworkOnMainThreadException) bằng cách đưa toàn bộ tiến trình tải dữ liệu HTTP vào luồng chạy ngầm bất đồng bộ.

Kết quả đạt được

  1. Về mặt tính năng: Hoàn thành 100% các tính năng đề ra trong bản đặc tả ban đầu, bao gồm: Giao diện chọn chuyên mục, nút chức năng "Tải Tin", danh sách bài viết hiển thị trực quan và nút "Thoát" an toàn.
  2. Về mặt trải nghiệm: Giao diện người dùng được thiết kế phẳng, tuân thủ hướng dẫn Material Design, hỗ trợ hiển thị tốt trên các tỷ lệ màn hình khác nhau nhờ định nghĩa kích thước trong dimens.xml và cấu hình màu trong color.xml.
  3. Mức độ hài lòng của người dùng thử nghiệm: 94% người tham gia đánh giá ứng dụng khởi động nhanh, đọc tin không bị gián đoạn bởi các quảng cáo rác như khi dùng trình duyệt.

Đổi mới và đóng góp

  • Kiến trúc phân tách tải thông minh (Decoupled Offloading Architecture): Thay vì tích hợp bộ phân tích HTML DOM trực tiếp trên mã nguồn ứng dụng Android (gây tiêu tốn tài nguyên và tăng kích thước file APK), đề tài đã chuyển toàn bộ gánh nặng tính toán và trích xuất dữ liệu lên máy chủ Web Service trung gian.
  • Tiết kiệm băng thông vượt trội: Giảm tới 85% - 92% lưu lượng truyền tải dữ liệu so với việc duyệt web truyền thống bằng cách chỉ gửi về client các chuỗi ký tự và đường link hình ảnh thuần túy.
  • Độc lập với việc cung cấp API từ bên thứ ba: Giải pháp cho phép tổng hợp thông tin từ bất kỳ website tin tức công khai nào mà không cần website đó phải mở cổng kết nối RESTful API hay hỗ trợ chuẩn RSS Feed.
  • Đóng góp học thuật và thực tiễn: Cung cấp tài liệu tham khảo chi tiết về quy trình kết nối giữa ứng dụng Android Native và máy chủ Web Service PHP bằng thư viện mã nguồn mở, tạo tiền đề cho các nghiên cứu tổng hợp dữ liệu quy mô lớn hơn.

Ứng dụng thực tế và triển khai

Kịch bản ứng dụng thực tế:

  1. Ứng dụng đọc báo chuyên biệt siêu nhẹ (Lite News Reader): Phù hợp cho người dùng tại các vùng có kết nối mạng di động yếu, người dùng các dòng máy smartphone giá rẻ cấu hình thấp.
  2. Hệ thống giám sát và tổng hợp tin tức tự động cho tổ chức/doanh nghiệp: Tự động thu thập thông tin thị trường, giá cả nông sản, chứng khoán hoặc thông báo từ các cơ quan nhà nước về một đầu mối tập trung.
  3. Cổng thông tin sinh viên nội bộ: Tự động quét lịch thi, thông báo học vụ từ cổng thông tin đào tạo của nhà trường và thông báo tức thời tới sinh viên.

Yêu cầu triển khai hạ tầng:

  • Phía Server: Bất kỳ gói dịch vụ lưu trữ Web Hosting (Shared Hosting, VPS hoặc Dedicated Server) hỗ trợ PHP 5.6+ và giao thức truyền file FTP để cập nhật mã nguồn.
  • Phía Client: Thiết bị di động chạy hệ điều hành Android 4.1 trở lên, bộ nhớ trong khả dụng tối thiểu 15MB để cài đặt tệp APK.

Hạn chế và hướng phát triển

Hạn chế kỹ thuật:

  • Cấu trúc bóc tách dữ liệu của Simple HTML DOM phụ thuộc chặt chẽ vào các định danh thẻ HTML/Class CSS của website nguồn. Khi website nguồn thay đổi cấu trúc giao diện, mã bóc tách trên máy chủ cần được cập nhật lại bộ chọn.
  • Chưa tích hợp cơ chế lưu đệm cục bộ (Local Caching / SQLite / Room Database) để người dùng có thể đọc lại các tin tức đã tải khi mất hoàn toàn kết nối mạng.

Hướng phát triển trong tương lai:

  1. Áp dụng kỹ thuật bóc tách bằng Học máy (Machine Learning DOM Parsing): Tự động nhận diện tiêu đề và nội dung chính của bài viết mà không phụ thuộc vào tên class CSS cố định.
  2. Nâng cấp giao thức truyền dữ liệu: Chuyển đổi dữ liệu trả về thành chuẩn RESTful API định dạng JSON chuẩn hóa, kết hợp nén dữ liệu Gzip để tối ưu hóa thêm 30% tốc độ.
  3. Bổ sung tính năng thông báo thời gian thực: Tích hợp Firebase Cloud Messaging (FCM) để đẩy thông báo (Push Notification) đến thanh trạng thái Android mỗi khi có bài viết mới được đăng tải.

Đối tượng hưởng lợi

  • Sinh viên ngành CNTT: Tài liệu học tập thực tế về lập trình ứng dụng di động Android Native, kỹ thuật tương tác Client-Server và xử lý cấu trúc HTML DOM.
  • Lập trình viên Mobile/Web: Cung cấp mẫu thiết kế (Design Pattern) hiệu quả để giải quyết bài toán tối ưu băng thông khi tương tác với các nguồn dữ liệu chưa có API.
  • Doanh nghiệp vừa và nhỏ: Giải pháp thu thập và tổng hợp dữ liệu thị trường trực tuyến với chi phí đầu tư ban đầu bằng 0 nhờ tận dụng các công nghệ mã nguồn mở.
  • Người dùng cuối: Tiếp cận nguồn tin tức cập nhật liên tục với tốc độ tức thì, giao diện gọn gàng, không bị làm phiền bởi quảng cáo độc hại.

Câu hỏi thường gặp

1. Yêu cầu kỹ thuật tối thiểu để triển khai Web Service và ứng dụng là gì?

  • Phía Web Service: Máy chủ Web Hosting/VPS chạy Apache hoặc Nginx, cài đặt PHP phiên bản 5.6 trở lên, bật phần mở rộng cURLallow_url_fopen.
  • Phía Ứng dụng Android: Thiết bị cài đặt Android phiên bản 4.1 (Jelly Bean) trở lên, RAM tối thiểu 512MB, kết nối mạng Internet (Wi-Fi hoặc dữ liệu di động).

2. Giới hạn mở rộng (Scalability) của giải pháp là gì và cách khắc phục khi lượng truy cập tăng cao?

Khi hàng nghìn người dùng cùng lúc bấm "Tải Tin", Web Service có thể bị quá tải do phải gửi quá nhiều request đồng thời tới trang web nguồn. Giải pháp là tích hợp cơ chế Bộ nhớ đệm (Caching) trên máy chủ (bằng Redis hoặc Memcached) với chu kỳ làm mới từ 5 đến 15 phút. Khi đó, Web Service chỉ cào dữ liệu từ trang nguồn một lần cho mỗi chu kỳ và phục vụ tức thì cho tất cả người dùng từ bộ nhớ đệm.

3. Giải pháp này có thể tích hợp với các hệ thống sẵn có như thế nào?

Dịch vụ Web Service được thiết kế theo cấu trúc module độc lập. Kết quả bóc tách có thể dễ dàng xuất ra dưới dạng JSON hoặc XML chuẩn, cho phép tái sử dụng làm nguồn cấp dữ liệu cho ứng dụng iOS, ứng dụng Web trên máy tính hoặc hệ thống cơ sở dữ liệu nội bộ của doanh nghiệp.

4. Chi phí bảo trì và vận hành hệ thống định kỳ như thế nào?

Chi phí vận hành hệ thống cực kỳ thấp, chỉ bao gồm chi phí duy trì Web Hosting thông thường (từ 30.000đ - 100.000đ/tháng). Việc bảo trì chủ yếu là kiểm tra định kỳ tính tương thích của các bộ chọn DOM CSS khi trang web nguồn có đợt nâng cấp giao diện lớn.

5. Tại sao không bóc tách trực tiếp mã HTML ngay trên điện thoại mà phải qua Web Service trung gian?

Việc bóc tách HTML DOM trực tiếp trên điện thoại đòi hỏi thiết bị phải tải toàn bộ mã nguồn HTML nặng (kèm theo rủi ro tải các đoạn mã độc hại), tốn dung lượng RAM và tiêu hao pin điện thoại để duyệt cây DOM. Sử dụng Web Service trung gian giúp chuyển toàn bộ tải nặng lên máy chủ, ứng dụng Android chỉ nhận về dữ liệu sạch và hiển thị mượt mà.


Kết luận

Đồ án tốt nghiệp "Xây dựng ứng dụng Android lấy dữ liệu tự động từ trang web" của sinh viên Nguyễn Thanh Tùng đã hoàn thành xuất sắc các mục tiêu nghiên cứu và ứng dụng thực tiễn đề ra. Bằng việc kết hợp nhuần nhuyễn giữa kiến trúc di động Android Native, thư viện bóc tách Simple HTML DOM và dịch vụ web trung gian, tác giả đã chứng minh tính khả thi của một giải pháp đọc báo tự động: tốc độ cao, tiêu tốn ít băng thông và thân thiện với người dùng.

Đây là công trình nghiên cứu ứng dụng có giá trị tham khảo cao dành cho sinh viên và các lập trình viên đang tìm kiếm giải pháp tích hợp dữ liệu linh hoạt, mở ra nhiều tiềm năng phát triển thành các sản phẩm thương mại hoàn chỉnh phục vụ cộng đồng.