每次中午吃飯總會和技術同窗聊天。當作 iOS 開發的作安卓開發的人員在一塊兒的時候,他們中間又多了一個話題:iOS 開發難仍是安卓開發難。html
這個時候作安卓開發的同窗最激動說安卓開發要本身畫界面、機型複雜、操做系統多 rom 又被各家改的四不像....開發一個安卓 APP 的時間將近是開發 iOS 所需時間的 2 倍。iOS 開發的同窗可能就會反駁說 iOS 開發入門難度比安卓高,開發中第三方庫不像安卓那麼多,開發設備又必須是 MAC,而安卓隨便一臺 PC 便可...筆者認爲,這個問題因人而異,不想再引發一場爭論。其實,今天想說的是,安卓開發中還有一件事情比較痛苦那就是打包。java
作過 APP 開發的人都知道安卓的渠道林立,筆者記得曾經工做的一家公司每次發包都要運行腳本去打包,每次打幾百個 APK,花費幾個小時,電腦都累的風扇呼呼叫。而 iOS 因爲其封閉性,渠道除了 AppStore 以外幾乎不多了。因此,安卓 APP 開發以後要把 APP 分發出去要作的事情要比 iOS 多這個是必定的。這篇文章我們就和作安卓開發的同窗聊一下安卓 APP 多渠道打包的事情。android
要多渠道打包,咱們就來講一下渠道如何標識。通常來講渠道標識有兩個地方能夠作: 一、在代碼中寫,例如 TalkingData 就提供了這種方式shell
//啓動代碼 init(final Context context, final String appId, final String partnerId); //這種方式不須要在 AndroidManifext.xml 裏的 meta-data 申明瞭 TD_APP_ID 和 TD_CHANNEL_ID
二、在 AndroidManifext.xml 中填寫,還拿 TalkingData 舉例子性能優化
//啓動代碼 init(final Context context); //這種方式可使用多渠道打包工具,方便一次打包多個發佈渠道 //AndroidManifext.xml中這樣寫 <meta-data android:name="TD_CHANNEL_ID" android:value="Your_channel_id" />
若是是單獨打一個 APP 包加上上面的配置直接 IDE 中導出 APK 就好了,若是打不少個 APK 用 IDE 就很費力。 要想多渠道打包,就須要對 Android 的總體的打包編譯過程有所瞭解。下面認識下 Android 的 java 代碼、XML 格式的資源文件、圖片文件等資源是如何轉換成爲一個 APK 的。 網絡
你們從圖中能夠看出,大致分爲如下 7 個大步: 一、打包資源文件,生成 R.java 文件 二、處理 aidl 文件,生成相應 java 文件 三、編譯工程源代碼,生成相應 class 文件 四、轉換全部 class 文件,生成 classes.dex 文件 五、打包生成 apk 六、對 apk 文件進行簽名 七、對簽名的 apk 進行 zipalign 對其操做app
說明:這裏只是大體代表大體的打包編譯過程,其實若是細分每一部分還有不少細節。工具
結合原理和渠道的 一、2 兩種設置方法咱們分別來講.性能
一、若是渠道信息是經過 Java 的硬編碼方式來作的,咱們能夠在打包以前預處理 Java 源文件,找到渠道設置關鍵字,從渠道列表中找到一個渠道設置進去便可。因爲腳本這塊兒,不一樣的語言的實現方式不一樣,這裏不作過多的說明。若是有須要的我能夠把本身以前 shell 寫的一段代碼分享了。gradle
二、若是使用寫在 AndroidManifext.xml 中,這個就能夠經過讀取 XML 文件的方式定位到 meta-data 而且 android:name 的值爲 TD_CHANNEL_ID 的元節點。把這個元節點的值設置成某一個渠道便可。這裏推薦你們看一下友盟開源的一個多渠道打包工具中有相關的實現細 1。這個過程發生在上圖中的 aapt 階段,這個階段作的事情還比較多沒有分來來講。
大體原理就是這樣,其實也很簡單~,就是在正常的 Android 打包編譯過程當中進行干涉,加入一些邏輯來替換相關的渠道信息,保證打包以後的 APK 中的渠道信息各不相同。 其實這個過程是這樣的: 說明:圖片來源網絡
而後編寫腳本或者工具來循環的這個過程....
Android Studio 發佈已經好長時間了,Google 也一直在維護在更新,Android 開發的小夥伴大家用起來了嗎?據說身邊作開發的不少都轉向了這個神器。這裏,咱們就重點說一下如何在 Android Studio 中實現多渠道打包,後續給出一個 Demo來作演示,筆者以爲這樣更實用。 第一步在 AndroidManifext.xml 中配置渠道
<meta-data android:name="TD_CHANNEL_ID" android:value="${ONEAPM_TEST_CHANNEL}" />
第二步,在 APP 下的 build.gradle 中添加
productFlavors { wandoujia{} "1234Test"{} "1test111"{} } productFlavors.all { flavor -> flavor.manifestPlaceholders = [ONEAPM_TEST_CHANNEL: name] }
解釋:productFlavors 相似於一個產品的不一樣特性的配置[2]. productFlavors.all 是一個遍歷,每個 productFlavors 中的值,其中productFlavors 的每個值都有一個 name ,就是相似 wandoujia 這樣的字符,每次循環的時候會替換掉 AndroidManifext.xml 中的${ONEAPM_TEST_CHANNEL}。 第三步,執行打包命令 打開命令行定位到 project 目錄,執行
gradlew assembleRelease
不出意外的話 bulid->outputs->apk 下面會有各個渠道的包,以下圖
注意事項: 一、productFlavors 定義的時候裏面的相似 wandoujia,不能是數字開頭,不能是關鍵字 test 等,由於你要意識到你在寫 gradle 腳本,要符合 groovy 語法。以下面的就不合法 二、flavor.manifestPlaceholders = [ONEAPM_TEST_CHANNEL: name]中的ONEAPM_TEST_CHANNEL 必定要和 AndroidManifext.xml 定義的一致。
開發者花費了很大的心血作出一款 APP 爲的就是但願這款 APP 產生它應有的價值。因此咱們會集成一些統計例如友盟、talking data,有了它每日活躍、新增、留存就有地方看了,這個估計每一個開發者都會作。單更重要的是,咱們作出的 APP 要保證在每臺手機都能正常的打開和使用,特別是在 APP 同質化愈來愈嚴重的今天,你要保證 APP 可以脫穎而出就要保證 APP 穩定,因此咱們能夠順手添加如下 OneAPM[3] 就能監控到應用程序運行緩慢、ANR、Crash、WebView、Activity、網絡請求等方面的性能,能讓開發者第一時間掌握 APP 監控情況。更讓人喜歡的是,這款產品只需開發者填入一行代碼便可,真可謂是「神器」。
OneAPM Mobile Insight 以真實用戶體驗爲度量標準進行 Crash 分析,監控網絡請求及網絡錯誤,提高用戶留存。訪問 OneAPM 官方網站感覺更多應用性能優化體驗,想閱讀更多技術文章,請訪問 OneAPM 官方技術博客。
本文轉自 OneAPM官方技術博客