gradle 多版本多apk打包

http://blog.csdn.net/javazejian/article/details/50757532


通过上一篇gradle多渠道打包的介绍后,本篇我们就来介绍一下多版本apk的打包。在项目的开发过程,有可能我们会有需要打包多种版本apk的需求,比如当测试部门在测试需要我们提供两种当前正在开发的apk的版本,而且这两种版本都必须安装在同一台手机上,这时我们就需要在打包时打出两种不同包名的apk去满足能在同一台手机上安装;再比如我们开发的apk需要在不同的平台上运行,什么意思?假如我们的apk集成了百度地图,而百度地图提供的sdk中含有的so包会提供2种类型的平台,arm,x86等,这时我们需要根据不同平台打出2种类型的apk;还有的时候不同的版本apk中使用到的不同的服务端api域名也不相同。 比如 beta_api.com,release_api.com等等.......当这些情况出现时,我们就需要使用到多版本apk打包啦。当然我们不可能每次都手动去更改,这样的人力成本太高,也无法忍受,这时就需要gradle为我们排忧解难了。

        在本篇中,我们主要介绍两种方法也就是多版本apk安装在同一手机上和集成第3方sdk需要提供多版本apk的情况。

1.多版本apk安装在同一手机上

        这种情况只需要我们提供不同包名的apk即可完成。因为只要应用包名不一样即使签名信息一样还是可以同时安装在同一台手机上的,因此我们应该在打包成apk时修改应用的包名就可以达到目的啦。接下来我们进入实际操作过程。这里我们先介绍一个知识点,请直接看下图:

当然从截图也可以看出,配置多apk打包和上一篇文章配置多渠道打包是一样的,都是在productFlavors中配置的。如上图,我们在productFlavors中配置了两种flavor的apk信息一种是Beta版,一种是Releases版,同时每个flavor中我们都重新配置applicationId这个属性,通过这个属性我们就可以使打包出来的apk包名产生对应的变化啦。至于为什么重新配置了applicationId就行呢,原因图已经说明啦,就是因为defaultConfig是Beta版和Releases版flavor的基础配置,只要我们重写了applicationId这个属性就会覆盖defaultConfig中相对应属性的信息,从而使打包出来的两种apk的包名不一样,达到在同一台手机上安装的目的。那么applicationId又是什么呢?看下图(因此我们更改其实就是package属性)



这里还有点要说明的就是为了在java代码中可以方便获取到gradle配置文件的数据,我们可以通过以下在gradle文件中配置,在java 代码中使用方式为:context.getResources().getString(R.string.strKey);


当然还有可能会有别的需求,比如说不同版本要使用不同的icon,这时该如何做呢?实际上还是在productFlavors的每个flavor中通过manifestPlaceholders属性配置即可,还是记得我们在上一篇文章说过manifestPlaceholders是一个类似HashMap的容器,因此在manifestPlaceholders可以配置多个属性,以便在AndroidManifest.xm中使用,比如我们需要为每种版本的apk替换特定的icon和appName这时我们可以这样如下配置:


然后在AndroidManifest.xm中这样使用即可:

这样我们在打包apk时就可以根据特定需求获取到不同版本的apk啦,当然也可以把渠道配置上去哈,配置方式同上。这里我们给出完整的gradle文件:

[html]

view plain

copy

print

?

apply plugin: 'com.android.application'  

android {  

    signingConfigs {  

        debug4zj {  

            keyAlias 'debug4zj'  

            keyPassword 'debug4zj'  

            storeFile file('/Users/zejian/Documents/android-studio-workplace/debug4zj.jks')  

            storePassword 'debug4zj'  

        }  

    }  

    compileSdkVersion 23  

    buildToolsVersion "23.0.2"  

    defaultConfig {  

        applicationId "com.zejian.multi_versionapk"  

        minSdkVersion 10  

        targetSdkVersion 23  

        versionCode 1  

        versionName "1.0"  

    }  

    buildTypes {  

        release {  

            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  

            signingConfig signingConfigs.debug4zj  

            minifyEnabled true  

            zipAlignEnabled true  

        }  

    }  

    //配置多版本的apk  

    productFlavors{  

        Beta{  

            applicationId "com.zejian.multi_versionapk.beta"  

            manifestPlaceholders = [app_name:"multi_versionapk.beta" ,icon: "@mipmap/ic_launcher_beta"]  

            //在java代码中具体的使用方式为:context.getResources().getString(R.string.strKey);  

            resValue("string" , "strKey","beta版本")  

        }  

        Releases{  

            applicationId "com.zejian.multi_versionapk.release"  

            manifestPlaceholders = [app_name:"multi_versionapk.release",icon: "@mipmap/ic_launcher_releases"]  

            resValue("string" , "strKey","release版本")  

        }  

    }  

}  

dependencies {  

    compile fileTree(include: ['*.jar'], dir: 'libs')  

    testCompile 'junit:junit:4.12'  

    compile 'com.android.support:appcompat-v7:23.2.0'  

}  

