zoukankan      html  css  js  c++  java
  • 在同一台android设备上安装多个同一项目的apk

    前言

    通常我们在一台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已发布,这个项目的包名就是不可修改的了,不过我们一般也不会轻易修改包名。



    在主app的build.gradle里面添加
    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/
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 相关阅读:
    Perl 简介(适合对 C 语言有点认识的读者)
    ASP.NET中的随机密码生成
    office2003下的EXCEL中英文图表名的对应
    css布局定位系列 (转)
    使用.Net访问Office编程接口
    在.NET 2.0 中发送Email
    asp .net 发邮件(带附件)测试可用
    ASP.NET图象处理详解
    DateTable全解
    带线的无限级下拉树列表
  • 原文地址:https://www.cnblogs.com/Im-Victor/p/15071284.html
Copyright © 2011-2022 走看看