Android Studio中一套代码多版本打包

摘要:
一组代码实现了以下效果:打包不同的应用程序ID可以同时安装在同一部手机上,使用不同的徽标、应用程序名称、不同的第三方SDK访问配置可以区分调试和发布配置,甚至可以区分不同的so文件,以及依赖于jar包的不同函数(有待补充):productFlavor和buildTypes原则:优先级buildTypes大于productFlavors示例:可以为两个库apk1打包一组代码。修改buildgradle可以为buildType维护调试和发布的默认设置。android节点中添加了两个productFlavors。

一套代码达到以下效果

  • 打包不同applicationId能同时安装在同一手机上
  • 不同logo,app名称,
  • 不同第三方SDK接入配置(例如微信分享appid,激光推送appkey)
  • 能区分debug和release配置
  • 甚至不同的so文件,不同的依赖jar包 (待补充)

使用到的功能:productFlavor和buildTypes

原理:优先级buildTypes大于productFlavor

示例:一套代码为两家银行打包apk

1. 修改build.gradle。buildTypes保持默认debug和release两种设置即可,android节点内添加两个productFlavor。

flavorDimensions 'bank'
productFlavors {
    icbc {
    dimension = 'bank'
    applicationId='com.icbc.mobilebank
    manifestPlaceholders = [bankName: '工商银行']
    }
    ccb {
    dimension = 'bank'
    applicationId = 'com.cbc. mobilebank
    manifestPlaceholders = [bankName: '建设银行']
    }
}
2. 修改srcmainAndroidManifest.xml,使用"${bankName}"和${applicationId}替换相应位置

   2.1 设置app名称,android:label="${bankName}",切记tools:replace要加上android:label。(App logo android:icon 也可以利用这个方法来区分,但更推荐后面的方法)

<application
android:name="com.dhcc.app.application.MyApplication"
android:allowClearUserData="true"
android:icon="@drawable/logo"
android:label="${bankName}"
android:largeHeap="true"
android:networkSecurityConfig="@xml/network_security_config"
tools:replace="android:name,android:label"
tools:targetApi="n">

2.2 设置所有android:authorities,例如

<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}. FileProvider "
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths" />
</provider>
 
<provider android:name="cn.jpush.android.service.DataProvider"
android:process=":pushcore"
android:authorities="${applicationId}.DataProvider" android:exported="false" /> 

    2.3 引用了第三方sdk时,例如极光推送需要修改

<permission android:name="${applicationId}.permission.JPUSH_MESSAGE"
android:protectionLevel="signature" />
<permission android:name="${applicationId}.permission.MIPUSH_RECEIVE"
android:protectionLevel="signature" />

3. 在srcmain同级目录添加三个文件夹"icbc ",""icbcRelease,"release "。选择icbcRelease编译时,编译器会按照" icbcRelease > release>icbc>main"这样的优先级合并同名文件编译。

4. 根据上面的优先级,设置图片资源。参照main esdrawablelogo.png文件层级一样,给文件夹添加自定义app logo,如果你icbc在debug和release用同一个logo,那就只在icbc文件夹添加即可。

5. 设置字符串xml资源。

  5.1 新建srcmain esvaluesconfigs.xml,放置一些各银行不一样的参数。也可以不增加configs.xml文件,直接追加在strings.xml内。

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="WXAPPId">XXXXXXXXXXXXXXX</string>
<string name="JPUSH_APPKEY">XXXXXXXXXXXXXXXXXX</string>
</resources>

  5.2 根据实际情况为"icbc ",""icbcRelease,"release "增加对应configs.xml。可以只增加JPUSH_APPKEY,那么WXAPPId会使用main的值。

  5.3 AndroidManifest.xml等xml文件中按"@string/JPUSH_APPKEY "使用

  5.4 activity代码中使用方法:"this.getString(R.string.JPUSH_APPKEY);"或者"this.getString(R.string.JPUSH_APPKEY);"

  5.5 在其他java文件使用方法(必须有Context或pplication):"context.getString(R.string.JPUSH_APPKEY);"或"application.getString(R.string.JPUSH_APPKEY);"

其它建议

1. 其它任何文件,包括java也可以用这样的优先级,达到不同包打出不同逻辑的效果。

2. Logo,configs.xml内的参数也可以在manifestPlaceholders各自定义达到不同flavor不同效果,但无法产生"icbc ","icbcRelease","icbcDebug","release ","debug"这样的多种组合各不相同的效果。同时java代码中取manifestPlaceholders中的值比取configs.xml的值麻烦。所以推荐各自建立不同文件夹,以后如果要删除一个银行的配置也容易。

 

免责声明:文章转载自《Android Studio中一套代码多版本打包》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Linux中三种SCSI target的介绍之SCSTJSDOM获取子节点的一些方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

转:intent简介

转自:here 一 Android系统用于Activity的标准Intent   1 根据联系人ID显示联系人信息 [java] view plaincopy  Intent intent = new Intent();   intent.setAction(Intent.ACTION_VIEW);   //显示联系人信息   intent....

Apache POI Java读取100万行Excel性能优化:split vs indexOf+subString,谁性能好

使用Apache POI eventmodel实现一个Excel流式读取类,目标是100万行,每行46列,文件大小152MB的Excel文件能在20s读取并处理完。一开始实现的程序需要260s,离目标差太远了,使用jvisualvm分析各方法执行时间,结果如下: 可以看到,程序中的splitLine和getRowNum方法消耗了大量时间。这两个方法都特别...

【C++ Primer 第13章】6.对象移动

右值引用 左值和右值 (1)两者区别:   ①左值:能对表达式取地址、或具名对象/变量。一般指表达式结束后依然存在的持久对象。   ②右值:不能对表达式取地址,或匿名对象。一般指表达式结束就不再存在的临时对象。 总结:一般而言,一个左值表达式表示的是一个对象的身份,而一个右值表达式表示的是对象的值。  (2)右值的分类   ①将亡值(xvalue,eXpi...

android 开发环境 配置和说明

1. 安装 java jdk 因为android 开发通用是java 语言。还有很多工具软件都是java开发,所以java 虚拟机和开发包必须有。 http://www.oracle.com/technetwork/java/javase/downloads/index.html 注意安装版本。jdk10.xxxxx不会被旧的androstudio识别。...

java Process在windows的使用汇总(转)

最常用的是ant(java工程中流行),maven,及通用的exec(只要有shell脚本如.sh,.bat,.exe,.cmd等).而其实前两者不容易出错,后者却遇到了以下问题:Caused by: java.io.IOException: Cannot run program "DailyBuild.bat"...java.io.IOException...

Android 实现异步加载图片

麦洛开通博客以来,有一段时间没有更新博文了.主要是麦洛这段时间因项目开发实在太忙了.今天周六还在公司加班,苦逼程序猿都是这样生活的. 今天在做项目的时候,有一个实现异步加载图片的功能,虽然比较简单但还是记录一下吧.因为麦洛之前实现异步加载图片都是使用了AsynTask这个API,继续这个类,实现起来非常简单也很方便.在doInBackground()方法里...