Android Studio 一个工程打包多个不同包名的APK实例详解

公司最近有个特别的需求,同一套代码,稍做修改(如包名不一样,图标不一样,应用名不一样等),编译出几个不同的应用。刚好用AS重构完项目,在网上查阅了一些资料,终于搞定!!在这记录一下。

AS主要是利用gradle来实现这个需求的,具体做法如下:

修改app的build.gradle文件

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

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

注意啦,这里有个坑,我们上面写了

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

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

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

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

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

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

再注意啦,我们 只能在app的build.gradle文件配置各个版本的值 ,如

app1 {
 buildConfigField "int", "TYPE", "1"
}
app2 {
 buildConfigField "int", "TYPE", "2"
}

如果你在其他子模块配置的话,编译时出现乱七八糟的错误!!

如果子模块需要配置的值,可以在公共模块定义静态变量,在app模块取出配置值后,设置到公共模块定义的静态变量中,这样的话各个模块都可以取到!!

修改AndroidManifest.xml文件

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
 package="com.johan.demo">
 <application
  android:allowBackup="true"
  // 注意啦,这里改为${app_icon}
  android:icon="${app_icon}"
  android:label="@string/app_name"
  android:supportsRtl="true"
  android:theme="@style/AppTheme">
  <activity android:name=".ui.MainActivity">
   <intent-filter>
    <action android:name="android.intent.action.MAIN" />
    <category android:name="android.intent.category.LAUNCHER" />
   </intent-filter>
  </activity>
 </application>
</manifest>

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

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

这里的作用就是即使项目中报错也不会停止打包 。

打包并签名APK

我们打包时,就会出现2个app:

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

填坑

今天按照以上步骤在开发项目尝试了一下,虽然可以打包不同版本的apk,但是不能同时安装到同一台设备,提示:xx有相同组件之类的。然后查看两个apk的包名是否一样,结果两个apk的包名是不同的。就这个问题查了一整天,果然皇天不负有心人,被我找到了,原因是我在AndroidManifest文件定义了一个provider:

记住,provider标签的authorities属性的值一定要是唯一的,如果两个app的authorities属性值一样,就会提示安装失败,一定要记住!!

查看包名的方法:

因为我们此时的apk不能安装的手机上,所以只有apk这个包,这时,我们使用aapt命令(aapt是sdk自带的一个工具,在sdk\builds-tools\目录下):

aapt dump badging D:\apk\xxx.apk | findstr package

总结

以上所述是小编给大家介绍的Android Studio 一个工程打包多个不同包名的APK实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • Eclipse NDK迁移到Android Studio的方法示例
  • 在启动栏制作android studio启动图标
  • 深踩Android Studio 缓存的坑及解决方法
  • Android Studio 3.0 Gradle 配置变更
  • Android Studio设置、改变字体和主题的方法
  • 使用Android studio编写一个小的jni程序
  • Android Studio 代码导航快捷键
  • Android Studio多工程引用同一个library项目配置的解决方法
  • Android Studio中Run按钮是灰色的快速解决方法
  • Android Studio 下载视频到本地
  • 详解Android Studio中Git的配置及协同开发
  • Android Studio配置内嵌JDK的方法
  • AndroidStudio 配置 AspectJ 环境实现AOP的方法
  • 详解如何在Android Studio中添加RecyclerView-v7支持包
  • android studio library 模块中正确引用aar的实例讲解
  • Android Studio中导入module的方法(简单版)
  • Android Studio 引用外部依赖时报错的解决方法
  • android项目从Eclipse迁移到Android studio中常见问题解决方法
时间: 2018-02-08

Android Studio设置、改变字体和主题的方法

1.步骤:File >> settings >> Appearance & Behavior >>Appearance >> 来到修改界面 如下图所示:(Theme 主题修改 :Name 字体 :size 字号大小:其他的效果自己设置就可以看到,下图是其中的一种效果) 2.修改代码区域的字体,字号等设置 步骤:File >> settings >> Editor >>Colors & Fonts >&

Android Studio 代码导航快捷键

