Gradle实现Android多渠道定制化打包

最近在项目中遇到需要实现 Apk 多渠道、定制化打包, Google 、百度查找了一些资料,成功实现了上述功能,在此记录以备不时之需,温故而知新,可以为师矣~

需求可以总结如下:

如何实现多个 Apk 安装在同一设备

在之前的印象中,同一个应用在同一设备上只能安装一个,除非手动修改 AndroidManifest.xml 文件中的包名( package ),但这么做的后果就是新的应用真的是新的应用,旧版应用再也收不到更新。而现在你通过 Gradle,你可以轻松构建多个不同版本的应用,并且在同一设备上安装使用。

这里要用到 productFlavors ,productFlavors 可以用来自定义应用构建版本,我们可以用其 applicationId 属性来实现多个 Apk 安装在同一设备上。

build.gradle 中部分配置代码如下:

 
  1. android { 
  2.     compileSdkVersion 24 
  3.     buildToolsVersion "24.0.1" 
  4.  
  5.     //默认配置,所有 productFlavors 都会继承 defaultConfig 中配置的属性 
  6.     defaultConfig { 
  7.         //默认的 applicationId,一般与 AndroidManifest.xml 文件 package属性相同 
  8.         applicationId "com.littlejie.multichannel" 
  9.         minSdkVersion 15 
  10.         targetSdkVersion 24 
  11.         versionCode 1 
  12.         versionName "1.0" 
  13.     } 
  14.  
  15.     // productFlavors 定义了一个应用的自定义构建版本 
  16.     //一个单一的项目可以同时定义多个不同的 flavor 来改变应用的输出。 
  17.     // productFlavors 这个概念是为了解决不同的版本之间的差异非常小的情况,通常用于区分同一个应用的不同渠道/客户等,可包含少量业务功能差别。 
  18.     // productFlavors 中的 flavor 不能跟 buildType 中的一样,否则会报: "ProductFlavor names cannot collide with BuildType names" 
  19.     productFlavors { 
  20.  
  21.         //默认版本,不设置 applicationId ,继承 defaultConfig 中的配置 
  22.         flavors_default { 
  23.         } 
  24.  
  25.         //开发版本, applicationId 替换为 com.littlejie.multichannel.dev 
  26.         flavors_dev { 
  27.             applicationId "com.littlejie.multichannel.dev" 
  28.         } 
  29.  
  30.         //发布版本, applicationId 替换为 com.littlejie.multichannel.release 
  31.         flavors_release { 
  32.             applicationId "com.littlejie.multichannel.release" 
  33.         } 
  34.     } 
  35.  

MainActivity.java:

 
  1. public class MainActivity extends Activity { 
  2.  
  3.     private static final String TAG = MainActivity.class.getSimpleName(); 
  4.  
  5.     @Override 
  6.     protected void onCreate(Bundle savedInstanceState) { 
  7.         super.onCreate(savedInstanceState); 
  8.         setContentView(R.layout.activity_main); 
  9.  
  10.         Log.d(TAG, "package name = " + this.getPackageName()); 
  11.     } 
  12.  

在 Android Studio 中执行如下命令:

 
  1. //打 debug 包,gradle 命令会在后面 `gradle task`中详细讲述 
  2. gradle clean assembleDebug  

打包完成后,将 Apk 安装到模拟器(adb install name.apk),运行,log 如下:

flavors_default:

 
  1. 09-17 22:43:55.390 19747-19747/com.littlejie.multichannel D/MainActivity: package name = com.littlejie.multichannel 

flavors_dev:

 
  1. 09-17 22:11:30.860 2638-2638/com.littlejie.multichannel.dev D/MainActivity: package name = com.littlejie.multichannel.dev 

flavors_release:

 
  1. 09-17 22:44:55.610 20650-20650/com.littlejie.multichannel.release D/MainActivity: package name = com.littlejie.multichannel.release 

从这里可以看出,不同 flavor 的 package name 被 applicationId 替换掉了,而且同一个模拟器上可以同时安装以上三个应用。

下面我们再看看 AndroidManifest.xml 中发生了什么变化。这里需要用到 aapt 来查看 AndroidManifest.xml 的信息:

>>>>阅读全文

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值