當前位置:首頁 » 安卓系統 » gradle打包android

gradle打包android

發布時間: 2023-01-10 15:39:34

A. [Unity] 使用Gradle系統打包

    新版本的Unity中,提供了新的Build System —— Gradle。

        使用Gradle打包前,首先要創建keystore,配置好簽名才能使用。具體步驟如下:

1.打開Files -> Build Settings -> Player Settings ->Publishing Settings,看到keystore配置。

2.在Create a new keystore 的單選框里打上√,在下面的輸入框中輸入密碼。(記住這個密碼,打包的時候需要輸入哦!)

3.點擊Browse Keystore按鈕,填寫名字後保存。

保存後,會在按鈕旁顯示路徑。

4.點擊 Alias 下拉框,選擇Create a new key,這時候會跳出一個彈窗,填寫信息後創建一個key。這時候就能在 Alias 下拉框中選到你創建的key,然後輸入創建key時的密碼。

5.選擇 Build System 為 Gradle,並在Custom Gradle Template 單選框中打√。

6.上圖中的mainTemplate.gradle需要從Unity中復制出來導入項目,並進行相關配置,文件地址在:Unity安裝位置Unity -> Editor -> Data -> PlaybackEngines -> AndroidPlayer -> Tools -> GradleTemplates

這時候就可以進行Build或者Export了。

        還有一些地方值得注意的是,Unity的Gradle tools工具的版本,以及Android Studio的Plugins版本以及Gradle版本,要對應,不然會報錯。

        Unity使用的Gradle Tools版本:打開mainTemplate.gradle文件可以看到一下信息,如果有使用其他arr包建議使用一樣的gradle版本。

        Unity使用的Gradle Plugin版本:項目地址 -> Temo -> gradleOut -> .gradle

        Android Stuido中的版本:File -> Project Structure -> Project

        他們之間的對應關系如下圖,參考鏈接: https://developer.android.com/studio/releases/gradle-plugin#updating-gradle

B. Android Studio 工具的使用介紹、項目結構,打包、gradle、調試

剛開始使用,看到這么多東西是不是很方?別怕,慢慢來(笑)

File :新建、打開項目!
Preferences :設置
Edit :主要包括復制粘貼、Find查找
Build :構建項目,構建單個moudle、clean項目、build apk 構建一個沒有簽名的APK
Build Generate Singed Apk 構建一個有簽名的APK,和Ecplise一樣如果有現成的簽名文件可 以直接導入使用,如果沒有 可以創建一個。.jks和.keystore都是app簽名文件使用沒區別。
Run :主要包括運行app 或者Debug運行app
VCS :版本控制包含了git github svn vcs等導入導出項目到版本控制伺服器

Android工程是通過gradle文件管理各項配置噠,分成兩個層級: project 和 mole

build.gradle
Mole層級的build.gradle的主要用於配置Mole的,下面看看它的一些配置

讓它運行一下:

這個時候就可以在下面看到當前運行情況

C. 新一代Android渠道打包工具:1000個渠道包只需要5秒

♥♥♥  原文轉自 極分享 更多詳情及更新 查看原文   ♥♥♥

最新版本

v1.0.4 - 2016.01.19 - 完善獲取APK路徑的方法,增加MarketInfo

v1.0.3 - 2016.01.14 - 增加緩存,新增ResUtils,更有好的錯誤提示

v1.0.2 - 2015.12.04 - 兼容proctFlavors,完善異常處理

v1.0.1 - 2015.12.01 - 如果沒有讀取到渠道,默認返回空字元串

v1.0.0 - 2015.11.30 - 增加javapython打包腳本,增加文檔

v0.9.9 - 2015.11.26 - 測試版發布,支持全新的極速打包方式

源碼:https://github.com/mcxiaoke/packer-ng-plugin

項目介紹

