文档章节

使用Gradle构建多版本app

atearsan
 atearsan
发布于 2016/09/19 10:55
字数 940
阅读 73
收藏 1

####资源文件个性化处理
res目录下的都算资源文件(layout、values、drawable、mipmap)

  1. 在build.gradle中定义productFlavors

     android {
         compileSdkVersion 23
         buildToolsVersion "24.0.2"
         defaultConfig {
             applicationId "com.atearsan.multiflavors"
     	    minSdkVersion 14
             targetSdkVersion 23
             versionCode 1
     	    versionName "1.0"
         }
         buildTypes {...}
         productFlavors {
             free {
             }
             pro {
             }
         }  
     }
    
  2. (在src目录下)创建与productFlavors对应的文件夹

  3. 将个性化处理的资源文件放到productFlavors对应的资源目录中(没有资源目录就按照main/res的结构创建) "说明"

  4. 资源文件个性化处理规则
          命名要一样
          文件路径要一样
          比如productFlavors-pro的app_name要改成"MultiFlavors-PRO", 就在pro下创建strings.xml, 然后添加<string name="app_name">MultiFlavors-PRO</string>就好了
          ![](http://7xqmjb.com1.z0.glb.clouddn.com/2016091810427截图 2016-09-18 16时57分25秒.png?imageView2/2/w/900)

####AndroidManifest.xml内容个性化处理

  1. 新增属性 (新增的属性按照正常的写法就好了)
        <activity android:name=".view.activity.ProActivity" />
  2. 覆盖main/AndroidManifest.xml中的属性 (比如覆盖meta-data的值)
        文字不好描述, 直接看图片对比吧.     ![](http://7xqmjb.com1.z0.glb.clouddn.com/2016091866407截图 2016-09-18 17时32分55秒.png?imageView2/2/w/1100)
        AndroidManifest.xml内容的合并, 关键是tools:replace的使用. 更多内容参考: http://tools.android.com/tech-docs/new-build-system/user-guide/manifest-merger

####java文件性化处理
java文件处理起来会麻烦很多, 而且不适合项目大范围的修改. 因为改起来比较累 :(
假如现在`main`中有一个java类:NextActivity.class, 现在要改成在`pro`中toast提示"pro", 在`free`中toast提示"free".
1.把NextActivity.class复制到freepro对应的包路径下 (包路径保持一致)
2.删除main中的NextActivity.class类. (不删除的话, 编译的时候会提示NextActivity类重复)
3.在freepro中分别实现自己需要的逻辑         ####'包名'个性化处理
首先, 我们要弄懂Android程序中applicationIdpackageName的区别.
简单粗暴的理解, packageName是我们能看到的程序的资源文件的路径. 比如:com.atearsan.multiflavors, 这个就是程序的包结构, 每个类的第一句是package com.atearsan.multiflavors.view.activity. 引用某个类的时候会有一句import com.atearsan.multiflavors.R.
applicationId是APK的唯一标识, 在Android系统中, applicationId才代表一个唯一的应用. 创建一个project的时候, applicationId默认就是我们指定的包结构路径. 可以在build.gradle中找到. 通过代码获取到的packageName就是applicationId, 但是反编译APK就会发现看到的目录结果跟applicationId不一致, 而是我们编写代码的时候的目录结构.
所以, 本段内容的标题中'包名'实际是指applicationId. 我们一般说一份代码发布多个版本的APK, 修改的也是applicationId.
注意: 程序代码获取到的packageName实际上是applicationId, 所以第三方服务(比如各种推送、各种分享、各种登录)要在AndroidManifest.xml中配置包名的时候也是指applicationId

android {
	compileSdkVersion 23
	buildToolsVersion "24.0.2"

    defaultConfig {
	    //applicationId "com.atearsan.multiflavors"     // 默认值. 改成在productFlavors中定义
        minSdkVersion 14
	    targetSdkVersion 23
    	//versionCode 1                                 // 改成在productFlavors中定义
        //versionName "1.0"
	}
    buildTypes {...}

	productFlavors {
    	free {
        	applicationId "com.free.xx.oo"
            versionCode 1
	        versionName "v1.0"
    	}

        pro {
	        applicationId "com.atearsan.multiflavors.pro"
    	    versionCode 2
        	versionName "v1.1"
        }
	}
}    

####依赖库(lib)及混淆个性化处理 android { buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors { free { applicationId "com.free.xx.oo" versionCode 1 versionName "v1.0" } pro { applicationId "com.atearsan.multiflavors.pro" versionCode 2 versionName "v1.1" proguardFiles 'proguard-rules-pro.pro' // 混淆个性化处理 } } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) testCompile 'junit:junit:4.12' proCompile 'com.android.support:appcompat-v7:23.4.0' // 依赖库个性化处理 }

####demo源码 (git.osc) http://git.oschina.net/atearsan/MultiFlavorsDemo

####参考内容 如何使用Gradle构建不同版本的app?
Manifest Merger
android基础:applicationId与packageName的区别
[Android] 应用的包名:ApplicationId vs PackageName

© 著作权归作者所有

atearsan
粉丝 28
博文 28
码字总数 10978
作品 0
深圳
程序员
私信 提问
加载中

评论(2)

atearsan
atearsan 博主

引用来自“1120”的评论

你好,请教个问题,怎么通过反射获得res下attrs?
参考: http://www.cnblogs.com/mada0/p/5083483.html
1
1120
你好,请教个问题,怎么通过反射获得res下attrs?
Gradle入门系列(5):创建多项目构建

转载: 本文由 伯乐在线 - JustinWu 翻译,黄利民 校稿。未经许可,禁止转载! 英文出处:petrikainulainen。欢迎加入翻译组。 尽管我们可以仅使用单个组件来创建可工作的应用程序,但有时候...

低至一折起
2017/12/05
0
0
69.(android开发)快速构建android项目

开发android app使用android studio作为开发工具是最常用的方式。但是每当android studio升级之后,会发现gradle出问题了。那么就需要更新gradle。 由于网速的问题,直接使用android studio升...

厚土火烟
01/31
0
0
给 Android 开发者的 Gradle 入门指南

本文的目的是为您提供关于 Gradle 的高级概述,以及在开发 Android 应用程序时如何适应整个构建系统。 我将通过 Gradle 和 Gradle 的 Android 插件的基础知识,以及新的 Android 项目附带的默...

oschina
2017/11/22
3.5K
2
越写悦快乐之重拾Android开发之构建工具

今天的越写悦快乐系列文章为大家带来Android开发必备的构建工具Gradle的基本使用和简要说明。犹记得2015年刚上手Android开发的时候还使用的是Maven来构建Android应用程序,使用的开发环境还是...

韬声依旧在路上
03/21
0
0
Gradle 4.1更新内容及注意事项

前言 进入2017年,Android Studio 版本更新至3.0,连带着com.android.tools.build:gradle 工具也升级到了3.0.0,在3.0.0中使用了最新的Gralde 4.0 里程碑版本作为gradle 的编译版本,该版本g...

fqian
2018/01/11
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

64.监控平台介绍 安装zabbix 忘记admin密码

19.1 Linux监控平台介绍 19.2 zabbix监控介绍 19.3/19.4/19.6 安装zabbix 19.5 忘记Admin密码如何做 19.1 Linux监控平台介绍: 常见开源监控软件 ~1.cacti、nagios、zabbix、smokeping、ope...

oschina130111
今天
13
0
当餐饮遇上大数据,嗯真香!

之前去开了一场会,主题是「餐饮领袖新零售峰会」。认真听完了餐饮前辈和新秀们的分享,觉得获益匪浅,把脑子里的核心纪要整理了一下,今天和大家做一个简单的分享,欢迎感兴趣的小伙伴一起交...

数澜科技
今天
7
0
DNS-over-HTTPS 的下一代是 DNS ON BLOCKCHAIN

本文作者:PETER LAI ,是 Diode 的区块链工程师。在进入软件开发领域之前,他主要是在做工商管理相关工作。Peter Lai 也是一位活跃的开源贡献者。目前,他正在与 Diode 团队一起开发基于区块...

红薯
今天
10
0
CC攻击带来的危害我们该如何防御?

随着网络的发展带给我们很多的便利,但是同时也带给我们一些网站安全问题,网络攻击就是常见的网站安全问题。其中作为站长最常见的就是CC攻击,CC攻击是网络攻击方式的一种,是一种比较常见的...

云漫网络Ruan
今天
12
0
实验分析性专业硕士提纲撰写要点

为什么您需要研究论文的提纲? 首先当您进行研究时,您需要聚集许多信息和想法,研究论文提纲可以较好地组织你的想法, 了解您研究资料的流畅度和程度。确保你写作时不会错过任何重要资料以此...

论文辅导员
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部