日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

利用 Android Studio 和 Gradle 打包多版本APK

發(fā)布時(shí)間:2025/4/16 Android 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用 Android Studio 和 Gradle 打包多版本APK 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


視頻匯總首頁:http://edu.51cto.com/lecturer/index/user_id-4626073.html

======================================

在項(xiàng)目開發(fā)過程中,經(jīng)常會(huì)有需要打包不同版本的 APK 的需求。 比如 debug版,release版,dev版等等。 有時(shí)候不同的版本中使用到的不同的服務(wù)端api域名也不相同。 比如 debug_api.com,release_api.com,dev_api.com等等。


不同的版本對(duì)應(yīng)了不同的 api 域名,還可能對(duì)應(yīng)不同的 icon 等。


如果每次都在打包前修改我們都手動(dòng)來修改,這樣實(shí)在是不夠方便。


但如果我們使用了 Android Studio 和 Gradle,這個(gè)麻煩就可以輕松省去。


具體方式如下: 在 Android Studio 中打開 build.gradle(Module中)的 android 節(jié)點(diǎn)下添加如下代碼


buildTypes {


//這里的名字自定義,不要求大小寫

release{


// 這里是在 applicationId 中添加了一個(gè)后綴。所以『.』要加上

applicationIdSuffix ".release"


// 這里的作用是選擇是否混淆代碼

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

}


dev{

applicationIdSuffix ".dev"

minifyEnabled false

proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'


}

}


// 這里是為了不同過的版本設(shè)置一些特殊的參數(shù),并不直接和 buildType 關(guān)聯(lián)。

//例如:使用 buildType 中的 dev 版本,也可以使用 flavors_release 里面設(shè)置的自定義參數(shù)。這需要自己按照需求制定。

productFlavors{


//自定義名字不過不能和上面buildType中相同,不然Gradle編譯會(huì)不通過。在這里使用了『flavors_』前綴以便區(qū)分。

flavors_release{


// manifestPlaceholders中寫到的『str』,『package_name』不支持用大寫,否則Gradle編譯會(huì)不通過。

// 這里所設(shè)置的變量可以直接使用在『AndroidManifest.xml』中,使用方式為:${package_name}

// android:label="${package_name}"

manifestPlaceholders = [str:"releaseStr",package_name:"com.sunhz.mvptest.release"]


// 這里的參數(shù)是為了在 java 代碼中使用,具體的使用方式為:context.getResources().getString(R.string.strKey);

resValue("string" , "strKey","releaseStrValue")

}


flavors_dev{

manifestPlaceholders = [str:"devStr",package_name:"com.sunhz.mvptest.dev"]


resValue("string" , "strKey","devStrValue")

}

}


上面設(shè)置完成后,我們要在哪里使用它?


使用方式如下: 在 Android Studio 的工具欄中,找到『Build』項(xiàng),找到『Generate Signed APK…』。


選擇 Module -> 創(chuàng)建 APK key,或者輸入 APK key密碼 -> 關(guān)鍵來了!如下圖。


在『BuildType』處,選擇我們?cè)?build.gradle 中設(shè)置的兩個(gè) BuildType,分別是releas,dev,debug。其中『debug』為 Android Studio 自帶的。


在『Flavors』處,選擇我們?cè)?build.gradle 中設(shè)置的兩個(gè)Flavors,以方便直接使用定義在 build.gradle 中自定義的參數(shù)。


所以! 上面我有提到說,buildType 和 Flavors 并沒有直接的聯(lián)系。 他們可以根據(jù)用戶需求互相配合使用。如上圖,BuildType 選擇了 release,但 Flavors 選擇的卻是 flavors_dev。


到此基本的使用就全部說完了。


這里有一個(gè)問題,打出來的不同版本的包,全部都能夠在同一部手機(jī)上安裝,且能夠?qū)蓚€(gè)包全都發(fā)布到 Google 的市場(chǎng)上去這是為什么呢?


這里就要提到在 BuildType 中我們所設(shè)置的『applicationIdSuffix』屬性了,按照這個(gè)屬性的字面翻譯為:『applicationId 的后綴』,那這里又來了一個(gè)問題,『applicationId』是什么? 其實(shí)這個(gè)『applicationId』屬性,實(shí)際上在項(xiàng)目創(chuàng)建完成后就存在于 build.gradle 中。在 android 節(jié)點(diǎn)下的 defaultConfig 節(jié)點(diǎn)中。而且默認(rèn)的 applicationId 和 AndroidManifest.xml 中的 package 屬性相同。


如下圖:


我們能夠看到,這兩個(gè)屬性的默認(rèn)值是相同的。


applicationId 和 packageName 它們是什么關(guān)系?


默認(rèn)創(chuàng)建項(xiàng)目后,兩者相同。如果需要根據(jù)不同的需求構(gòu)建不同版本的APK,這時(shí)我們通過設(shè)置『applicationIdSuffix』可以做到。


這里有一個(gè)值得注意的現(xiàn)象。