packer-ng-plugin 是下一代Android渠道打包工具Gradle插件,支持極速打包,1000個渠道包只需要5秒鍾,速度是 gradle-packer-plugin 的1000倍以上,可方便的用於CI系統集成,支持自定義輸出目錄和最終APK文件名,依賴包:com.mcxiaoke.gradle:packer-ng:1.0.+ 簡短名:packer,可以在項目的 build.gradle 中指定使用,還提供了命令行獨立使用的Java和Python腳本。實現原理見本文末尾。

使用指南

Maven Central

.

.

.

.

.

實現原理

PackerNg原理  

優點

使用APK注釋欄位保存渠道信息和MAGIC位元組,從文件末尾讀取渠道信息,速度快

實現為一個Gradle Plugin,支持定製輸出APK的文件名等信息,方便CI集成

提供Java版和Python的獨立命令行腳本,不依賴Gradle插件,支持獨立使用

由於打包速度極快,單個包只需要5毫秒左右,可用於網站後台動態生成渠道包

缺點

沒有使用Android的proctFlavors,無法利用flavors條件編譯的功能

文件格式

Android應用使用的APK文件就是一個帶簽名信息的ZIP文件,根據 ZIP文件格式規范,每個ZIP文件的最後都必須有一個叫Central Directory Record 的部分,這個CDR的最後部分叫"end of central directory record",這一部分包含一些元數據,它的末尾是ZIP文件的注釋。注釋包含Comment Length和File Comment兩個欄位,前者表示注釋內容的長度,後者是注釋的內容,正確修改這一部分不會對ZIP文件造成破壞,利用這個欄位,我們可以添加一些自定義的數據,PackerNg項目就是在這里添加和讀取渠道信息。

細節處理

原理很簡單,就是將渠道信息存放在APK文件的注釋欄位中,但是實現起來遇到不少坑,測試了好多次。

同類工具

gradle-packer-plugin - 舊版渠道打包工具,完全使用Gradle系統實現,能利用Android提供的proctFlavors系統的條件編譯功能,無任何兼容性問題,方便集成,但是由於每次都要重新打包,速度比較慢,不適合需要大量打包的情況。(性能:200個渠道包需要一到兩小時)

Meituan-MultiChannelTool - 使用美團方案的實現,在APK文件的META-INF目里增加渠道文件,打包速度也非常快,但讀取時需要遍歷APK文件的數據項,比較慢,而且以後可能遇到兼容性問題

MultiChannelPackageTool - 將渠道寫入APK文件的注釋,這個項目沒有提供Gradle插件,只有命令行工具,不方便CI集成,使用ZIP文件注釋的思路就是來自此項目

轉自 極分享     閱讀原文

D. Android簡單的打包配置

在android studio中的打包,通常使用以下兩個選項之一,兩個方式都可以構建出apk包

這兩個有什麼區別?

概括一句話:根據gradle中現有的簽名配置進行自動簽名打包
通常debug和dev環境是系統自行配置的debug-sing簽名,不需要手動進行配置,但是release環境是對外發布的環境,必須要求手動在gradle中進行簽名配置才可以打包(後邊說)
所以在gradle配置好了簽名的情況下,直接點擊 Build APK(s) 就可以進行打包

一句話概括:通過手動選擇簽名文件進行簽名打包
這種方式則不需要在gradle中進行配置,直接選擇你已經創建好的簽名文件,輸入對應的密碼等信息,就可以進行打包

然後就可以進行打包了

debug 和 dev 等測試/開發環境 因為系統自動配置了debug-sing 可以直接使用 Build APK(s) 進行打包。
但是release環境需要對外發布,所以需要手動在gradle中進行簽名配置才可以使用 Build APK(s) ,或著自己選擇 Generate Signed Bundle or APK 通過簽名文件進行打包(效果和gradle中配置好了簽名文件完全相同)

那麼就有以下兩個問題:

在 Generate Signed Bundle or APK 中選擇 Create new ...

在mole的gradle.android中輸入:

然後在配置環境的buildTypes中,想使用 signingConfigs 簽名配置的環境加上一句話: signingConfig signingConfigs.release

這樣,就在gradle中配置好了簽名,可以直接使用 Build APK(s) 進行打包
注意這里的 minifyEnabled true 也就是要使用混淆文件(一般測試環境為false 編譯更快)。如果release環境打包,沒有配置好混淆文件的話,會導致apk安裝之後,秒退。(如果沒有簽名強行打包,則無法安裝)

E. Android 打包流程

打包後的apk是一個壓縮包,解壓之後,內容如下:

詳細可參考 apk簽名原理

無論我們怎麼配置gradle文件去自定義打包,但是都是要走上圖所畫的七個流程。七個深綠色的橢圓代表了七個不可或缺的打包步驟,並且每一個步驟都一個打包工具

所用到的工具:

zipalign 位元組對齊:

為什麼要以4位元組整數倍為起始偏移?

在文件對齊後, 就可以使用mmap來直接讀寫apk文件

mmap映射

上面涉及到的Android打包流程是以gradle task鏈的形式串聯起來的。
下面看一下常見的task



我可以想到的:

Transform API

https://www.jianshu.com/p/a134d00e81ab

https://www.jianshu.com/p/fffb81688dc5

F. Android gradle 打包錯誤A problem occurred configuring project ':app'.

因為項目為插件工程,每次編譯需要使用「./gradlew pushPlugin」自動push到殼工程,但是...我的不行,就不行...
錯誤如下:

一臉懵逼,完全看不懂....
按照提示嘗試找找錯誤原因,然後一頓操作,猛如虎:
./gradlew --stacktrace
./gradlew --info
./gradlew --scan
...

這個錯誤感覺有點意思,可能是病灶的根源,仔細一看,確實,經過幾分鍾仔細研究,終於知道了:

解決方案:
1、我首先去把as的jre配置地方改成系統的,發現,改不了,放棄...

2.as不讓改,還不能改自己的么,改本地的環境變數,把java_home的jre換成as的jre地址,
結果,編譯的特別絲滑...

問題解決了,但是總覺得怪怪了,因為本地jre環境被改了,不舒服,哈哈,原因很簡單啊,本地jdk以後升級就不行了,第二種方法只是暫時解決了,並不完美,所以還得再想想...
終極解決:
編寫了一個腳本文件,主要作用有倆個,第一是臨時替換本地jre的地址,指向到as的。第二是直接編譯,然後push;
腳本如下:

ps:把地址換成自己as的jre地址就可以,注意分隔符的方向
運行編譯,完美編譯, 絲滑 ...

G. Android Studio中gradle命令指定打jar包...

近期在項目中需要對網路訪問介面進行jar封裝。

在eclipse中進行指定類進行打jar包很簡單,但是在android studio中則有點困難,其主要的原因是需要掌握gradle命令形式。接下來就直接上干貨。

首先,在你需要進行分裝jar的模塊進行build.gradle文件下進行以下添加:

然後在Windos CMD中跳轉到你的項目路徑下,然後執行gradle makeJar命令,如果提示:gradle命令不可用。那麼你需要在你的系統環境變數中進行變數的添加:

找到你的gradle插件路徑進行添加,然後再在path屬性的末尾進行

「;%GRADLE_HOME%\bin」添加。

然後輸入 "gradle -v"或者"gradle -version"都可以.

如圖就說明gradle配置成功了。

然後再cmd命令到你的項目路徑下,然後再次輸入gradle makeJar回車,

這里提示我們在我需要進行jar分裝的模塊出錯了, 我們按照錯誤提示進行修改 ,在buold.gradle文件中添加

lintOptions {

   abortOnErrorfalse

}

然後點擊Sync Now。再次運行gradle makeJar。然後再一長串的編譯後在末尾看到

然後我們在項目模塊的build/libs文件夾下看到了我們命名的.jar文件

