Application ID và Package name trong Android
This post hasn't been updated for 7 years
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 ID
và Package 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 applicationSuffix
ở build 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 debug
và release
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
khigenerate class R.java
của ứng dụng. (Ví dụ: Với manifest trên, classR
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ànhcom.example.myapp.MainActivity
). Do vậy giá trị của thuộc tínhpackage
cần phải luôn trùng vớiProject 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 package
và Project 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
All Rights Reserved