一般咱們在一臺android設備上(不管是真機仍是模擬器),安裝相同包名的apk應用都只能安裝一個應用,若是設備上已經安裝了一個apk,如何再次安裝這個apk就會覆蓋前面的應用,若是想要安裝在同一臺設備上安裝多個相同的apk,惟一的辦法只能是改包名了。簡單的項目還好,當個一個項目中有許多的類的時候,手動去更改包名必定是一種不可取的方式。那麼有沒有什麼簡單的辦解決呢?html
在app下面的bulid.gradle
中添加以下代碼:android
buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { applicationIdSuffix ".free" } } }
沒錯,你能夠看到applicationIdSuffix ".free"
這一行關鍵的代碼。就是這一句代碼,使得咱們的包名變成了packageName.free
,好比:咱們包名是com.myApp
,加上這句後,生成的apk的包名就會變成com.myApp.free
,這裏的free
能夠根據本身的打包用途來命名。
上這種方式就是BuildTypes
,能夠在下面的圖中看到:app
productFlavors { pro { applicationIdSuffix ".pro" } free { applicationIdSuffix ".free" } }
或者:gradle
productFlavors { pro { applicationId = "com.myApp.pro" } free { applicationId = "com.myApp.free" } }
這時候使用Build Variants就能夠選擇本身須要打包的版本ui
下面是我生成的apk
spa
手機上安裝的應用:debug
上面三個應用都是同一個項目,只是通過處理後,就均可以在同一臺設備上安裝了(由於這是三個的包名是不相同的)。
須要注意的是:code
productFlavors { pro { applicationId = "com.myApp.pro" } free { applicationId = "com.myApp.free" } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } debug { applicationIdSuffix ".test" } }
若是同時使用兩種方式,buildTypes 中的設置後綴會跟在productFlavors 中設置的包名後面,這時候包名就會變成com.myApp.pro.test
和com.myApp.free.test
.
Ok這時咱們就能夠在同一臺設備上安裝多個同一項目的apk了xml
Application ID
能夠說是一個android項目的惟一標識,是不可修改的,在android studio中的bulid.gradle下,以下:htm
android { compileSdkVersion 25 buildToolsVersion "25.0.2" defaultConfig { applicationId "com.myApp" minSdkVersion 15 targetSdkVersion 25 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" }
而且Application ID和package的屬性值不同的,雖然不同,可是當咱們在構建項目的時候,會複製Application ID給package的屬性值,而且這個屬性值是惟一的,package屬性纔是真正做爲您應用程序惟一身份憑證。
當咱們打開apk中的AndroidMainifest.xml文件時就能夠看到,package和咱們設置的同樣了。
這就是爲何能夠在同一臺設備上安裝的緣由。
如何咱們的apk已發佈,這個項目的包名就是不可修改的了,不過咱們通常也不會輕易修改包名。
參考:https://developer.android.com/studio/build/application-id.html#change_the_package_name