简评:作为一位 Android 开发者,Android Studio 肯定是每天都要打交道的,熟练掌握其中的快捷键等技巧可以提高我们不少的效率. 虽然,网上有着很多列出快捷键的文章,但只是简单的看一看快捷键和说明,很难让人理解和掌握.本篇文章就专注于代码间导航的快捷键,配合动图,希望能帮助你记忆. TL;DR 下面的快捷键都是在 mac 上,快捷键设置是 Mac OS X 10.5+: ⌘ + O : 查找类. ⌘ + ⌥ + O : 通过信息(symbol)查找. ⌘ + ⇧ + O : 查找

Android Studio 3.0 Gradle 配置变更

多渠道打包变更 flavorDimensions "default" productFlavors { xxxx { dimension "default" } } productFlavors.all { flavor -> flavor.manifestPlaceholders = [CHANNEL_VALUE: name] } 更改打包命名及路径 android.applicationVariants.all { variant -> if (va

android项目从Eclipse迁移到Android studio中常见问题解决方法

(1)将Eclipse项目导入到Android studio 中出现9-patch image问题解决方法: 在build.gradle里添加以下两句: aaptOptions.cruncherEnabled = false aaptOptions.useNewCruncher = false 用来关闭Android Studio的PNG合法性检查的,直接不让它检查. (2)Android Studio 错误: 非法字符: '\ufeff' 解决方案|错误: 需要class, interface

Android Studio 下载视频到本地

最近在研究视频下载到本地的问题,像爱奇艺,腾讯视频,迅雷看看等等一些视频播放器,如果在一个播放器里面视频下载到一半用户退出App之后,再次登录从头开始,那么就太可悲了,所以在做视频音频类的项目时,要实现的一个功能就是断点续传,就是将用户下载的视频或者音频等以字节流的形式存入数据库,下次用户再次下载时,将继续上次数据库的接着下载,这样用户体验就会很好,也大大节省了成本. 好了废话不多说,开始今天的正题. 一.先上效果图 二.使用GreenDao我们需要导入依赖 1.以下在项目gradle依赖中添加

Android Studio中导入module的方法(简单版)

1.把要导入成Mudle的项目修改成符合Library的格式 修改该项目中bulid.gradle文件中第一行代码 把 apply plugin: 'com.android.application' 修改为 apply plugin: 'com.android.library' 然后,修改AndroidManifiest.xml文件中配置信息,此处主要是把原来配置的项目Style等配置以及MainActivity配置删除,这样处理是为了防止重复.以下以一个我的Moudle文件的AndroidMa

Android Studio配置内嵌JDK的方法

今天发现JDK环境变量没有配置好. 我没有专门去下载java,在下载Android Studio时,会自带内嵌的JDK. 打开File-OtherSettings-DefaultProjectStructure,可看到AS已自动勾选Use embedded JDK,而且是官方推荐的做法. 以下是配置环境变量的操作. java 1.8以后就无需CLASSPATH环境变量了. 我们只需配置JAVA_HOME和PATH即可. JAVA_HOME C:\AndroidStudio\jre (JDK安装目

android studio library 模块中正确引用aar的实例讲解

今天对接一个海康监控的sdk,其中sdk 是以aar的形式提供的,并且我需要用到此aar的模块是个library.所以按照正常的在application模块中引入aar的方式一致报错,首先提示要关闭offline ,然后关闭了还是会提示错误.想了很久不明白.最终通过公司前辈的指导,正确的引入了aar. 1.除了和正常的aar的引入方式外,我们还需要在application所在模块的build.gradle文件中加入如下一段: repositories { flatDir { dirs 'libs

使用Android studio编写一个小的jni程序

 1.简单介绍一下NDK和JNI NDK:NDK是Native Development Kit的缩写,是Google提供的一套工具集,可以让你其他语言(C.C++或汇编)开发 Android的 JNI.NDK可以编译多平台的so,开发人员只需要简单修改 mk 文件说明需要的平台,不需要改动任何代码,NDK就可以帮你编译出所需的so库. JNI:JNI是Java Native Interface的缩写,它提供了若干的API实现了Java和其他语言的通信(主要是C&C++) 2.打开Android

深踩Android Studio 缓存的坑及解决方法

本文记录的是今天在群里提到的昨天所踩的一个坑,有关 AndroidStudio 缓存的. 先说一下背景. 我负责的一个项目,对一个图表库有外部依赖.这个图表库是我在维护的,由于新功能在开发中,所以我就使用了 SNAPSHOT 版本发布到 OJO(oss.jfrog.org) 上.我在项目中刚更新了依赖,忽然想到还少几个 API,于是发布了 SNAPSHOT 版本. 故事就这样开始了. 这时候回到 AndroidStudio 再去 Sync Project with Gradle Files 肯定

在启动栏制作android studio启动图标

https://www.linuxidc.com/Linux/2017-08/146066.htm 首先在~/bin/android-studio文件夹下新建一个Studio.desktop文件,并用gedit打开,然后将以下的内容复制进去并改动. [Desktop Entry] Name=AndroidStudio Type=Application Icon=你的AndroidStudio解压文件夹的绝对路径/android-studio/bin/studio.png Exec=sh 你的An

Eclipse NDK迁移到Android Studio的方法示例

最近看一个NDK项目,因为源码使用Eclipse IDE写的,想把代码导入Android Studio使用,毕竟好用很多,使用AS导入后,第一个问题就是编码问题,项目之前竟然使用的是GBK编码.首先就是改变编码问题.我先在设置中将项目编码改为UTF-8,build结果显示一堆错误的乱码,在网上逛了一圈,找到解决方案. 编码 将AS右下角的UTF-8换成GBK. 跳出提示选择"reload",此时注释之类的乱码会显示正确. 右下角再选择UTF-8 跳出提示选择"convert&

详解如何在Android Studio中添加RecyclerView-v7支持包

一直知道RecyclerView可以代替ListView.GridView使用,听说功能很强大,但还没有去学习过.今天想学习,没想到还没开始便撞墙了.输入Recycler,只有这两个东西,没有提示RecyclerView,说明支持包中没有. 最后一番百度后,终于解决(真不敢想象没有网络的情况下,怎么开发.怎么解决问题). 1.打开SDK Manager,在Extras树下找到Android Support Library,下载好支持包.RecyclerView在v7-21版本就出来了.我这里不用

Android Studio中Run按钮是灰色的快速解决方法

首先是,在不同的AS中,gradle版本不同,下载的sdk版本不同,这些,都在gradle(Project.Models)相关代码里调过来就好.之前的文章里有说过. 经过调好gradle这些文件,AS已经可以built 成功后. 下一步,Run the application. 这时候,遇到问题:Run按钮灰色,失效. 点击Run旁边 Select Run/Debug Configuration按钮 选择 Edit Configuration,于是: 在model下拉框中选择app.如果下拉框中

AndroidStudio 配置 AspectJ 环境实现AOP的方法

昨天看了一段android配置aspectj实现AOP的直播视频,就试着自己配置了一下,可能是因为我自己的AndroidStudio环境的问题,碰到了不少的坑(其实还是因为对gradle理解的不多),但总归是配置好了,就分享一下. 试了两种方式,不过项目下的build.gradle,没什么变化,直接看一下代码吧: build.gradle(项目下) buildscript { ext { //android appcompat支持库版本 androidSupportVersion = '26.1

详解Android Studio中Git的配置及协同开发

一. Android Stutio配置git setting–>Version Control–>Git–>Path to Git executable中选择git.exe的位置,这个Stutio一般会默认配置好: 配置完路径后点击后面的Test按钮,出现下面提示框则表示配置成功: 二. 将项目分享到github 1. 设置github账号密码 打开Setting–>Version Control–>GitHub,填写完账号密码后,点击Test测试,如果连接成功会弹出如下提示

Android Studio 引用外部依赖时报错的解决方法

Android Studio 在引用外部依赖时,发现一直无法引用外部依赖.刚开始以为是墙的问题,尝试修改Gradle配置,未解决问题. 最终发现原来是在Android Sudio安装优化配置时,将Gradle设置为了离线工作模式 解决方法: 只需打开File->Settings->Build,Execution,Deployment->Gradle->取消offline work勾选 总结 以上所述是小编给大家介绍的Android Studio报错Unable to resolve

Android Studio多工程引用同一个library项目配置的解决方法

在使用Android Studio开发的时候,如遇到多个项目引用同一个library的情况时,会遇到在每个项目中都要有一套library的代码的情况,对于还在开发和维护中的Library需要频繁的修改,这对同步就很麻烦,为了解决这个问题,出现了下面的解决方案. 首先:新建一个类库工程,工程名为AppLibs.Dev. 在该类库中包含一个公共的类库appLibs的Module,Module下面的build.gradle配置如下: /** 声明是Android类库 */ apply plugin:

Android Studio error: Unable to start the daemon process的解决方法

在 Android Studio 上新建项目,出现 Unable to start the daemon process. 错误,具体错误信息如下: Error:Unable to start the daemon process. This problem might be caused by incorrect configuration of the daemon. For example, an unrecognized jvm option is used. Please refer

Android studio中生成引用.aar和.jar的方法详解

在Android Studio中对一个自己库进行生成操作时将会同时生成*.jar与*.aar文件. 分别存储位置: *.jar:库 /build/intermediates/bundles/debug(release)/classes.jar *.aar:库 /build/outputs/aar/libraryname.aar .jar 与 .aar的区别 从名称上来讲,一个是java application resource:一个是android application resource: 那

android studio更新gradle错误构建项目失败的解决方法

一.版本错误 对应版本,修改gradle version,和plusing version两个地方修改gradle version,和plusing version的方法有两种,一种是在 project.build.这里plusing version的设置 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.0' } } allprojects

Android Studio 3.6中使用视图绑定替代 findViewById的方法

从 Android Studio 3.6 开始,视图绑定能够通过生成绑定对象来替代 findViewById,从而可以帮您简化代码.移除 bug,并且从 findViewById 的模版代码中解脱出来. 本文梗概 在 build.gradle 中就可以方便快捷地开启视图绑定且无须额外引入依赖库 视图绑定会为 Module 中的每一个布局文件生成一个绑定对象 (activity_awesome.xml → ActivityAwesomeBinding.java) 布局文件中每一个带有 id 的视图

Android Studio通过Artifactory搭建本地仓库优化编译速度的方法

Android Studio 编译速度慢,一般来说,原因有下面几个. Gradle下载慢 依赖库下载慢 依赖库使用"+"(使用最新的),每次都需要去查找新的(尽量不适用这种方式) 这里,大部分的库,我们可以通过阿里云代理仓库. 但是,如果有我们自己的私有库或者插件的话.肯定不希望放到阿里云上了. 这个时候,我们就需要建立,我们自己的本地仓库,让私有仓库,依赖阿里云的私有仓库. 依赖关系,如下图 这样,既保证了我们私有库的安全性,又让我们的依赖库也享受到了阿里云代理仓库的便利. 通过Ar

浅谈Android Studio导出javadoc文档操作及问题的解决

1.在Android studio中进行打开一个项目的文件之后,然后进行点击Android stuio中菜单中的"tools"的选项.在弹出了下拉菜单中,进行选中下拉菜单中的"Generate JavaDoc"的选项. 2.在弹出界面中 Output directory是你即将生产的javadoc文件的存储位置,图中1指示的位置:正常点击ok即可: 但是如果有异常情况 比如空指针异常或者文档乱码 java.lang.NullPointerException 或者 j

使用android studio开发工具编译GBK转换三方库iconv的方法

网上大多教程和资源并没有从头到尾告诉怎么编译过程,这边文章教你一个对ndk编译懂的不多,又需要使用三方库,怎么办,硬着头皮搞,又无从下手,网上一堆资料,有价值的不多,到处是偏分的.本篇提供真实能运行,带的资源经过测试的.过程如下: 编译ICONV 1.1 解压缩 1.解压缩:  tar -xvf  ./libiconv-1.14.tar.gz  -C libiconv-1.14 2.配置:./configure --host=arm-linux-gnueabihf CC=/home/work/r