最近經(jīng)??吹焦就路窒硪恍┪恼拢既豢吹揭黄v運營的文章,大概說運營和技術(shù)是分不開的 balabala。
放幾張圖片,看下效果,直觀方便。
這三個app,安裝到同一臺機器上的是同一套代碼,你敢信?一般的分渠道打包,是同一套代碼,但是app也是同一個,只是里面渠道不一樣而已。我這個是app外觀和內(nèi)部全都不一樣。不信你看:
ASO技術(shù),一個能讓產(chǎn)品迅速火起來的東西,典型公司,某馬拉雅聽書(此處不評價,不撕逼,只說技術(shù))。不多說,下面進入技術(shù)分享階段。
先講一下“多渠道打包”和“多包名”打包的不同。
1.多渠道打包,一般用在app在各大應(yīng)用市場分發(fā)統(tǒng)計。比如,360應(yīng)用平臺、應(yīng)用寶、豌豆莢等。
2.多包名打包,這個詞是我自己想出來的,實際上算是ASO的一部分,確定的說應(yīng)該是多id打包,就是一套app的代碼打包成很多app這里就不糾結(jié)了。這個多用于ASO技術(shù),因為網(wǎng)上沒什么教程,所以自己寫一份,以供大家參考。
因為1技術(shù)網(wǎng)上資料很多,所以不再贅述。
講一下2,先說原理:主要是根據(jù)applicationId的不同來實現(xiàn)的,因為各大應(yīng)用平臺都是根據(jù)applicationId來區(qū)分app的異同。
下面我們用productFlavors來實現(xiàn)“多包名打包”。
代碼如下:
productFlavors {
yunweikang {
// 每個環(huán)境包名不同
applicationId "com.bill.first.yunweikang"
// 動態(tài)添加 string.xml 字段;
// 注意,這里是添加,在 string.xml 不能有這個字段,會重名?。。? resValue "string", "app_name", "云衛(wèi)康"
// // 動態(tài)修改 常量 字段
buildConfigField "String", "ENVIRONMENT", '"我的名字叫云衛(wèi)康"'
// 修改 AndroidManifest.xml 里渠道變量
manifestPlaceholders = [CHANNEL_VALUE: "yunweikang",
JPUSH_CHANNEL: "yunweikang",
app_icon : "@mipmap/ic_yunweikang",
appkey : "4e3a7bbd9f3da0f9064e6580"]
}
liulvguangyin {
applicationId "com.bill.second.liulvguangyin"
// 注意,這里是添加,在 string.xml 不能有這個字段,會重名?。。? resValue "string", "app_name", "六律光音"
buildConfigField "String", "ENVIRONMENT", '"我的名字叫六律光音"'
manifestPlaceholders = [CHANNEL_VALUE: "liulvguangyin",
JPUSH_CHANNEL: "liulvguangyin",
app_icon : "@mipmap/ic_liulvguangyin",
appkey : "91022ae3a6df48ea523c70f8"]
}
jin {
applicationId "com.bill.third.jin"
// 注意,這里是添加,在 string.xml 不能有這個字段,會重名?。。? resValue "string", "app_name", "金"
buildConfigField "String", "ENVIRONMENT", '"我的名字叫金"'
manifestPlaceholders = [CHANNEL_VALUE: "jinmaike",
JPUSH_CHANNEL: "jinmaike"
, app_icon : "@mipmap/ic_jin",
appkey : "1c0c49844d4d2900cb7fd30b"]
}
簡單對上面的代碼做一個解釋:
"yunweikang"這個算是定義了一個產(chǎn)品(在本文重點講的“多包名打包”中)。
"applicationId"這個是文章開頭講的原理中的重點,一個applicationId對應(yīng)了應(yīng)用市場中的一個產(chǎn)品,即便是同一套代碼,只要applicationId不同,那就有幾個applicationId就是幾個產(chǎn)品。
resValue "string", "app_name", "云衛(wèi)康"這個是動態(tài)生成strings.xml中的文件
buildConfigField "String", "ENVIRONMENT", '"我的名字叫云衛(wèi)康"'這個是動態(tài)生成BuildConfig中的一個變量,一般情況下使用BuildConfig都是判斷是否是Debug模式,例如BuildConfig.DEBUG。
**manifestPlaceholders **中定義的內(nèi)容,是方便在AndroidManifest.xml中引用,如下代碼:
<application
android:name=".app.PackApplication"
android:allowBackup="true"
android:icon="${app_icon}"
android:label="@string/app_name"
android:roundIcon="${app_icon}"
android:supportsRtl="true"
android:theme="@style/AppTheme">
其中引用方式為${}
注意:別忘記在根節(jié)點引用下面一句話
xmlns:tools="http://schemas.android.com/tools"
下面再講一下*多包名打包引入極光推送的時候,文檔上的一些坑
1.起包名的時候,明明是“applicationId”嘛,tell me why
![
]
](http://upload-images.jianshu.io/upload_images/3866750-4c56e70cb4d8e82b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
2.注冊的時候,有些是真正的包名,有些是applicationId,極光推送團隊把他們統(tǒng)稱為“包名”。
總結(jié)一下:
雖然極光團隊做的文檔有瑕疵,不過也是情有可原,有谷歌的部分原因,畢竟剛開始的時候Eclipse上對于applicationId和packageName是沒區(qū)別的,兩者相同,到了AS上面才有了區(qū)分。不過還是希望極光團隊能把文檔修改一下,做到盡善盡美。此處應(yīng)該艾特“極光推送團隊”
本文講的主要講了:
1.Android中區(qū)別應(yīng)用的東西是:applicationId。
2.gradle的應(yīng)用。
3.極光在多包名打包的時候,文檔上的一些紕漏
其實講完發(fā)現(xiàn)并不是啥黑科技,只不過作為一個開發(fā)來說,總要懂一些運營的東西辣,萬一以后轉(zhuǎn)管理層呢,做人要有夢想,萬一實現(xiàn)了呢!
最后附上我寫的demo地址,喜歡的可以關(guān)注一波。
https://github.com/billllll1llllll/PackagePro