【移動應用開發(fā)技術】Android 多渠道打包的示例分析_第1頁
【移動應用開發(fā)技術】Android 多渠道打包的示例分析_第2頁
【移動應用開發(fā)技術】Android 多渠道打包的示例分析_第3頁
【移動應用開發(fā)技術】Android 多渠道打包的示例分析_第4頁
【移動應用開發(fā)技術】Android 多渠道打包的示例分析_第5頁
已閱讀5頁,還剩4頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

【移動應用開發(fā)技術】Android多渠道打包的示例分析

這篇文章將為大家詳細講解有關Android多渠道打包的示例分析,在下覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。Android是一種基于Linux內核的自由及開放源代碼的操作系統(tǒng),主要使用于移動設備,如智能手機和平板電腦,由美國Google公司和開放手機聯(lián)盟領導及開發(fā)。我們在app正式發(fā)布的時候一定會使用正式簽名的方式來打包,這種方式只能生成唯一的一個包,但是如今的應用商店非常多,如:小米、OPPO、360、百度、豌豆莢、應用寶等等。而我們只有一個apk文件要投入到這么多的應用商店中去,如果你的公司不需要統(tǒng)計每個應用商店的實際下載使用量的話,那倒是不會有這樣的問題。但是,如果你的公司就是需要統(tǒng)計每個商店的實際下載使用情況,那么你將如何去識別當前用戶是從哪一個商店下載來的呢?出現(xiàn)問題原因是:我們使用的apk安裝包當前僅有一個。假設,我們可以向apk內植入一個字符串,比如我給發(fā)布到小米商店的apk中植入“xiaomi”,然后拷貝一份apk安裝包發(fā)布到小米商店中,給百度植入“baidu”,然后也拷貝一份發(fā)布到百度商店中,然后通過JAVA代碼在用戶從某一個商店中下載并使用時,我獲取這個字符串,然后返回給后臺,這不就可以知道用戶從哪個商店下載了嗎!多渠道就是指我們的應用程序可以從不同的商店下載,不同的應用商店就是不同的渠道。那你可能會有疑惑,我們?yōu)槭裁匆烙脩魪哪膫€渠道下載的呢?這個問題其實與利益息息相關,你這樣想。假如你寫一個app發(fā)布到不同的商店上,你肯定會關注究竟哪一個商店的用戶使用量比較多、下載量比較大的問題,你可能手頭沒有那么多經濟去每一個商店平臺都推廣你的app,所以你要記錄哪個商店用戶量最大,然后著重推廣。友盟打包說了這么多,相信你已經明白多渠道打包的重要性了。既然我們可以向每一個apk中植入一個標志這商店名稱的字符串,那么如果一個一個的來的話,顯然是一個龐大的工作,沒有多大實際意義,而且apk文件是無法直接向里面添加一個外部文件的,你需要其他的手段來實現(xiàn),那么我們先來看友盟多渠道打包的方式。友盟的實現(xiàn)方式是通過xxx.keystore文件來進行一個一個的壓包,通過代碼的方式來分別生成一個你指定的應用商店的對應apk文件。這種方式會比較慢,如果你的需求是要投入到幾百上千個商店的話,顯然生成文件的速度會非常慢。但如果你的需求量在幾十上百,我建議你可以使用友盟來打包,公司也通常使用這種方式。那么我們看看如何實現(xiàn)吧!一、引入友盟支持在工程列表(AndroidManifest.xml)文件中加入友盟提供的支持,這個與Activity并列層級。<!--添加友盟支持--><meta-dataandroid:value="${UMENG_CHANNEL_VALUE}"android:name="UMENG_CHANNEL"/><!--添加友盟支持--><meta-dataandroid:value="${UMENG_CHANNEL_VALUE}"android:name="UMENG_CHANNEL"/>二、添加閉包然后在app的build.gradle中添加以下代碼,目的是為了生成對應的應用商店的apk,添加位置在android閉包下,以下代碼不難理解。注意:在gradle中是無法使用數(shù)字開頭的名字,所以你應該懂得變更一下。

//友盟閉包

productFlavors

{

wandoujia

{}

xiaomi

{}

baidu

{}

yingyongbao

{}

//注意

360:gradle

中不能以數(shù)字開頭

_360{}

}

productFlavors.all

{

flavor

->

flavor.manifestPlaceholders

=

[UMENG_CHANNEL_VALUE:

name]

}這里注意一下,也許你會報這個錯誤:ERROR:Allflavorsmustnowbelongtoanamedflavordimension.ERROR:Allflavorsmustnowbelongtoanamedflavordimension.解決方法就是在上面的defalutConfig閉包中添加內容:flavorDimensions"versionCode"flavorDimensions"versionCode"然后再同步一下就沒有問題了。三、簽名打包接下來就是打包的過程了,很簡單,我們只需要選中如下圖中的各個應用商店的版本即可,然后它就會在你設定的目錄下生成對應的apk文件了。如果對簽名打包不懂的可以看這篇文章:AndroidApp正式簽名打包流程這就是我的項目生成的對應的apk文件所在的文件夾,點進去就會看到安裝包啦。四、添加版本號當然了,你可能希望加入當前app的開發(fā)版本號,這樣就對每個版本升級時所用的apk包就一目了然了。這是你需要把當前appbuild.gradle中的deflautConfig閉包下的versionName給設置到打包生成的apk名中。那代碼是這樣的:

//為多渠道包添加

app

版本號

applicationVariants.all

{

variant

->

variant.outputs.all

{

output

->

def

outputFile

=

output.outputFile

if

(outputFile

!=

null

&&

outputF.endsWith(".apk"))

{

def

fileName

=

outputF.replace(".apk",

"-${

defaultConfig.versionName

}.apk")

outputFileName

=

fileName;

}

}

}這是一段groovy語言,通常在jvm中使用,可以很好的和java代碼配合。你只需要將它添加到剛剛寫的友盟閉包后面就可以了,如這樣:然后你再一次打包一下,就可以在目錄中看到apk文件了,一個是剛剛沒有添加的默認版本,一個是擁有版本號。注意:這里會有一個警告信息,內容是這樣:WARNING:API'variantOutput.getPackageApplication()'isobsoleteandhasbeenreplacedwith'variant.getPackageApplicationProvider()'.Itwillberemovedattheendof2019.WARNING:API'variantOutput.getPackageApplication()'isobsoleteandhasbeenreplacedwith'variant.getPackageApplicationProvider()'.Itwillberemovedattheendof2019.它是說這個API在2019年末將要被替換成后面的一個,不過別擔心,只要你在升級gradle的時候注意一下就好了,在未來它要被替換的時候,你也要做出相應的更改!五、獲取渠道信息到目前為止,我們還沒真正的看到這樣打包有什么用處。不著急,我們需要將每個apk文件發(fā)布到對應的商店以后才需要獲取這個字符串,這樣才能夠真正的識別用戶在哪個商店中下載來的,然后在用戶使用量最大的商店中去大力推廣。那么如何獲取這個字符串呢?我就簡單一點,在MainActivity中直接獲取這個字符串了,在實際開發(fā)中,顯然是要把這個信息傳給后臺進行統(tǒng)計的,不然沒有任何意義。我們的獲取代碼如下:還記得我們在meta-data中定義了UMENG_CHANNEL屬性的名字嗎,現(xiàn)在我們就可以利用它來獲取字符串了。import

android.content.Context;

import

android.content.pm.ApplicationInfo;

import

android.content.pm.PackageManager;

public

class

ChannelUtil

{

public

static

String

getChannel(Context

context)

{

PackageManager

pm

=

context.getPackageManager();

ApplicationInfo

appInfo

=

null;

try

{

appInfo

=

pm.getApplicationInfo(context.getPackageName(),

PackageManager.GET_META_DATA);

return

appInfo.metaData.getString("UMENG_CHANNEL");

}

catch

(PackageManager.NameNotFoundException

e)

{

e.printStackTrace();

}

return

"";

}

}然后我在啟動app的時候使用toast驗證一下是否如我們想象的一樣:獲

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論