一般咱们在一台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
下面是我生成的apkspa
手机上安装的应用: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