Khi bắt đầu các dự án Android, chắc chắn các lập trình viên mobile sẽ phải làm việc với file AndroidManifest.xml. Đây là một thành phần không thể thiếu nằm trong nhóm tài nguyên dự án. Chúng ta sẽ cùng nhau tìm hiểu về loại file quan trọng này trong bài viết dưới đây nhé.

1. File AndroidManifest.xml là gì?

Chúng ta có thể hiểu đơn giản đây là file định nghĩa, kê khai mô tả thông tin thiết yếu về ứng dụng cho các công cụ xây dựng của Android, hệ điều hành Android và Google Play. Từ việc ứng dụng sử dụng Internet, dùng GPS để định vị, đọc thẻ nhớ gắn ngoài, truy cập Camera, sử Microphone ...v.v.. Dựa vào những định nghĩa này mà hệ thống sẽ cho phép bạn sử dụng các chức năng của hệ thống đồng thời cũng đưa ra câu hỏi cho end-user rằng liệu họ có nên cài đặt hay cho phần mềm sử dụng nó hay là không.

Bạn có thể thử check một ứng dụng của điện thoại Android trong phần thông tin (Information) ? Quyền truy cập (Permission). Ở đây mình sẽ thử với ứng dụng Tiktok trên điện thoại Samsung để xem nó có quyền gì nhé.

Ấn giữ vào biểu tượng Tiktok ? click vào chữ (i) góc trên bên phải ? click Permission

Như ta có thể thấy một Layout App permissions sẽ có 2 phần là Allowed đã chấp thuận có Music and audio và Photos and Videos, còn Not allowed không cho phép sử dụng Camera, Contacts, Location …. Thuận tiện cho người dùng có thể quản lý được ứng dụng và quyền hạn của nó. Qua trên, chúng ta có thể thấy tầm quan trọng không thể thiếu của file Android Manifest trên các ứng dụng Android, chúng ta sẽ tiếp tục tìm hiểu sâu hơn ở phần sau nhé.

>>> Xem thêm bài viết: Tìm hiểu về Custom Button trong Android

2. Tập làm quen với AndroidManifest.xml

Để bắt đầu, mình cùng click double vào một file AndroidManifest.xml thử ra xem có gì nhé. Điều đầu tiên khi đập vào mắt chúng ta có thể thấy là cấu trúc XML bố trí theo từng lớp dạng <a data=”Hello”></a> hay <b data=”Hi”/>

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

    <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.RECORD_AUDIO" />
    <uses-feature android:name="android.hardware.camera" android:required="false" />
    <application
        android:allowBackup="true"
        android:dataExtractionRules="@xml/data_extraction_rules"
        android:fullBackupContent="@xml/backup_rules"
        android:icon="@mipmap/ic_launcher"
        android:label="StringEE"
        android:supportsRtl="true"
        android:theme="@style/Theme.StringEE"
        tools:targetApi="31">
        <activity
            android:name=".MainActivity"
            android:exported="true"
            tools:ignore="MissingClass">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

Đây chỉ là một ví dụ rất nhỏ, một mẫu chung như sau:

<?xml version="1.0" encoding="utf-8"?>
<manifest>
    <uses-permission />
    <permission />
    <permission-tree />
    <permission-group />
    <instrumentation />
    <uses-sdk />
    <uses-configuration />
    <uses-feature />
    <supports-screens />
    <compatible-screens />
    <supports-gl-texture />

    <application>
        
        <activity>
            <intent-filter>
                <action />
                <category />
                <data />
            </intent-filter>
            <meta-data />
        </activity>

        <activity-alias>
            <intent-filter>. . .</intent-filter>
            <meta-data />
        </activity-alias>

        <service>
            <intent-filter>. . .</intent-filter>
            <meta-data />
        </service>

        <receiver>
            <intent-filter>. . .</intent-filter>
            <meta-data />
        </receiver>

        <provider>
            <grant-uri-permission />
            <meta-data />
            <path-permission />
        </provider>

        <uses-library />

    </application>
</manifest>

Nhìn khá là phức tạp phải không? Chúng ta từ từ bóc tách những thẻ chính trong files AndroidManifest.xml để tìm hiểu xem nó như thế nào nhé.

a. Thẻ manifest Như chúng ta có thể thấy ngay dưới thẻ định nghĩ file ?xml là thẻ bao bọc toàn bộ các thẻ con khác bên trong.

Trước đây nó chứa vài thông tin cấu hình cho ứng dụng, chúng ta có thể bắt gặp những cấu hình lạ trong các project cũ, nhưng do có sự ra đời của Gradle file (một file khởi tạo tài nguyên khác) đã có những cấu hình đó nên hiện tại không còn dùng đến trong Manifest nữa nên chúng ta sẽ không nói đến chúng ở trong bài này

  • xmlns:android: chúng ta có thể hiểu đây đơn giản là dòng khai báo namespace android. Sau khi khai báo nó thì các thẻ bên trong manifest này sẽ sử dụng được từ khóa android.
  • xmls:tools: tương tự như trên.

b. Thẻ uses-permission Quay trở lại hình chụp thứ 2 của ứng dụng tiktok bên trên bài viết, những quyền mà hệ thống hiển thị ra đều được lấy từ thẻ uses-permission này.

Một lưu ý cho những ứng dụng được viết trên Android 6.0 (marshmallow) hoặc cao hơn sẽ có popup hiện lên trong lần đầu tiên khi mà người dùng sử dụng đến chức năng (cũng có thể yêu cầu ngay từ đầu yêu cầu). Ví dụ như ứng dụng Instagram ở đây khi chúng ta sử dụng máy ảnh, ứng dụng sẽ phải hỏi người dùng như sau với 3 lựa chọn:Được quyền khi sử dụng app – chỉ lần này – không cho phép.

