最近經常看到公司同事分享一些文章,偶然看到一篇講運營的文章,大概說運營和技術是分不開的 balabala。
放幾張圖片,看下效果,直觀方便。
這三個app,安裝到同一臺機器上的是同一套程式碼,你敢信?一般的分渠道打包,是同一套程式碼,但是app也是同一個,只是裡面渠道不一樣而已。我這個是app外觀和內部全都不一樣。不信你看:
ASO技術,一個能讓產品迅速火起來的東西,典型公司,某馬拉雅聽書(此處不評價,不撕逼,只說技術)。不多說,下面進入技術分享階段。
####先講一下“多渠道打包”和“多包名”打包的不同。
1.多渠道打包,一般用在app在各大應用市場分發統計。比如,360應用平臺、應用寶、豌豆莢等。
2.多包名打包,這個詞是我自己想出來的,實際上算是ASO的一部分,確定的說應該是多id打包,就是一套app的程式碼打包成很多app這裡就不糾結了。這個多用於ASO技術,因為網上沒什麼教程,所以自己寫一份,以供大家參考。
因為1技術網上資料很多,所以不再贅述。
講一下2,先說原理:主要是根據applicationId的不同來實現的,因為各大應用平臺都是根據applicationId來區分app的異同。
####下面我們用productFlavors來實現“多包名打包”。
程式碼如下:
productFlavors {
yunweikang {
// 每個環境包名不同
applicationId "com.bill.first.yunweikang"
// 動態新增 string.xml 欄位;
// 注意,這裡是新增,在 string.xml 不能有這個欄位,會重名!!!
resValue "string", "app_name", "雲衛康"
// // 動態修改 常量 欄位
buildConfigField "String", "ENVIRONMENT", '"我的名字叫雲衛康"'
// 修改 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"這個算是定義了一個產品(在本文重點講的“多包名打包”中)。
"applicationId"這個是文章開頭講的原理中的重點,一個applicationId對應了應用市場中的一個產品,即便是同一套程式碼,只要applicationId不同,那就有幾個applicationId就是幾個產品。
resValue "string", "app_name", "雲衛康"這個是動態生成strings.xml中的檔案
buildConfigField "String", "ENVIRONMENT", '"我的名字叫雲衛康"'這個是動態生成BuildConfig中的一個變數,一般情況下使用BuildConfig都是判斷是否是Debug模式,例如BuildConfig.DEBUG。
manifestPlaceholders 中定義的內容,是方便在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">複製程式碼
其中引用方式為${}
注意:別忘記在根節點引用下面一句話
xmlns:tools="http://schemas.android.com/tools"複製程式碼
####下面再講一下*多包名打包引入極光推送的時候,文件上的一些坑
1.起包名的時候,明明是“applicationId”嘛,tell me why
2.註冊的時候,有些是真正的包名,有些是applicationId,極光推送團隊把他們統稱為“包名”。
####總結一下:
雖然極光團隊做的文件有瑕疵,不過也是情有可原,有谷歌的部分原因,畢竟剛開始的時候Eclipse上對於applicationId和packageName是沒區別的,兩者相同,到了AS上面才有了區分。不過還是希望極光團隊能把文件修改一下,做到盡善盡美。此處應該艾特“極光推送團隊”
本文講的主要講了:
1.Android中區別應用的東西是:applicationId。
2.gradle的應用。
3.極光在多包名打包的時候,文件上的一些紕漏
其實講完發現並不是啥黑科技,只不過作為一個開發來說,總要懂一些運營的東西辣,萬一以後轉管理層呢,做人要有夢想,萬一實現了呢!
最後附上我寫的demo地址,喜歡的可以關注一波。
github.com/billllll1ll…