gradle 多版本多apk打包

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


通過上一篇gradle多渠道打包的介紹后,本篇我們就來介紹一下多版本apk的打包。在項目的開發(fā)過程咽袜,有可能我們會有需要打包多種版本apk的需求盾戴,比如當測試部門在測試需要我們提供兩種當前正在開發(fā)的apk的版本油吭,而且這兩種版本都必須安裝在同一臺手機上勾扭,這時我們就需要在打包時打出兩種不同包名的apk去滿足能在同一臺手機上安裝矫钓;再比如我們開發(fā)的apk需要在不同的平臺上運行要尔,什么意思?假如我們的apk集成了百度地圖新娜,而百度地圖提供的sdk中含有的so包會提供2種類型的平臺赵辕,arm,x86等,這時我們需要根據(jù)不同平臺打出2種類型的apk概龄;還有的時候不同的版本apk中使用到的不同的服務端api域名也不相同还惠。 比如 beta_api.com,release_api.com等等.......當這些情況出現(xiàn)時私杜,我們就需要使用到多版本apk打包啦蚕键。當然我們不可能每次都手動去更改救欧,這樣的人力成本太高,也無法忍受锣光,這時就需要gradle為我們排憂解難了笆怠。

????????在本篇中,我們主要介紹兩種方法也就是多版本apk安裝在同一手機上和集成第3方sdk需要提供多版本apk的情況誊爹。

1.多版本apk安裝在同一手機上

????????這種情況只需要我們提供不同包名的apk即可完成蹬刷。因為只要應用包名不一樣即使簽名信息一樣還是可以同時安裝在同一臺手機上的,因此我們應該在打包成apk時修改應用的包名就可以達到目的啦频丘。接下來我們進入實際操作過程办成。這里我們先介紹一個知識點,請直接看下圖:

當然從截圖也可以看出搂漠,配置多apk打包和上一篇文章配置多渠道打包是一樣的,都是在productFlavors中配置的迂卢。如上圖,我們在productFlavors中配置了兩種flavor的apk信息一種是Beta版状答,一種是Releases版冷守,同時每個flavor中我們都重新配置applicationId這個屬性,通過這個屬性我們就可以使打包出來的apk包名產(chǎn)生對應的變化啦惊科。至于為什么重新配置了applicationId就行呢,原因圖已經(jīng)說明啦亮钦,就是因為defaultConfig是Beta版和Releases版flavor的基礎(chǔ)配置馆截,只要我們重寫了applicationId這個屬性就會覆蓋defaultConfig中相對應屬性的信息,從而使打包出來的兩種apk的包名不一樣蜂莉,達到在同一臺手機上安裝的目的蜡娶。那么applicationId又是什么呢?看下圖(因此我們更改其實就是package屬性)



這里還有點要說明的就是為了在java代碼中可以方便獲取到gradle配置文件的數(shù)據(jù)映穗,我們可以通過以下在gradle文件中配置窖张,在java 代碼中使用方式為:context.getResources().getString(R.string.strKey);


當然還有可能會有別的需求,比如說不同版本要使用不同的icon蚁滋,這時該如何做呢宿接?實際上還是在productFlavors的每個flavor中通過manifestPlaceholders屬性配置即可,還是記得我們在上一篇文章說過manifestPlaceholders是一個類似HashMap的容器辕录,因此在manifestPlaceholders可以配置多個屬性睦霎,以便在AndroidManifest.xm中使用,比如我們需要為每種版本的apk替換特定的icon和appName這時我們可以這樣如下配置:


然后在AndroidManifest.xm中這樣使用即可:

這樣我們在打包apk時就可以根據(jù)特定需求獲取到不同版本的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炉峰,回車钓株,開始打包,打包結(jié)果如下:


現(xiàn)在我們把兩個版本apk都安裝在同一臺手機上試試:

