多包名打包以及整合“極光推送”的坑點(區別於“多渠道打包”)

billllll1llllll發表於2017-10-29

最近經常看到公司同事分享一些文章,偶然看到一篇講運營的文章,大概說運營和技術是分不開的 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,極光推送團隊把他們統稱為“包名”

![Uploading QQ截圖20171028105410_986493.png . . .]
![Uploading QQ截圖20171028105410_986493.png . . .]

####總結一下:
雖然極光團隊做的文件有瑕疵,不過也是情有可原,有谷歌的部分原因,畢竟剛開始的時候Eclipse上對於applicationId和packageName是沒區別的,兩者相同,到了AS上面才有了區分。不過還是希望極光團隊能把文件修改一下,做到盡善盡美。此處應該艾特“極光推送團隊”

本文講的主要講了:
1.Android中區別應用的東西是:applicationId。
2.gradle的應用。
3.極光在多包名打包的時候,文件上的一些紕漏

其實講完發現並不是啥黑科技,只不過作為一個開發來說,總要懂一些運營的東西辣,萬一以後轉管理層呢,做人要有夢想,萬一實現了呢!

最後附上我寫的demo地址,喜歡的可以關注一波。
github.com/billllll1ll…

相關文章