apply plugin: 'com.android.application'
android {
    signingConfigs {
        debug4zj {
            keyAlias 'debug4zj'
            keyPassword 'debug4zj'
            storeFile file('/Users/zejian/Documents/android-studio-workplace/debug4zj.jks')
            storePassword 'debug4zj'
        }
    }
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    defaultConfig {
        applicationId "com.zejian.multi_versionapk"
        minSdkVersion 10
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.debug4zj
            minifyEnabled true
            zipAlignEnabled true
        }
    }
    //配置多版本的apk
    productFlavors{
        Beta{
            applicationId "com.zejian.multi_versionapk.beta"
            manifestPlaceholders = [app_name:"multi_versionapk.beta" ,icon: "@mipmap/ic_launcher_beta"]
            //在java代码中具体的使用方式为:context.getResources().getString(R.string.strKey);
            resValue("string" , "strKey","beta版本")
        }
        Releases{
            applicationId "com.zejian.multi_versionapk.release"
            manifestPlaceholders = [app_name:"multi_versionapk.release",icon: "@mipmap/ic_launcher_releases"]
            resValue("string" , "strKey","release版本")
        }
    }
}
dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.2.0'
}

接下来在命令行输入 ./gradlew assembleRelease,回车,开始打包,打包结果如下:


现在我们把两个版本apk都安装在同一台手机上试试:

很显然成功了,然后我们在反编译一下apk,查看一下AndroidManifest.xml文件,主要观察一下包名是否发生变化了,结果如下:


到此多版本apk安装同一手机测试成功,告一段落,接下来继续研究一下不同平台的多版本apk。

2.多平台多版本apk

        通过上面的分析,这个就显得比较简单了,首先我们以百度地图为例,导入百度地图的so包,这里仅做演示,不真正集成百度地图哈。


接下来我们要打2种版本的包,分别是arm平台,x86平台,下面我们直接在gradle中配置:

这里一定要注意so包文件夹名称一定要对应!还有这里使用的老版的ndk配置方式,as好像不通过,因我对ndk还没太多研究,而且这里我们主要是讲解apk的打包过程,所以还是决定使用老式配置,不过我们需要在gradle.properties文件中配置一句话,那就是android.useDeprecateNdk=true,即允许使用过时的ndk配置,这样才能编译通过哈。接下来就直接运行打包吧,./gradlew assembleRelease,回车运行,把打包好的apk修改后缀为zip,并解压,查看lib目录是否分类了so文件即可:

很明显也成功了吧,到此多平台多apk打包也就完成啦。本篇也完结了哈。献上gradle文件内容:

  • apply plugin: 'com.android.application'  
  •   
  • android {  
  •   
  •     signingConfigs {  
  •         debug4zj {  
  •             keyAlias 'debug4zj'  
  •             keyPassword 'debug4zj'  
  •             storeFile file('/Users/zejian/Documents/android-studio-workplace/debug4zj.jks')  
  •             storePassword 'debug4zj'  
  •         }  
  •     }  
  •     compileSdkVersion 23  
  •     buildToolsVersion "23.0.2"  
  •   
  •     defaultConfig {  
  •         applicationId "com.zejian.multi_versionapk"  
  •         minSdkVersion 10  
  •         targetSdkVersion 23  
  •         versionCode 1  
  •         versionName "1.0"  
  •   
  •   
  •     }  
  •     buildTypes {  
  •   
  •         release {  
  •             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
  •             signingConfig signingConfigs.debug4zj  
  •             minifyEnabled true  
  •             zipAlignEnabled true  
  •         }  
  •     }  
  •   
  •     //多平台apk  
  •     productFlavors{  
  •   
  •         arm{  
  •             ndk{  
  •                 abiFilters "arm64-v8a" , "armeabi"  , "armeabi-v7a"  
  •             }  
  •         }  
  •         x86{  
  •             ndk{  
  •                 abiFilters "x86" , "x86_64"  
  •             }  
  •         }  
  •     }  
  • }  
  •   
  • dependencies {  
  •     compile fileTree(include: ['*.jar'], dir: 'libs')  
  •     testCompile 'junit:junit:4.12'  
  •     compile 'com.android.support:appcompat-v7:23.2.0'  
  • }  
  • 最后编辑于
    ©著作权归作者所有,转载或内容合作请联系作者
    • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
      沈念sama阅读 159,835评论 4 364
    • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
      沈念sama阅读 67,598评论 1 295
    • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
      开封第一讲书人阅读 109,569评论 0 244
    • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
      开封第一讲书人阅读 44,159评论 0 213
    • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
      茶点故事阅读 52,533评论 3 287
    • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
      开封第一讲书人阅读 40,710评论 1 222
    • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
      沈念sama阅读 31,923评论 2 313
    • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
      开封第一讲书人阅读 30,674评论 0 203
    • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
      沈念sama阅读 34,421评论 1 246
    • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
      茶点故事阅读 30,622评论 2 245
    • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
      茶点故事阅读 32,115评论 1 260
    • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
      沈念sama阅读 28,428评论 2 254
    • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
      茶点故事阅读 33,114评论 3 238
    • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
      开封第一讲书人阅读 26,097评论 0 8
    • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
      开封第一讲书人阅读 26,875评论 0 197
    • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
      沈念sama阅读 35,753评论 2 276
    • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
      茶点故事阅读 35,649评论 2 271

    推荐阅读更多精彩内容