舉個(gè)例子,我們?cè)诖虬鼤r(shí)使用了 dev 類型,將打包出來的 APK 軟件安裝到手機(jī)中。


使用如下代碼,獲取我們手機(jī)上所有程序的packageName。


PackageManager packageManager = mContext.getPackageManager();

List<PackageInfo> packageInfoList = packageManager.getInstalledPackages(PackageManager.GET_PERMISSIONS);

List<String> packageNameList = new ArrayList<String>();

for (PackageInfo packageInfo : packageInfoList) {

packageNameList.add(packageInfo.packageName);

}


我們打印出來的包名信息中,會(huì)出現(xiàn) com.spencer_dev.test.dev 。并沒有出現(xiàn) com.spencer_dev.test 。


但是! 如果通過反編譯工具,將 APK 包進(jìn)行反編譯直接查看源代碼,在 java 代碼所在的 src 目錄中的包名,還和我們?cè)O(shè)置的一樣,為 com.spencer_dev.test 。可 AndroidManifest.xml 中的 package 和 BuildConfig 類中的 APPLICATION_ID 已經(jīng)變成了 com.spencer_dev.test.dev 。


applicationId 和 packageName 它們各自代表什么?


按照上面的結(jié)果來說, package 代表了 java 代碼中的包名。 applicationId 代表了應(yīng)用中的唯一標(biāo)識(shí)。和應(yīng)用簽名一起用來區(qū)別和其他應(yīng)用不同。我想這也就是為什么 Google 市場(chǎng)能夠允許相同應(yīng)用不同 applicationId 的原因。

長(zhǎng)按下方二維碼就可以識(shí)別關(guān)注


轉(zhuǎn)載于:https://blog.51cto.com/xqtesting/1685124

《新程序員》:云原生和全面數(shù)字化實(shí)踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀

總結(jié)

以上是生活随笔為你收集整理的利用 Android Studio 和 Gradle 打包多版本APK的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 欧美婷婷六月丁香综合色 | 国产精品xxxx喷水欧美 | 欧美亚洲少妇 | 黑人干亚洲女 | 自拍偷拍第2页 | 影音先锋亚洲天堂 | 国产吃瓜在线 | 夜夜爽夜夜操 | 日韩avwww| 日韩激情第一页 | 色久月| www.啪啪 | 第四色在线视频 | 国产激情片 | 欧美高清 | 好吊色在线视频 | www.欧美一区二区三区 | 欧美日韩h | 日韩国产网站 | 热久久最新网址 | 日本中文在线视频 | 亚欧洲精品 | 久久性网| 少妇熟女一区二区 | 久久精品亚洲一区 | 日日精| 日韩欧美国产一区二区三区在线观看 | 亚洲熟女乱色综合亚洲小说 | 成人免费在线观看av | 国产在线xxx | 色撸撸在线视频 | 成人深夜网站 | 四虎免费久久 | 欧美性生交大片免费看 | 亚洲最大福利视频 | 福利一区二区视频 | 欧美精品乱码久久久久久按摩 | 色婷婷丁香 | 都市激情 亚洲 | 日本在线视频播放 | 亚洲另类图区 | 邪恶久久| 国产日韩欧美精品一区 | 久久亚洲精选 | 极品蜜桃臀肥臀-x88av | 少女情窦初开的第4集在线观看 | 欧美精品一二 | 欧美在线视频精品 | 人妻久久久一区二区三区 | 3d动漫精品啪啪一区二区竹菊 | 亚洲视频在线观看网站 | 成年人看的毛片 | 国产毛片久久久久 | 国产精品久久久999 www日本高清视频 | 亚洲黄色av | 成人小视频在线 | 日韩中文字幕精品视频 | 欧美日韩精品一区二区 | 亚洲欧美成人一区二区 | 狠狠热视频 | 粉嫩av蜜桃av蜜臀av | 男女猛烈无遮挡 | 一级大黄毛片 | 91精品一区二区三区在线观看 | 欧美黄色aaa | 美女日批网站 | 欧美日韩亚洲高清 | 亚洲欧美偷拍一区 | 日本一二三区视频 | 久久三级网| 久久久久久久久久久久久久免费看 | 日本黄色短片 | 亚洲一区二区三区免费视频 | 欧美激情一区二区三区p站 欧美mv日韩mv国产网站app | 人妻无码一区二区三区久久 | 欧美三级大片 | 欧美三级小视频 | 91精品国产91久久久久久黑人 | 99热这里只有精品8 国产一卡二 | 三上悠亚影音先锋 | xvideos成人免费视频 | 肉嫁高柳在线 | 成人动漫在线观看免费 | aaa在线视频| 国产精品亚洲一区 | 肉嫁高柳家在线看 | 日女人网站 | 午夜精品剧场 | 一级性生活毛片 | 本道综合精品 | 欧美大片在线免费观看 | 91一区在线观看 | 国精产品一品二品国精品69xx | 国产免费a | 激情亚洲视频 | 日本黄色片网址 | 黄色av资源 | 四虎成人在线视频 | 教练含着她的乳奶揉搓揉捏动态图 |