很顯然成功了命辖,然后我們在反編譯一下apk沟涨,查看一下AndroidManifest.xml文件恤批,主要觀察一下包名是否發(fā)生變化了,結(jié)果如下:


到此多版本apk安裝同一手機測試成功拷窜,告一段落开皿,接下來繼續(xù)研究一下不同平臺的多版本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打包也就完成啦武鲁。本篇也完結(jié)了哈。獻上gradle文件內(nèi)容:

  • 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'??
  • }??
  • 最后編輯于
    ?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
    • 序言:七十年代末蝠检,一起剝皮案震驚了整個濱河市沐鼠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖饲梭,帶你破解...
      沈念sama閱讀 206,723評論 6 481
    • 序言:濱河連續(xù)發(fā)生了三起死亡事件乘盖,死亡現(xiàn)場離奇詭異,居然都是意外死亡憔涉,警方通過查閱死者的電腦和手機订框,發(fā)現(xiàn)死者居然都...
      沈念sama閱讀 88,485評論 2 382
    • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兜叨,“玉大人穿扳,你說我怎么就攤上這事」酰” “怎么了矛物?”我有些...
      開封第一講書人閱讀 152,998評論 0 344
    • 文/不壞的土叔 我叫張陵,是天一觀的道長跪但。 經(jīng)常有香客問我履羞,道長,這世上最難降的妖魔是什么屡久? 我笑而不...
      開封第一講書人閱讀 55,323評論 1 279
    • 正文 為了忘掉前任忆首,我火速辦了婚禮,結(jié)果婚禮上被环,老公的妹妹穿的比我還像新娘糙及。我一直安慰自己,他們只是感情好筛欢,可當我...
      茶點故事閱讀 64,355評論 5 374
    • 文/花漫 我一把揭開白布丁鹉。 她就那樣靜靜地躺著,像睡著了一般悴能。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上雳灾,一...
      開封第一講書人閱讀 49,079評論 1 285
    • 那天漠酿,我揣著相機與錄音,去河邊找鬼谎亩。 笑死炒嘲,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的匈庭。 我是一名探鬼主播夫凸,決...
      沈念sama閱讀 38,389評論 3 400
    • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼阱持!你這毒婦竟也來了夭拌?” 一聲冷哼從身側(cè)響起,我...
      開封第一講書人閱讀 37,019評論 0 259
    • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎鸽扁,沒想到半個月后蒜绽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
      沈念sama閱讀 43,519評論 1 300
    • 正文 獨居荒郊野嶺守林人離奇死亡桶现,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
      茶點故事閱讀 35,971評論 2 325
    • 正文 我和宋清朗相戀三年躲雅,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骡和。...
      茶點故事閱讀 38,100評論 1 333
    • 序言:一個原本活蹦亂跳的男人離奇死亡相赁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出慰于,到底是詐尸還是另有隱情钮科,我是刑警寧澤,帶...
      沈念sama閱讀 33,738評論 4 324
    • 正文 年R本政府宣布东囚,位于F島的核電站跺嗽,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏页藻。R本人自食惡果不足惜桨嫁,卻給世界環(huán)境...
      茶點故事閱讀 39,293評論 3 307
    • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望份帐。 院中可真熱鬧璃吧,春花似錦、人聲如沸废境。這莊子的主人今日做“春日...
      開封第一講書人閱讀 30,289評論 0 19
    • 文/蒼蘭香墨 我抬頭看了看天上的太陽噩凹。三九已至巴元,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間驮宴,已是汗流浹背逮刨。 一陣腳步聲響...
      開封第一講書人閱讀 31,517評論 1 262
    • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留堵泽,地道東北人修己。 一個月前我還...
      沈念sama閱讀 45,547評論 2 354
    • 正文 我出身青樓,卻偏偏與公主長得像迎罗,于是被迫代替她去往敵國和親睬愤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
      茶點故事閱讀 42,834評論 2 345

    推薦閱讀更多精彩內(nèi)容