Application ID và Package name trong Android

Giới thiệu Application ID và Package Name

Mỗi ứng dụng Android có một Application ID duy nhất, khi mới khởi tạo ứng dụng thì trông nó có vẻ giống như là Packaga Name của Java, ví dụ: com.example.myapp. ID duy nhất này định danh ứng dụng của bạn trên thiết bị và trên Google Play Store. Nếu bạn muốn upload một version mới của app thì bạn cần Application ID (và certificcate bạn đăng ký) phải trùng với APK gốc. Nếu bạn thay đổi Application ID thì Google Play Store sẽ coi APK như là một ứng dụng khác hoàn toàn. Cho nên một khi đã publish app thì bạn không nên thay đổi Application ID.

Application ID được định nghĩa với thuộc tính là applicationId ở file build.gradle của module như sau

 android {
    defaultConfig {
        applicationId "com.example.myapp"
        minSdkVersion 15
        targetSdkVersion 24
        versionCode 1
        versionName "1.0"
    }
    ...
}

Khi bạn tạo một ứng dụng mới trong Android Studio, applicationId giống hết với Java Package Name bạn chọn trong quá trình khở tạo. Tuy nhiên, Application IDPackage Name hoàn toàn độc lập về sau. Bạn có thể thay đổi Java Package Name (hay code packge name, code namespace) và điều này không hề ảnh hưởng tới Application ID, và ngược lại. Lưu ý lần nữa, bạn không nên thay đổi Application ID một khi bạn đã publish app. Việc thay đổi Package Name gây ra một vài ảnh hưởng mà bạn nên biết, điều này mới sẽ giới thiệu ở phần Thay đổi Package Name.

Và dù Application ID trông giống như là Java Package Name, nhưng quy tắc về tên của Application ID có hơi khác một chút:

  • Phải có ít nhất 2 phần (tương đương một hay nhiều dấu .).
  • Mỗi phần phải bắt đầu bằng một chữ cái.
  • Các kí tự phải là chữ, số hoặc gạch dưới [a-zA-Z0-9_]

Lưu ý: Application ID từng được dùng như là Code Package Name, cho nên một số API của Android sử dụng cụm package name trong các tên method và params, nhưng thực chất đây là Application ID. Ví dụ, method Context.getPackageName() sẽ trả về Application ID. Vì thế nên Code Package Name sẽ không cần dùng ở đâu khác ngoài code của app.

Thay đổi Application ID cho các bản build

Khi bạn build APK, build tools sẽ tag APK với Application ID được định nghĩa trong khối defaultConfig của file build.gradle (như bên trên). Tuy nhiên, nếu bạn muốn tạo nhiều version khác nhau cho ứng dụng trên Google Play Store, ví dụ như là một bản free và một bản pro. Bạn không cần phải tạo thêm một bản build khác tách rời mà có Application ID riêng.

Trong trường hợp này, mỗi bản build nên được định nghĩa với một product flavor. Với mỗi flavor trong khối productFlavors, bạn có thể định nghĩa thuộc tính applicationId riêng, hoặc bạn có thể chỉ cần thêm một phần nữa vào applicationId mặc định với thuộc tính applicationIdSuffix như sau:

android {
    defaultConfig {
        applicationId "com.example.myapp"
    }
    productFlavors {
        free {
            applicationIdSuffix ".free"
        }
        pro {
            applicationIdSuffix ".pro"
        }
    }
}

Bằng các này thì Application ID của product flavor free sẽ là com.example.myapp.free.

Bạn cũng có thể sử dụng applicationSuffixbuild type như sau:

android {
    ...
    buildTypes {
        debug {
            applicationIdSuffix ".debug"
        }
    }
}

Bởi vì Gradle áp dụng thiết lập build type sau product flavor cho nên lúc này Application ID cho bản build free debug sẽ là com.example.myapp.free.debug. Điều này là cần thiết nếu bạn muốn chạy cả hai bản debugrelease trên cùng một thiết bị, vì nếu không thêm như vậy thì hai bản build sẽ có cùng Application ID và không thể chạy cùng lúc trên một thiết bị như mong muốn.

Cảnh báo: Với các SDK tool trước đây, nếu bạn không định nghĩa thuộc tính applicationID ở trong file build.gradle, thì build tool sẽ dùng Package Name ở trong AndroidManifest.xml làm Application ID. Trong trường hợp này thì việc thay đổi Package Name sẽ làm thay đổi Application ID.

Mẹo: Nếu bạn cần sử dụng Application ID ở trong file AndroidManifest.xml thì bạn có thể dùng cụm ${applicationId}. Trong quá trình build thì Gradle sẽ thay thế cụm đó với Application ID thực sự. (Xem thêm)

Thay đổi Package Name

Dù lúc đầu tạo project thì mặc định Package Name trùng với Application ID, nhưng bạn có thể thay đổi nó. Tuy nhiên, nếu bạn muốn thay đổi Package Name thì bạn cần biết rằng Package Name được định nghĩa ở trong cấu trúc thư mục của project phải luôn trùng với thuộc tính package trong file AndroidManifest.xml như sau:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myapp"
    android:versionCode="1"
    android:versionName="1.0" >

Android build tools sẽ dùng thuộc tính package này cho hai việc như sau:

  • Áp dụng tên này làm namespace khi generate class R.java của ứng dụng. (Ví dụ: Với manifest trên, class R sẽ là com.example.myapp.R)
  • Dùng để tìm tên của các class liên quan được khai báo trong file manifest. (Ví dụ: Với manifest trên, một activity được khai báo là <activity android:name=".MainActivity"> sẽ được chuyển thành com.example.myapp.MainActivity). Do vậy giá trị của thuộc tính package cần phải luôn trùng với Project Package Name.

Nếu bạn muốn thay đổi Package Name hoàn thiện nhất, thì nhớ cập nhật giá trị thuộc tính package nữa. Nếu bạn dùng Android Studio để thay đổi Package Name thì nó sẽ tự động được cập nhật. Nếu giá trị trong thuộc tính packageProject Package Naeme không trùng nhau thì code của app sẽ không thể hiểu class R vì nó không cùng một package, khi đó thì manifest sẽ không xác định được các activity và component.

Một điều nữa cần phải biết: Dù cho bạn có thể có một tên cho thuộc tính package trong manifest và một tên khác cho applicationId trong build.gradle nhưng build tools sẽ copy Application ID vào file manifest cuối cùng của APK vào lúc cuối bản build. Cho nên nếu bạn kiểm tra file AndroidManifest.xml sau khi build thì đừng ngạc nhiên vì giá trị của thuộc tính package thay đổi. Thuộc tính package được Google Play Store và hệ điều hành Android dùng để xác định app, nên khi bản build đã dùng xong các giá trị gốc là namespace cho class R và tìm tên các class trong manifest thì giá trị của nó sẽ được thay lại bằng Application ID.

Nguồn

https://developer.android.com/studio/build/application-id.html

Bạn cũng có thể đọc thêm https://blog.stylingandroid.com/package-name-vs-application-id/ https://blog.mindorks.com/android-package-name-vs-application-id-ad95b08815a6 http://www.myandroidsolutions.com/2016/06/17/android-applicationid-packagename/#.WaLQxJMjFGW