1、首先我們使用Idea(AndroidStudio或者Eclipse也行)寫一個(gè)Java類奸远,簡(jiǎn)單地返回一個(gè)字符串標(biāo)識(shí):
Main.java
package com.wushaohong.jar;
public class Main {
public static void main(String[] args) {
}
public String getTag() {
return "Release";
}
}
2、打包成一個(gè)jar(不知道如何打包jar移步搜索引擎),命名為jarRelease.jar;再將代碼的getTag方法return "Release"改成return "Debug"厢蒜,再打包成一個(gè)jar,命名為jarDebug.jar烹植。得到兩個(gè)jar包斑鸦,jarRelease.jar與jarDebug.jar。
3草雕、AndroidStudio創(chuàng)建新的項(xiàng)目巷屿,將兩個(gè)jar包,拷貝到app/libs目錄下墩虹。
***注意事項(xiàng)看注釋解釋
4嘱巾、配置多渠道與渠道加載依賴
app.gradle文件
defaultConfig {
...
flavorDimensions "versionCode"
}
buildTypes {
...
}
// 多渠道打包方式
productFlavors {
// 線下(測(cè)試環(huán)境)
offline {
versionName "offline"
// 配置不同的String,key:config_file败晴,value:offline.properties
resValue("string", "config_file", "offline.properties")
}
// 準(zhǔn)線上(生產(chǎn)環(huán)境,比如帶日志等)
beforeOnline {
versionName "beforeonline"
resValue("string", "config_file", "beforeonline.properties")
}
// 線上(發(fā)布版本)
online {
versionName "online"
resValue("string", "config_file", "online.properties")
}
}
dependencies {
// 此處是創(chuàng)建項(xiàng)目默認(rèn)生成栽渴,需要注釋掉尖坤,如果不注釋,每次打包都會(huì)把libs目錄下所有的jar包打包到apk闲擦;
// 再者慢味,因?yàn)槲覀冮_始生成的jar的源代碼包名是一樣的场梆,會(huì)出現(xiàn)jar重復(fù)沖突等多種問題。
// implementation fileTree(dir: 'libs', include: ['*.jar'])
...
// 渠道名+Implementation纯路,指定某個(gè)渠道包引入某個(gè)依賴或油;
// 這里我們線下引用Debug.jar,線上引用Release.jar驰唬。
offlineImplementation(files('libs/JarDebug.jar'))
beforeOnlineImplementation(files('libs/JarRelease.jar'))
onlineImplementation(files('libs/JarRelease.jar'))
}
5顶岸、創(chuàng)建渠道代碼(資源等),在src(main同級(jí))目錄下叫编,分別創(chuàng)建與渠道名相同的文件夾辖佣,offline、beforeOnline搓逾、online卷谈。各個(gè)目錄下創(chuàng)建與main相同的子目錄/文件,java/包名(與main一致)霞篡,res(資源文件夾)世蔗,AndroidManifest.xml。
***當(dāng)然這些不一定都要?jiǎng)?chuàng)建朗兵,具體根據(jù)實(shí)際需要就好污淋,比如需要區(qū)分代碼的,則需要java目錄矛市,區(qū)分資源則需要res目錄芙沥,涉及到配置AndroidManifest.xml則需要?jiǎng)?chuàng)建。這些文件目錄浊吏,在實(shí)際編譯打包引用會(huì)與main進(jìn)行合并而昨。
創(chuàng)建渠道測(cè)試代碼,為了使每個(gè)渠道包在main當(dāng)中都能夠調(diào)用PushUtils找田,所有這里歌憨,每個(gè)渠道都寫一個(gè)結(jié)構(gòu)一致的PushUtils類,實(shí)際的getToken(業(yè)務(wù)方法)可以不一樣墩衙,本文為了驗(yàn)證渠道依賴务嫡,所以這里每個(gè)渠道都寫成一樣,都是調(diào)用jar包返回一個(gè)字符串標(biāo)識(shí)(驗(yàn)證實(shí)際調(diào)用的是否為gradle配置指定的jar)漆改。
PushUtils.java
package com.wushaohong.productflavorsapp;
import com.wushaohong.jar.*;
public class PushUtils {
public String getToken() {
Main t = new Main();
return t.getTag();
}
}
6心铃、驗(yàn)證
在MainActivity當(dāng)中驗(yàn)證結(jié)果
// 將PushUtils返回的字符串顯示在文本當(dāng)中
textView.setText(new PushUtils().getToken());
運(yùn)行,Build Variants選擇offlineDebug挫剑,文本顯示Debug去扣。這是jarDebug.jar返回的,因?yàn)槲覀冎癵radle配置了offlineImplementation(files('libs/JarDebug.jar'))樊破;同理愉棱,選擇onlineDebug運(yùn)行唆铐,則文本顯示Release。
驗(yàn)證apk奔滑,使用assembleRelease生成各個(gè)apk艾岂,在AndroidStudio里,雙擊apk查看朋其,找到對(duì)應(yīng)代碼王浴,查看編譯后的ByteCode。
7令宿、最后叼耙,本文當(dāng)中,使用assembleRelease構(gòu)建出來的各個(gè)渠道包是未加簽名的粒没,如需了解配置簽名打包宵膨,請(qǐng)移步我的另一篇文章:
https://blog.csdn.net/c_3822/article/details/95058358