c. Thẻ permission Một số dữ liệu và mã trọng yếu cần được bảo vệ, tránh bị lạm dụng để thay đổi hay làm hỏng trải nghiệm của người dùng, Đây chính là lý do mà thẻ permission được sinh ra.

Ví dụ một số nguyền của Android định nghĩa:

android.permission.READ_EXTERNAL_STORAGE
android.permission.READ_OWNER_DATA
android.permission.SET_WALLPAPER
android.permission.WRITE_MEDIA_STORAGE
android.permission.DEVICE_POWER

Nếu một ứng dụng cần sử dụng một tính năng được bảo vệ bởi một quyền nào đó, nó sẽ phải khai báo rằng nó yêu cầu quyền đó cùng với thẻ trong lúc khai báo trên manifest. Và sau đó, khi ứng dụng được cài đặt trên điện thoại android, trình cài đặt sẽ xác định xem có quyền có được yêu cầu hay là không bằng cách kiểm tra các permission đã đăng ký của ứng dụng. Trong một số trường hợp cần thì hệ thống sẽ hỏi người dùng. Nếu quyền được cấp, ứng dụng có thể sử dụng các tính năng được bảo vệ. Nếu không, việc cố gắng thử truy cập các tính năng được hệ thống bảo vệ đó sẽ thất bại mà không có bất kỳ thông báo lại nào cho người dùng.

d. Thẻ application Một thẻ rất quan trọng khác mình sẽ giới thiệu trong khuôn khổ bài viết này. Đây là một thẻ liên quan đến việc cấu hình cho ứng dụng.

<application
    android:allowBackup="true"
    android:dataExtractionRules="@xml/data_extraction_rules"
    android:fullBackupContent="@xml/backup_rules"
    android:icon="@mipmap/ic_launcher"
    android:label="StringEE"
    android:supportsRtl="true"
    android:theme="@style/Theme.StringEE"
    tools:targetApi="31">
    <activity
        android:name=".MainActivity"
        android:exported="true"
        tools:ignore="MissingClass">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Chúng ta có thể nói sơ qua về các thuộc tính quan trọng như sau:

  • Android:allowBackup: với 2 thuộc tính bằng true | false chúng ta có thể cho ứng dụng back-up lại dữ liệu thông qua tài khoản Google Drive của người dùng với giới hạn là 25MB cho mỗi user mà không cần trả phí. Bạn có thể tìm hiểu thêm tại đây.
  • Android:icon: Đọc tên khá là dễ hiểu, chúng ta có thể thiết lập icon của ứng dụng tại đây, đây là icon hiển thị trên phần home của điện thoại. Như hình phía trên thì icon này được đặt trong thư mục mipmap.
  • Android:label: Với thuộc tính này chúng ta có thể đặt tên cho ứng dụng. Như bạn đã thấy, tên nó là “StringEE”. Sau khi build ứng dụng thì tên hiển thị của nó trên thiết bị di động sẽ tương ứng.
  • Android:supportsRtl: Như chúng ta có thể biết thì tiếng việt hay tiếng anh là ngôn ngữ left to right (LTR). Nhưng có thể bạn chưa biết thì một số nước trung đông/ Ả rập thì họ lại sử dụng ngôn ngữ right to left tức viết từ phải sang trái, mọi thứ sẽ đảo ngược lại với chúng ta như là soi gương vậy. Nếu thị trường ứng dụng của ta không liên quan tới họ chúng ta có thể set false ở đây.

e. Thẻ Activity Một thẻ con của thẻ application chắc hẳn nó là một mô tả nào đó của ứng dụng. Đúng vậy, đây là một thẻ nhằm mô tả các hành động chính của ứng dụng. Cần ít nhất một thẻ Activity trong mỗi ứng dụng. Tưởng tượng rằng khi bạn mở ứng dụng lên thì cái đầu tiên hiện lên trước mặt bạn đó chính là activity. Hay như khi bạn sử dụng ứng dụng Facebook, bạn ấn vào trang cá nhân của ai đó rồi nó chuyển qua một trang khác thì nó cũng là một activity. Ở khuôn khổ của bài viết này Stringee sẽ chỉ giới thiệu và giải thích cho bạn về khái niệm này.

Tổng kết

Như vậy qua bài viết về AndroidManifest.xml chúng ta đã hiểu được nó là gì, nó dùng để làm gì hay nó sẽ được cài đặt như thế nào. Tuy chỉ ở mức độ nhập môn nhưng các kiến thức này sẽ là nền tảng để bạn bắt đầu vào ứng dụng đầu tiên của mình. Một số thẻ Stringee đã không đề cập ở bài này vì nó cần những kiến thức khác như <service>, <receiver>, <provider>, <intent-filter>. Bạn có thể tìm hiểu thêm tại đây. Stringee hy vọng bài viết này sẽ hữu ích cho bạn.


Stringee Communication APIs là giải pháp cung cấp các tính năng giao tiếp như gọi thoại, gọi video, tin nhắn chat, SMS hay tổng đài CSKH cho phép tích hợp trực tiếp vào ứng dụng/website của doanh nghiệp nhanh chóng. Nhờ đó giúp tiết kiệm đến 80% thời gian và chi phí cho doanh nghiệp bởi thông thường nếu tự phát triển các tính năng này có thể mất từ 1 - 3 năm.

Bộ API giao tiếp của Stringee hiện đang được tin dùng bởi các doanh nghiệp ở mọi quy mô, lĩnh vực ngành nghề như TPBank, VOVBacsi24, VNDirect, Shinhan Finance, Ahamove, Logivan, Homedy,  Adavigo, bTaskee…

Quý bạn đọc quan tâm xin mời đăng ký NHẬN TƯ VẤN TẠI ĐÂY: