前言
首頁(yè)要了解 Gradle配置多渠道打包渣淤,APP馬甲包大部分是將應(yīng)用ICON
(應(yīng)用圖標(biāo))赏寇、Name
(名稱(chēng))、applicationId
(應(yīng)用標(biāo)識(shí))价认、Splash
(啟動(dòng)圖)嗅定、Guide
(引導(dǎo)頁(yè))、Style Color
(主題顏色)刻伊、JKS
更換還有代碼邏輯區(qū)分處理露戒。而Gradle多渠道
就可以輕松可以實(shí)現(xiàn)動(dòng)態(tài)替換這些東西。接下來(lái)我們看看微信支付/分享回調(diào)是如何產(chǎn)生問(wèn)題的捶箱。
現(xiàn)有場(chǎng)景微信(支付/分享)回調(diào)產(chǎn)生的問(wèn)題
既然是馬甲包智什,那么applicationId(應(yīng)用Id)
肯定是不一樣的。如果按常規(guī)方法applicationId
和packageName(包名)
一致丁屎,那么如果我們app里有微信分享/支付 這就很麻煩了荠锭,因?yàn)槲⑿牛ǚ窒?支付)成功/失敗后會(huì)使用到我們?cè)谖⑿砰_(kāi)放平臺(tái)配置的packageName
. 干什么呢?用于將結(jié)果回調(diào)給我們的app內(nèi). 怎么回調(diào)呢晨川?微信使用 packageName.wxapi.WXEntryActivity
或者packageName.wxapi.WXPayEntryActivity
在系統(tǒng)中找到這個(gè)類(lèi)回調(diào)結(jié)果证九。
小提示:(分享/支付)調(diào)起微信會(huì)檢查應(yīng)用的
packageName(包名)
這里的packageName(包名)
并不是Manifests
中的packageName
而是applicationId
。因此在多渠道打包時(shí)候共虑,applicationId
修改成多個(gè)不同的值愧怜,為了不影響微信將結(jié)果正常回調(diào)到我們的應(yīng)用妈拌,都必須建立相應(yīng)文件路徑和配置
Test Result:
applicationId
配置和微信開(kāi)放平臺(tái)的packageName
一致拥坛,但是微信回調(diào)類(lèi)的位置不在packageName.wxapi
下也不會(huì)提示(包名/簽名錯(cuò)誤) 而會(huì)調(diào)用起微信并(分享/支付),但是無(wú)法將結(jié)果回調(diào)
這樣就知道我們?cè)陧?xiàng)目中的兩個(gè)文件(WXEntryActivity
和WXPayEntryActivity
)存放位置就至關(guān)重要了尘分,常規(guī)app只要將這兩個(gè)文件放置當(dāng)前packageName.wxapi
下就可以了猜惋。可是馬甲包的applicationId
是不一樣的培愁,那怎么辦呢著摔?
解決方案
一、之前我的常規(guī)做法把微信 APP_ID
和 APP_SECRET
通過(guò)productFlavors
的buildConfigField
配置定续,每次發(fā)布多應(yīng)用都需要改packageName(包名)
發(fā)布谍咆,如果同時(shí)發(fā)布10個(gè)應(yīng)用禾锤,那么就要改10次packageName(包名)
及資源等,然后進(jìn)行打包卧波。 o( ̄︶ ̄)o 非常痛苦
二时肿、在項(xiàng)目(app工程)
里src
下新建以渠道名稱(chēng)命名的文件夾,名字一定要跟渠道名一樣港粱,級(jí)別跟main
文件夾是一樣的螃成,里面獨(dú)有文件獨(dú)有資源的文件結(jié)構(gòu)要跟main
一致。
如圖:
這里有三種文件
- 一種是需要用到的資源文件查坪,如各種
xml
文件或圖片等 - 一種是
java
代碼寸宏。這里要注意一下,xml
文件和圖片等資源會(huì)自動(dòng)替換掉main
文件夾里的相應(yīng)文件偿曙;在java
文件時(shí)氮凝,各個(gè)渠道文件夾里有這個(gè)文件,在main
里也有這個(gè)文件望忆,但在編譯時(shí)就會(huì)提示類(lèi)重復(fù)罩阵,編譯不通過(guò),則需要將main
中相對(duì)于文件刪除启摄。各個(gè)渠道文件夾和main
文件夾之間的關(guān)系不是單純的替換稿壁,而是優(yōu)先使用渠道的東西,編譯時(shí)相當(dāng)于是合并歉备,xml
等文件相當(dāng)于直接替換傅是。 - 還有一種就是
manifests
文件,編譯時(shí)也是合并蕾羊。
我們可以將資源放入不同的渠道文件中喧笔,保證幾個(gè)渠道中的資源名稱(chēng)一致 main
引用不報(bào)錯(cuò)就可以,Android Studio
通過(guò)切換渠道(Build Variants)
會(huì)引用不同的資源文件龟再。
要解決微信回調(diào)的問(wèn)題书闸,就要利用渠道 manifests
文件和java
文件來(lái)實(shí)現(xiàn) 如上圖(1)
再來(lái)看一下Android
狀態(tài)下的目錄結(jié)構(gòu)
再來(lái)看看Manifests
文件里是什么樣的
Gradle
部分代碼如下
因公司代碼不便貼出來(lái),模擬 channel1
利凑、 channel2
浆劲、 channel3
三個(gè)渠道,只要保證productFlavors
里的名稱(chēng)和上面介紹的渠道文件夾名稱(chēng)一致就好了
android {
signingConfigs {
//配置多渠道需要的JKS
channel1 {
//channel1 jks info
}
channel2 {
//channel2 jks info
}
channel3 {
//channel3 jks info
}
}
//省略部分代碼.........
productFlavors {
channel1 {
applicationId "com.test.channel1"
}
channel2 {
applicationId "com.test.channel2"
}
channel3 {
applicationId "com.test.channel3"
}
}
buildTypes {
release {
zipAlignEnabled true
//多個(gè) flavor(渠道) ,指定 flavor 使用指定 簽名
productFlavors.channel1.signingConfig signingConfigs.channel1
productFlavors.channel2.signingConfig signingConfigs.channel2
productFlavors.channel3.signingConfig signingConfigs.channel3
}
//如果 debug 包需要測(cè)試諸如微信截碴、地圖等第三方 sdk ,則可以指定 debug 包使用 release 包的簽名
//debug 并不能設(shè)置多個(gè)簽名
debug {
zipAlignEnabled true
}
}
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [CHANNEL_VALUE: name]
}
}
好了蛉威,這樣配置過(guò)后日丹,在打包生成APK
時(shí),渠道配置的Manifests
文件會(huì)和main
的Manifests
文件會(huì)自動(dòng)合并蚯嫌,這樣的話就將渠道Manifests
配置的activity
注冊(cè)到了我們app
里哲虾,繼而實(shí)現(xiàn)了這篇文章的核心功能 <不用每次都手動(dòng)更換packageName(包名)
> 丙躏,只需要按上面 圖(1)
中的結(jié)構(gòu)配置渠道文件即可
配置渠道資源注意事項(xiàng)
- 保證不同渠道之間 同作用的文件 存放位置及名稱(chēng)要一致(例如
ICON
在多個(gè)渠道文件夾中都存放至drawable-xxgdpi
文件夾 并命名為ic_launcher.png
)