Android應用開發中的applicationId與package

2021-03-27

關鍵字:


 

每一個Android應用都有一個“唯一身份標識”,即ID號。也即是本文標題中的 applicationId。

 

而 package 則是定義在 AndroidManifest.xml 中用於區分不同代碼相對位置的。package的命名都是按目錄層級結構走的。如下圖所示:

  

在Android系統中,想要定位到某一具體的應用,我們需要 applicationId。想要定位到某一具體的應用的某個組件(Activity, Service, Provider, Receiver),我們則需要 applicationId + package。

 

在早期的APK開發中(簡單理解成Android Studio尚未發佈的時候),applicationId與package的值是相同的,且一般都關注不到applicationId屬性,於是我們很自然的就認爲唯一確定一個應用僅需依靠AndroidManifest.xml中的package+類名即可。

com.jarwen.scanner/com.jarwen.scanner.MainActivity

類名中package部分可以簡寫成相對路徑的形式:

com.jarwen.scanner/.MainActivity

 

當Android Studio開始流行以後,應用gradle中的applicationId才逐漸進入開發者們的視野,也才逐漸讓我們瞭解到原來二者之間是有區別的。正如文首所說,applicationId纔是正版ID號,package僅僅是描述代碼文件位置的索引值。並且這兩個值可以不一樣。

 

最常見的一種做應用形式是隻更改applicationId的值而不改變package。例如,我們經常會遇到兩個應用程序中絕大部分功能與內容都相同僅小部分信息不同的情況,這種情況下兩個應用很大的機率是共享同一套代碼僅靠配置文件來區分的。而我們又難免會有需要在同一個設備或者同一個應用商店內同時存在這兩個應用的情況。這個時候package不變單獨修改applicationId就能完美滿足我們的需求了。而且,最最重要的是在Android Studio中單獨修改applicationId太方便了。直接在app的build.gradle中任意修改隨後編譯發佈即可。如下圖所示:

 

 

按照上圖修改完成後,應用的定位形式就如下所示了:

com.jarwen.scanner.th.nf5501/com.jarwen.scanner.MainActivity

並且在類名中不可以再縮寫成相對路徑的形式了。

 

另外,如果需要通過applicationId來區分同一套應用的不同版本,且有定義content provider組件的情況下,provider的authorities必須寫成相對形式而不能直接填寫攜帶package的絕對值形式,否則的話同一設備中會因爲有兩個應用具有相同的content provider而無法共存,直接在安裝應用時報 INSTALL_FAILED_CONFLICTING_PROVIDER 錯誤。可行的寫法如下圖所示:

 

  


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章