OK,到此就結束了。上面是個簡單的例子,只能打包某個包下面的所有文件,如果要實現只打某個包下面的某些子包或者文件可參考如下示例:

taskmakeSdkJar(type:org.gradle.api.tasks.bundling.Jar){

baseName'pluginsdk'

//只打包org.cmdmac下的org.cmdmac.pluginsdk.impl和org.cmdmac.gamecenter,其他子包不會被打包進去

from('build/intermediates/classes/debug/org/cmdmac/'){

include'pluginsdk/impl'

include'gamecenter'

}

into('org/cmdmac/')

//    exclude('R.class')

//    exclude{ it.name.startsWith('R$');}

taskmakeSdkJar(type:org.gradle.api.tasks.bundling.Jar){

baseName'pluginsdk'

//只打包org.cmdmac下的org.cmdmac.pluginsdk.impl和org.cmdmac.gamecenter,其他子包不會被打包進去

from('build/intermediates/classes/debug/org/cmdmac/'){

include'pluginsdk/impl'

include'gamecenter'

}

into('org/cmdmac/')

//    exclude('R.class')

//    exclude{ it.name.startsWith('R$');}

}

H. Unity3D使用gradle打Android包遇到的aaptOptions.noCompress越界問題及解決方案

Unity3D使用gradle方式打Android包,如果StreamingAssets下文件較多,會打包失敗,錯誤如下:

  java.lang.: 1866

   at org.codehaus.groovy.classgen.asm.CallSiteWriter.getCreateArraySignature(CallSiteWriter.java:58)

原因是aaptOptions.noCompress數組越界,對此問題的詳細描述參考博文:

Unity導出Gradle工程或者apk包,StreamAssets目錄文件超過255無法導出的問題 ... ... ... - liqing19850102的專欄 - CSDN博客

aaptOptions.noCompress數組的最大容量為255,也即可以不經壓縮打到apk包里的資源文件數不能超過255個。

原文中提供的解決方案是,把Unity默認的配置中的 **STREAMING_ASSETS** (含義為StreamingAssets文件夾下所有資源都不壓縮)去掉,改為只針對某些類型的資源不壓縮,比如.bundle

這里我想在原文基礎上拓展三點,來深化對這一問題的認識。

一,為什麼要配置aaptOptions.noCompress

簡單來說,可以提升資源載入效率,因為載入壓縮過的資源需要一個解壓過程

那麼哪些資源需要配置到aaptOptions.noCompress呢?

我們來看一下Unity的默認配置,

aaptOptions { noCompress'.unity3d','.ress','.resource','.obb'**STREAMING_ASSETS** }

.resource是Resources目錄下資源編譯後生成的文件

**STREAMING_ASSETS** 代表StreamingAssets文件夾下的文件

可見動態載入的資源一般要配置到aaptOptions.noCompress里,以提升載入效率

二,當使用默認配置超出最大容量255時怎麼辦

兩種思路

a,將一些小的使用不頻繁的文件從列表中移出

b,將多個文件合並為一個(比如打成bundle)來減少列表中文件數量

這里有必要解答一個疑問,經常會遇到StreamingAssets下文件數量遠小於255,但打包還是會報錯,這是為什麼呢?其實是Resources目錄下資源太多,所以生成的.resource文件數量較多導致的,這種情況下好的解決方案就是將Resources下一些資源打成bundle來使用,減少.resource文件的數量

三,aaptOptions.noCompress配置技巧

aapt官方文檔以及網上查到的一些資料都說aaptOptions.noCompress配置的是不壓縮資源文件的後綴名,但是使用後綴名來配置有一定的局限性,比如有些文件後綴名相同,但是如果只想將其中幾個文件(而不是全部)配成不壓縮,再比如有的文件沒有後綴名怎麼辦?

經過實踐發現aaptOptions.noCompress機制並不是檢查文件後綴名,而是判斷文件路徑是否以某個字元串結尾,另外一個需要注意的地方是,在做string.EndWith判斷之前會將文件路徑全部轉換為小寫,所以aaptOptions.noCompress中的配置項也必須全為小寫

I. Jenkins+Gradle+Github實現Android自動化打包

利用Jenkins搭建Android自動化打包。
參考 Jenkins+Git配置 和 Android使用Jenkins持續集成 進行整理。

選擇對應系統的穩定版本,這里裝的是Mac版本。

可以選擇在步驟1安裝過程中選擇默認的插件安裝,也可以在主頁 系統管理 中選擇 插件管理 進行安裝。

配置打包類型,這里的參數對應的是Android項目gradle配置裡面的 buildTypes 設置的打包類型。

點擊 Git Parameter (如果沒有這個參數檢查一下對應的插件是否安裝)

在GitHub上找到 setting

在項目下的 settings 點擊進去

先檢查插件 Gitlab Hook Plugin 是否安裝
點擊 系統管理 -> 系統設置 -> GitHub -> 添加GitHub伺服器

自此已配置完成,我們開始來點擊構建項目。項目下面點擊 Build with Parameters ,可以看到我們之前設置的配置。打包類型和分支選擇。

J. ANDROID多渠道快速打包實踐

參考資料:
美團Android自動化之旅—生成渠道包
Android批量打包提速
AndroidMultiChannelBuildTool

背景
隨著發版需要,每次發版所需渠道包越來越多(現在差不多有一百個左右了),正常gradle打包由於耗時效率過低已無法滿足需求,開始了android多渠道快速打包實踐。

方法
下面主要介紹兩種快速打包的方式:
1、類似美團的方式,在META-INF中寫入渠道名的空文件,用於讀取空文件。 美團Android自動化之旅—生成渠道包
2、在apk末尾動態寫入渠道信息。 一種動態為apk寫入信息的方案
其實這兩種方式都是同一個原理,替換以前從manifest中讀取渠道號的方式,而使用新的獲取方式(渠道號如何寫入就如何讀取)。
所以這首先需要客戶端(重要!):
1、統一應用中獲取渠道的方式並替換之前的(最好兼容)。
2、注意第三方SDK渠道號的傳入,比如友盟sdk,否則第三方會使用默認從manifest中讀取的方式。

下面介紹一種已經測試過的方法(git上開源項目 AndroidMultiChannelBuildTool )
1、安裝環境由於腳本環境是使用python語言,所以需要我們 安裝環境 。
2、導入項目導入開源項目 AndroidMultiChannelBuildTool ),並把想要批量打包的apk文件拷貝到PythonTool目錄下(與py同級),運行py腳本即可打包完成。

以上基本實現快速打包,經過測試一分鍾百十個無壓力。另外需要注意這種方式只適用於打包需求一致渠道號不同,不適用特殊定製渠道。

備註:9月21日補充快速打包java版本,詳見 AndroidMultiChannelBuildTool-Java-master

熱點內容
phprecv 發布:2025-05-17 11:55:00 瀏覽:610
福建時鍾監控網關伺服器雲主機 發布:2025-05-17 11:54:28 瀏覽:248
c資料庫壓縮 發布:2025-05-17 11:39:22 瀏覽:960
安卓手機如何連接音響功放 發布:2025-05-17 11:37:48 瀏覽:958
破解exe加密視頻 發布:2025-05-17 11:23:41 瀏覽:976
我的世界伺服器圈太大了怎麼辦 發布:2025-05-17 11:15:21 瀏覽:614
便宜的免費雲伺服器 發布:2025-05-17 11:08:50 瀏覽:779
中國頂級dhcp解析伺服器地址 發布:2025-05-17 11:06:27 瀏覽:36
php轉義html 發布:2025-05-17 11:04:00 瀏覽:569
鋼筋籠加密區規范 發布:2025-05-17 10:59:50 瀏覽:6