Android打包(一)

最近出了一點事,比較煩,所以很長一段時間沒怎么去寫文章。為了防止生疏,還是覺得隨便寫寫點什么,我覺得打包還是挺有意思的,所以打算試試看,因為以前的項目打包是不歸我管,既然沒做過,那就試試吧。

一.初試打包

看了下,其實打包不難理解(這里的打包就是多渠道那些了),有點難度的是理解它的原理,所以我覺得可以先玩玩打包,玩爽了,原理也容易懂了。

1.在gradle中添加代碼塊

要配置打包的話,需要在gradle中添加一個productFlavors方法

productFlavors{
        myOne{
            manifestPlaceholders = [APP_NAME: "myOne"]
        }
        myTwo{
            manifestPlaceholders = [APP_NAME: "myTwo"]
        }
    }

比如我這里就分了兩個不同的包myOne和myTwo。

2.系統(tǒng)默認的打包

就一般情況下,androidstudio會默認配置幫你配好兩個包release和debug,比如我新創(chuàng)的一個項目,在gradle中就有一個這樣的代碼塊

buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

這里沒有debug了,因為如果直接調(diào)試就是debug了,沒必要再打包。
但是這兩個還是有區(qū)別的,在buildTypes方法中主要是配置release 和debug的包,在productFlavors方法中可以配置自定義的包,也可以做一些個性化的操作。

3.效果

其實效果是可以選的,androidstudio的打包到最后的可視化頁面中會讓用戶去選擇打什么包。

image.png

手動打包到最后一步有選


DLP{X%%3%S6AB2FFS0LX$HL.png

可以看出Build Tyoe對應(yīng)buildTypes ,F(xiàn)lavors對應(yīng)productFlavors,命令打包下面說。我這里主要是為了說你在gradle的productFlavors方法中配置不同包的話,手動打包的時候可以選擇打哪個配置的包。

二.更改包名

為了區(qū)分不同的包,我決定更改包名,其實這里就是想說說怎么在gradle和manifests中傳值。

1.在manifests中設(shè)置變量

我先在manifests中設(shè)置變量。


image.png

我把label標(biāo)簽的值設(shè)置成${APP_NAME} ,這是manifests里面的語法,我覺得語法這種東西沒必要解釋這么多,就像如果用過DataBinding的話會在manifests中寫更多的變量。

2.在編譯時設(shè)置
image.png

可以在gradle中用manifestPlaceholders來設(shè)置manifest中的變量。原理比較抽象之后會說,先會用就行。

3.結(jié)果
image.png

結(jié)果你會發(fā)現(xiàn)打出來的包中apk的名稱會不同,所以相應(yīng)的我們同樣可以去換APP的icon之類的。

我覺得這就是打包的原理了,上面幾步都很簡單,我覺得唯一郁悶的就是它的這個命名,有一種翻譯不出中文味道的感覺。

對了,如果想換不同包調(diào)試的話,這里可以選


image.png

三.命令打包

在Terminal窗口中輸入命令gradlew assembleRelease可以把所有的包打出來,當(dāng)然這個命令很多,需要用到哪個可以自己去查,打出來之后發(fā)現(xiàn)會是這樣子

image.png

后面顯示未簽名,所以我們需要在腳本中加入簽名的信息
先自己創(chuàng)建一個簽名,然后在代碼中配置這個簽名

signingConfigs {
        release {
            storeFile file("test.jks")
            storePassword "123456"
            keyAlias "test"
            keyPassword "123456"
        }
    }

然后再buildTypes的release添加這個簽名


image.png

之后就能導(dǎo)出簽名的包了


image.png

四.walle打包

這個是一個美團的多渠道打包的插件,為什么要用這個插件呢,直接用上面的方法不就行了嗎,有時候需要打包多,項目大,一個包要打很長時間,這種情況如果一個一個打就會花費很長時間。
好吧,我用walle的最大原因就是能節(jié)省打包的時間,而且修改的時候方便。

1.導(dǎo)入插件

這個應(yīng)該直接上https://github.com/Meituan-Dianping/walle看,當(dāng)前的版本的導(dǎo)入方法是。
在主模塊的gradle中

apply plugin: 'walle'

dependencies {
    ......
    compile 'com.meituan.android.walle:library:1.1.5'
    ......
}

walle {
    apkOutputFolder = new File("${project.buildDir}/outputs/channels")
    apkFileNameFormat = '${appName}-${packageName}-${channel}-${buildType}-v${versionName}-${versionCode}-${buildTime}-${flavorName}.apk'
    //configFile與channelFile兩者必須存在一個,否則無法生成渠道包。兩者都存在時優(yōu)先執(zhí)行configFile
    channelFile = new File("${project.getProjectDir()}/channel.txt")
    //configFile = new File("${project.getProjectDir()}/config.json")
}

walle里面的意思在項目地址里面有詳細的說明,我就不再多解釋。

在項目的gradle中配置

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.3'
        classpath 'com.meituan.android.walle:plugin:1.1.5'
    }
}

然后寫個多渠道的文件


image.png

${project.getProjectDir()}是app目錄,我這是是在app目錄下創(chuàng)建一個channel.txt的文件,按照官方的做法寫渠道。


image.png

你取什么名都行,相應(yīng)配置就行。目標(biāo)文件也是,取什么名,放哪里,主要是在walle 方法中配置就行,我這里的目標(biāo)文件是app文件夾下的outputs文件夾下的channels文件夾。

用命令打所有的包:gradlew clean assembleReleaseChannels , mac系統(tǒng)要在前面加./

這樣就可以導(dǎo)出所有包了,還有其它的命令可以在項目地址里面看,我這里只寫了導(dǎo)所有。

image.png

然后channels文件夾下就有所有所配置的渠道的包。這個插件用起來還是很方便的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容