1.修改app的build.gradle文件

假设我们同一套代码编译2个app:demo1和demo2

android {
...
productFlavors {
// demo1
demo1 {   // 设置applicationId(这里很重要,两个相同applicationId的apk不同同时安装在同一台Android手机中)
    applicationId "com.glorystudent.buglydemo1"   // 自动生成@string/app_name为demo
    resValue "string","app_name","demo1"    // 定义app_icon字段,在AndroidManifest.xml文件中用到
    manifestPlaceholders = [UMENG_CHANNEL_VALUE: "demo1",app_icon : "@mipmap/ic_launcher"]
    }
 // demo2
    demo2 {
      // 解释同app1
        applicationId "com.glorystudent.buglydemo2"
        resValue "string","app_name","demo2"
        manifestPlaceholders = [UMENG_CHANNEL_VALUE: "demo2",app_icon : "@mipmap/ic_launcher1"]
        }
    }
  lintOptions {
    checkReleaseBuilds false
    abortOnError false
    }
}

  

2.去坑,我们上面写了

resValue "string","app_name","demo"

运行之后,AS会自动生成@string/app_name,内容是这样的

<item type="string" name="app_name">demo</item>

那么问题来了,如果你在app的strings.xml文件也定义了

所以编译的时候就会出现问题,因为有2个app_name,所以我们要把app的strings.xml去掉,编译就会正常了。 得去  string 文件  把 app_name删除

3.修改AndroidManifest.xml文件

 <application
android:name=".base.MyApplication"
android:allowBackup="true"
android:hardwareAccelerated="true"
//app图像
android:icon="${app_icon}"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<meta-data
//appname
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}"/>
<activity
android:name=".ui.activity.SplashActivity"
android:label="@string/app_name"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/>
</intent-filter>
</activity>

  

注意啦,icon属性的值是${app_icon},虽然为红色,但是不要紧,我们在build.gradle文件中加入了这么一段代码:

android {
...
lintOptions {
checkReleaseBuilds false
abortOnError false
}
}

打包并签名APK
我们打包时,就会出现2个app:

我们选择2个app,AS就会帮我们打包2个不同的APK了,就这么简单!!

4.注意:可能出现的问题
如果可以打包不同版本的apk,但是不能同时安装到同一台设备,提示:xx有相同组件之类的。然后查看两个apk的包名是否一样,结果两个apk的包名是不同的。一般情况不会,执行签名步骤就ok了:

记住,provider标签的authorities属性的值一定要是唯一的,如果两个app的authorities属性值一样,就会提示安装失败,一定要记住!!
---------------------
作者:zuo_er_lyf
来源:CSDN
原文:https://blog.csdn.net/zuo_er_lyf/article/details/79064853
版权声明:本文为博主原创文章,转载请附上博文链接!

android studio 一个项目如何打包多个apk的更多相关文章

  1. Android studio 一个项目中添加两个module遇到的bug

    1.在一个Android studio中,我添加了一个模块,然后就是各种bug 找到到R 是在module 名上面 右键 Make Module '模块名' 经过各种google 的时候发现了 htt ...

  2. Android studio 一个项目引入另一个项目作为Libary

    1.在我们开发Android项目时,有时需要一个项目作为另一个项目的工具类的引用,这样就需要配置下,使得MyLibrary到MyApplication作为一个module. 我们直接截图上步骤: 1. ...

  3. 使用Android Studio时so文件打包不到APK中

    1,需要在build中添加如下配置,这是必备的 Android {   sourceSets {       main {           jniLibs.srcDirs = ['libs']   ...

  4. Android Studio复制项目作为一个新的工程

    Android Studio复制项目作为一个新的工程 等待..... 好了 可能会安装失败 Failed to finalize session : INSTALL_FAILED_INVALID_AP ...

  5. Android Studio将项目打包成apk

    Android Studio将项目打包成apk 第一种方法:适合自己调试用. (1)直接在项目中生成: (2)位置是在你的项目中 第二种方法:适合发布应用. (1)找到Generate Signed ...

  6. android studio新项目时提示:Plugin is too old, please update to a more recent version

    今天想写一个程序来测试一下android studo代码,但是创建好项目后,提示: Error:(1, 0) Plugin is too old, please update to a more re ...

  7. 【Android Studio使用教程2】Android Studio创建项目

    创建项目 首先,先指出Android Studio中的两个概念. Project 和 Module .在Android Studio中, Project 的真实含义是工作空间, Module 为一个具 ...

  8. Android Studio创建项目

    创建项目 首先,先指出Android Studio中的两个概念. Project 和 Module .在Android Studio中, Project 的真实含义是工作空间, Module 为一个具 ...

  9. Android Studio导入项目

    原文:http://ask.android-studio.org/?/article/21 本篇教程中使用到的Android Studio版本为1.0, Eclipse ADT版本23.0.4.请尝试 ...

随机推荐

  1. 由dubbo开始看看所谓的软负载均衡

    待总结 我们在微服务架构中,常用一些注册中心进行订阅消费我们的服务,这时候对于同一服务请求会有不同的机器同时可以提供服务,这时是怎么选择哪一台机器去连接获取服务呢? 负载均衡设备作为纵跨网络2/7层交 ...

  2. pytest_按标记执行

    import pytest@pytest.mark.webtestdef test_send_http(): pass @pytest.mark.apptestdef test_devide(): p ...

  3. AVR446步进电机算法推导及应用

    https://blog.csdn.net/Renjiankun/article/details/80513839?utm_source=copy

  4. to meet you 常用类库与技巧

    1.Java的异常体系 2.从概念角度解析Java的异常处理机制 3.从责任角度看Java的异常体系 checked exception 必须try catch 或者继续向上抛出异常,否则编译不能通过 ...

  5. 项目中UX设计1到2的设计提升总结

  6. D3.js 区域生成器 (V3版本)

    区域生成器(Area Generator)   区域生成器(Area Generator)用于生成一块区域,使用方法与线段生成器类似.线段生成器地址:数据访问器有x().x0().x1().y().y ...

  7. vue中ref的使用(this.$refs获取为undefined)

    如果你获取到的总是空的,你注意一下: 1.你在哪里调用,和你调用的对象 试试在mounted()里面调用有效果没有 调用的对象是本来就存在的,还是需要数据渲染之后才会出现的,同理,在mounted() ...

  8. js排他功能示例

    <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...

  9. git基础1

    git:     团队协作开发     版本管理      创建项目的文档     初始化   编写项目   把文件add到git仓库,其实是放到了git的代码暂存区   工作区有一个隐藏目录 .gi ...

  10. NX二次开发-UFUN获取块的参数UF_MODL_ask_block_parms

    NX11+VS2013 #include <uf.h> #include <uf_modl.h> #include <uf_ui.h> UF_initialize( ...