在同一臺android設備上安裝多個同一項目的apk

前言

一般咱們在一臺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

BuildTypes方式

另一種方式Flavors

productFlavors {
        pro {
            applicationIdSuffix ".pro"
        }
        free {
            applicationIdSuffix ".free"
        }
    }

或者:gradle

productFlavors {
        pro {
            applicationId = "com.myApp.pro"
        }
        free {
            applicationId = "com.myApp.free"
        }
    }

Flavors方式
這時候使用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.testcom.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

相關文章
相關標籤/搜索