前言
通常我們在一台android設備上(無論是真機還是模擬器),安裝相同包名的apk應用都只能安裝一個應用,如果設備上已經安裝了一個apk,如何再次安裝這個apk就會覆蓋前面的應用,如果想要安裝在同一台設備上安裝多個相同的apk,唯一的辦法只能是改包名了。簡單的項目還好,當個一個項目中有許多的類的時候,手動去更改包名一定是一種不可取的方式。那么有沒有什么簡單的辦解決呢?
解決辦法:
在app下面的bulid.gradle中添加如下代碼:
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,可以在下面的圖中看到:

另外一種方式Flavors
productFlavors { pro{ applicationIdSuffix ".pro" } free { applicationIdSuffix ".free" } }
或者:
productFlavors { pro { applicationId = "com.myApp.pro" } free { applicationId = "com.myApp.free" } }
這時候使用Build Variants就可以選擇自己需要打包的版本
下面是我生成的apk
手機上安裝的應用:
上面三個應用都是同一個項目,只是經過處理后,就都可以在同一台設備上安裝了(因為這是三個的包名是不相同的)。
需要注意的是:
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了
總結:
Application ID可以說是一個android項目的唯一標識,是不可修改的,在android studio中的bulid.gradle下,如下:
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已發布,這個項目的包名就是不可修改的了,不過我們一般也不會輕易修改包名。
android { compileSdkVersion 26 buildToolsVersion '26.0.2' defaultConfig { applicationId "com.xxx.www.xxx" minSdkVersion 16 targetSdkVersion 26 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
//版本名后面添加一句話,意思就是flavor dimension 它的維度就是該版本號,這樣維度就是都是統一的了 flavorDimensions "versionCode" }
否則會報
Error:All flavors must now belong to a named flavor dimension.Learn more at https
作者:聖劍Jay
鏈接:https://www.jianshu.com/p/95d0e3493429/
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。