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

android自動打包

發布時間: 2022-12-09 07:41:46

1. android 使用ant自動打包,某些Jar包包含assets目錄存放資源文件

<!-- 將資源文件放進輸出目錄 -->
<target name="package-res-and-assets">
<echo>Packaging resources and assets...</echo>
<exec executable="${aapt}" failonerror="true">
<arg value="package" />
<arg value="-f" />
<arg value="-M" />
<arg value="${manifest-xml}" />
<arg value="-S" />
<arg value="${resource-dir}" />
<arg value="-A" />
<arg value="${asset-dir}" />
<arg value="-I" />
<arg value="${android-jar}" />
<arg value="-F" />
<arg value="${resources-package}" />
</exec>
</target>

2. Android的編譯打包流程詳解

下圖的是官網對於Android編譯打包流程的介紹。

官方的介紹非常籠統,簡而言之,其大致流程就是:
編譯-->DEX-->打包-->簽名和對齊

(好像什麼都沒Get到,有一種意猶未盡的感覺……)

來一張外國大神的圖片(註:這張圖少了簽名的步驟)

用文字解釋一下上圖的流程:

首先,我們整理一下編譯的輸入部分是什麼(圖中黃色部分):

接下來的步驟:

好了,編譯打包的詳細流程說完了,接下來我們看看是否能回答開篇的那些問題。

答:aapt工具對於每個資源文件生成了唯一的ID,這些ID保存在R.java文件中。如下是R.java文件的內容:

資源ID是一個4位元組的無符號整數,在R.java文件中用16進製表示。其中,最高的1位元組表示Package ID,次高1個位元組表示Type ID,最低2位元組表示Entry ID。

只有一個ID如何能引用到實際資源呢?實際上aapt工具還生成了一個文件resources.arsc,相當於一個資源索引表,或者你理解成一個map也行,map的key是資源ID,value是資源在apk文件中的路徑。resources.arsc裡面還有其他信息,這個就不多說了。

通過R.java文件和resources.arsc配合,就能引用到實際的資源文件。

答:第7步已經闡述了對齊所做的工作,為什麼要進行對齊,這是為了加快資源的訪問速度。如果每個資源的開始位置都是上一個資源之後的 4*n位元組,那麼訪問下一個資源就不用遍歷,直接跳到4*n位元組處判斷是不是一個新的資源即可。

如果舉例子,那麼對齊有點類似於資源數組化,數組的訪問速度當然比鏈錶快。

答:xml裡面都是各種字元,不利於快速遍歷。編譯成二進制文件,用數字替換各種符號,一方面能快速訪問,另一方面也能減少大小。

https://developer.android.com/studio/build/index.html
http://www.alittlemadness.com/2010/06/07/understanding-the-android-build-process/
http://blog.csdn.net/luoshengyang/article/details/8744683
https://stackoverflow.com/questions/6517151/how-does-the-mapping-between-android-resources-and-resources-id-work
http://www.jianshu.com/p/eaaddfe34d11

3. android如何使用ant批量打包

ps :後期熟悉ant的話,可以使用純ant腳本或者使用另一種更好的自動化打包工具(maven)關鍵代碼如下:package com.cn.ant; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import org.apache.tools.ant.DefaultLogger; import org.apache.tools.ant.Project; import org.apache.tools.ant.ProjectHelper; public class AntTest { private Project project; public void init(String _buildFile, String _baseDir) throws Exception { project = new Project(); project.init(); DefaultLogger consoleLogger = new DefaultLogger(); consoleLogger.setErrorPrintStream(System.err); consoleLogger.setOutputPrintStream(System.out); consoleLogger.setMessageOutputLevel(Project.MSG_INFO); project.addBuildListener(consoleLogger); // Set the base directory. If none is given, "." is used. if (_baseDir == null) _baseDir = new String("."); project.setBasedir(_baseDir); if (_buildFile == null) _buildFile = new String(projectBasePath + File.separator + "build.xml"); //ProjectHelper.getProjectHelper().parse(project, new File(_buildFile)); // 關鍵代碼 ProjectHelper.configureProject(project, new File(_buildFile)); } public void runTarget(String _target) throws Exception { // Test if the project exists if (project == null) throw new Exception( "No target can be launched because the project has not been initialized. Please call the 'init' method first !"); // If no target is specified, run the default one. if (_target == null) _target = project.getDefaultTarget(); // Run the target project.executeTarget(_target); } // private final static ArrayList<String> flagList = new ArrayList<String>(); //也可以使用集合,不過需要手動添加項 private final static String[] flagList = new String[]{"htc","moto","oppo"};//此處初始化市場標識 private final static String projectBasePath = ""; //項目的根目錄,需要配置 private final static String ApkPath = ""; //要改名後拷貝的目錄,需要配置 private final static String placeHolder = ""; //佔位符,需要配置 public static void main(String args[]) { //flagList.add("htc"); //flagList.add("moto"); //flagList.add("oppo"); try { System.out.println("---------ant批量自動化打包開始----------"); for(String flag : flagList){ //先修改manifest文件:讀取臨時文件中的@market@修改為市場標識,然後寫入manifest.xml中 String tempFilePath = projectBasePath + File.separator + "AndroidManifest.xml.temp"; String filePath = projectBasePath + File.separator + "AndroidManifest.xml"; write(filePath,read(tempFilePath, flag)); //執行打包命令 AntTest mytest = new AntTest(); mytest.init( projectBasePath + File.separator + "build.xml", projectBasePath); mytest.runTarget("clean"); mytest.runTarget("release"); //打完包後執行重命名加拷貝操作 //String flag = "htc"; File file = new File(projectBasePath + File.separator +"bin"+File.pathSeparator+"MainActivity-release.apk");//bin目錄下簽名的apk文件 file.renameTo(new File(ApkPath + File.separator + "MainActivity_"+flag+".apk")); } System.out.println("---------ant批量自動化打包結束----------"); } catch (Exception e) { e.printStackTrace(); System.out.println("---------ant批量自動化打包中發生異常----------"); } } public static String read(String filePath,String replaceStr) { BufferedReader br = null; String line = null; StringBuffer buf = new StringBuffer(); try { // 根據文件路徑創建緩沖輸入流 br = new BufferedReader(new FileReader(filePath)); // 循環讀取文件的每一行, 對需要修改的行進行修改, 放入緩沖對象中 while ((line = br.readLine()) != null) { // 此處根據實際需要修改某些行的內容 if (line.contains(placeHolder)) { line = line.replace(placeHolder, replaceStr); buf.append(line); } else { buf.append(line); } buf.append(System.getProperty("line.separator")); } } catch (Exception e) { e.printStackTrace(); } finally { // 關閉流 if (br != null) { try { br.close(); } catch (IOException e) { br = null; } } } return buf.toString(); } /** * 將內容回寫到文件中 * * @param filePath * @param content */ public static void write(String filePath, String content) { BufferedWriter bw = null; try { // 根據文件路徑創建緩沖輸出流 bw = new BufferedWriter(new FileWriter(filePath)); // 將內容寫入文件中 bw.write(content); } catch (Exception e) { e.printStackTrace(); } finally { // 關閉流 if (bw != null) { try { bw.close(); } catch (IOException e) { bw = null; } } } } }

4. 創造 | 一個強大的 Android 自動化打包腳本

該腳本是我在獨立開發過程中,為了提升 Android 應用打包和運營的效率而開發的腳本。項目地址是,

https://github.com/Shouheng88/autopackage

如項目中的語言構成展示的,該腳本完全使用 python 語言開發完成。

使用起來非常簡單,首先你要准備如下的環境,

然後,通過編輯配置文件 config.yml 對腳本進行配置。比如,

YAML 格式也不算新穎,早在幾年之前的 SpringBoot 裡面就已經採用了這種格式。相比於使用 json 或者 properties 等格式的配置文件,它更加簡潔。

1、使用 gradle 指令自動打包,區分 32 位和 64 位 :因為現在有些應用市場明確要求區分 32 位和 64 位,所以,打包的時候要分開進行打包。

2、打包完成之後將 APK 拷貝到指定的目錄 :主要用來做本地的 APK 文件備份,後面也會用這里拷貝的 APK 文件進行自動化加固。

3、使用 diffuse 輸出相對於上一個版本的 APK 版本差異報告 :diffuse 是 JakeWharton 開發的 APK, AAB, AAR 和 JAR 的對比工具。這里我用它對比當前版本和上一個版本的 APK 的信息,以實現對 APK 質量的監控。diffuse 項目的地址是 https://github.com/JakeWharton/diffuse

3、拷貝多語言資源到指定的目錄,並自動提交到 Github 倉庫以便於協助翻譯 :對做國際化的應用的開發者而言,我們可以通過應用內的協助翻譯功能藉助社區的力量實現應用的多語言。這里我盡量將這個過程做得更加自動化。即在應用打包完成之後將應用內的多語言資源按照版本信息拷貝到指定的目錄下。然後使用 Git 工具將其推送到 Github 等。具體的效果可以參考 https://github.com/Shouheng88/LeafNote-Community .

4、自動打 tag 並提交到遠程倉庫 :該功能用來在打包完成之後使用為當前版本添加 Git tag,以便於後續根據版本回滾到指定的 Git 提交記錄。

5、根據 Git 提交記錄自動生成更新日誌 :上面做了為項目自動添加 Git tag 的功能之後,我們可以根據當前版本到上一版本之間的 Git 提交記錄的 comment 信息自動生成版本更新日誌。雖然,這個這樣生成的更新日誌並不能直接用作發布時的更新記錄,但在至少可以讓我們直觀得看到這個版本修改了什麼。

6、使用 360 加固 對上述 APK 進行加固並輸出到指定的目錄 :加固操作其實非常簡單,只需要一個 command 指令就可以完成了,

不過在使用上述命令之前需要先通過 GUI 的形式修改你在 360 加固中的渠道和簽名信息(直接手動改文件也可以)。

7、上傳打包 APK 到藍奏雲 :藍奏雲是現在很多開發者用來分享軟體的一個雲存儲平台,100M 以下的文件可以免費存儲,類似於網路雲。上傳藍奏雲之前需要先修改配置文件,

這里需要填入的 ylogin 和 phpdisk_info 可以在登錄之後通過 Chrome 的開發工具查看 cookie 信息得到。目前能夠做到自動化的一個方案就是使用上述兩個信息。

8、通過 Telegram bot 將打包完成的渠道包和更新日誌信息發送到 Telegram 群組 :對海外的用戶我們可以通過 Telegram 作為一個交流的渠道。Telegram 是一個非常好用的聊天軟體。它提供了 bot 功能,即一個可以推送消息的機器人。我們可以通過這個功能來在群組中推送消息、圖片和文件。Telegram 的 bot 有非常強大的自定義性。其實我們完全可以基於爬蟲和 bot 維護一個社區,然後通過在社區內推送廣告來獲得一些利益。這也不失為一個賺錢的渠道。使用 Telegram bot 之前需要在配置文件中填入如下信息,

這里的 token 是注冊 bot 的時候得到的信息。chat_id 可以通過如下方式獲取到:

即將 token 信息填入到上述 <YourBOTToken> 處。在返回的 json 結果中可以獲取到 chat id 信息。

向群組推送信息的方式非常簡單,一個 http 請求即可完成,

更多的協議可以參考這個文檔: https://core.telegram.org/bots/api#senddocument

9、完成上述操作之後使用郵件通知打包結果 :最後就是在完成了最終的打包操作之後通過 Email 發送一封郵件,內部包含了本次打包的 diff 信息等給指定的用戶。使用郵件功能需要在配置文件中填寫,

這里我們使用的是 QQ 郵箱來發送郵件。這里需要填寫的 user 和 password 欄位分別是郵箱和開通 smtp 服務時系統提供的密碼信息。QQ 郵箱開通 SMTP 伺服器其 官方文檔 即可。

上述是該打包腳本的主要功能。後續我會添加更多功能。因為時間有限,有些功能需要修改一下才能使用。不過,許多功能我都封裝成了獨立的 Python 腳本,如果需要的話可以自己做細微的修改。對於這個腳本,如果你有更好的建議和想法,可以跟我交流~

5. Android 通過 github actions 自動化打包 並發布 fir.im 爬坑記

yml文件在 .github/workflows/ 目錄下

6. (五)Android多渠道打包:美團多渠道打包原理以及使用

1.傳統打包:
傳統的打包方法都是在AndroidManifest添加渠道標示,每打一次包修改一次標示的名稱。效率特別的低,一個稍微大一點的項目打上幾十個渠道包可能需要幾個小時半天的時間。
2.由於傳統的打包方式每次修改渠道都需要重新的構建項目,時間都浪費構建上面了,美團提供了一種新的打包方案:
Android應用使用的APK文件就是一個帶簽名信息的ZIP文件,根據 ZIP文件格式規范,每個ZIP文件的最後都必須有一個叫 Central Directory Record 的部分,這個CDR的最後部分叫」end of central directory record」,這一部分包含一些元數據,它的末尾是ZIP文件的注釋。注釋包含Comment Length和File Comment兩個欄位,前者表示注釋內容的長度,後者是注釋的內容,正確修改這一部分不會對ZIP文件造成破壞,利用這個欄位,我們可以添加一些自定義的數據,Packer-Ng方式打包就是在這里添加和讀取渠道信息。打包神器,100個渠道包只需5s 哈哈 。
原理很簡單,就是將渠道信息存放在APK文件的注釋欄位中。

第一步:直接將PackerNg作為Utils拷貝到項目中。

第二步:創建一個保存渠道包名的txt文件,可以放在項目主目錄下:比如命名market.txt
渠道名可以按照需求隨便添加
an

huawei
legend
letv
meizu
oppo
qq
PC
sougou
UC
update
update1
vivo
wandoujia
woshangdian
xiaomi

第三步:ChannelUtil這個工具類是用於取出文件里的渠道名

第四步:打開第二步中的PackerNg類,首先配置一下此類main函數中接受的參數信息。本事例通過Android Studio的方式進行配置直接上圖:

圖中標注3的位置就是PackerNg類配置main函數中接受的兩個參數: 第一個參數為默認的release包的apk源文件,包名為ChannelUtil起初默認的包名

拿到這個包名可以傳給後台進行統計或進行其它的操作。

第六步:運行PackerNg類,會在項目目錄下自動生成文件夾apks(在PackerNg.java文件中配置好的apk渠道包存儲路徑)

注意點:第四步中ChannelUtil起初默認的包名為源文件,其它所有的的渠道包都是通過PackerNg打包方式都是以這個源文件為模版,進行復制,將不同的渠道名復制給這個源文件。如果是360渠道上線的話需要將這個包名默認改為360的渠道單獨打包,因為360上線需要加固,會把之前通過源文件復制渠道名給抹掉,所以對於360加固的文件需要單獨把360作為源文件來打包不改為360默認的渠道包後會統計不到360渠道的信息。

7. 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

8. android so庫怎麼打包的

在apk里打包進.so文件的方法
有兩種方法,
1 是在Android.mk文件里增加
LOCAL_JNI_SHARED_LIBRARIES := libxxx
這樣在編譯的時候,NDK自動會把這個libxxx打包進apk;
放在youapk/lib/目錄下。

2 是在應用的目錄下手工建
libs/armeabi
目錄,然後把libxxx.so拷貝到這個目錄下,
這樣NDK就會自動把這個libxxx.so打包進apk,位置還是在
放在youapk/lib/目錄下。

在代碼里,使用
System.loadLibrary("xxx");
就可以載入這個動態庫了。
這里要注意,參數只寫xxx就可以了,不需要寫libxxx,也不需要寫libxxx.so。

還有一點要說明,System.loadLibrary這個函數會在如下路徑搜索libxxx.so文件:
/system/lib
/data/data/you apk package/lib

但,如果libxxx.so還依賴其它.so文件,比如libyyy.so,則System.loadLibrary只會
在/system/lib目錄下去找,如果沒找到,它不會自動到/data/data/you apk package/lib
下去找,這個時候就會報動態庫沒找到的錯;
解決方法是在load libxxx.so之前,先load libyyy.so,如下:
System.loadLibrary("yyy");
System.loadLibrary("xxx");

9. fastlane自動化打包(android)

項目中經常會進行打包分發, 但是常規的打包過程不免會非常的乏味無聊, 重復性的勞動, 實在沒啥意思, 今天就來介紹fastlane工具進行android自動打包, 上傳蒲公英(也可以firim)並進行釘釘群組通知相關人員。

Fastlane是一整套的客戶端CICD工具集合。Fastlane可以非常快速簡單的搭建一個自動化發布服務,並且支持Android,iOS,MacOS。
Fastlane命令執行的底層並不是自己實現的,而是調用其他的插件或者工具執行的。比如說打包,Fastlane中的gym工具只是xcodebuild工具的一個封裝,調用的其實還是xcodebuild中的打包命令。
Fastlane本身沒有一套特殊語法,使用的Ruby語言。
Fastlane的插件工具叫做action,每一個action都對應一個具體的功能。

1、蘋果系統自帶有ruby

2、安裝今天的主角fastlane

通過修改用戶讀寫許可權可以解決

3、安裝蒲公英的 Fastlane 插件

如果遇到這種情況:Could not find action, lane or variable 'pgyer'.

可能是你安裝pgyer插件的時候,不是在項目fastlane文件夾下安裝的,重新安裝一下就可以解決上面的錯誤。

4、安裝獲取應用版本的 Fastlane 插件

如果出現類似pgyer的錯誤,同理在項目fastlane文件夾下重新安裝就可以避免找不到插件的命令錯誤。

在使用 Fastlane 之前,我們首先需要在項目中初始化 Fastlane。首先進入 App 的開發目錄,執行以下命令來初始化 Fastlane:

激動人心的時刻終於來了,開始打包。

10. 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安裝之後,秒退。(如果沒有簽名強行打包,則無法安裝)

熱點內容
平方的運演算法則 發布:2025-03-15 19:38:57 瀏覽:969
江蘇省蘇州市社保卡初始登錄密碼是多少 發布:2025-03-15 19:38:55 瀏覽:514
安卓主板哪裡有賣 發布:2025-03-15 19:26:10 瀏覽:30
Q9源碼 發布:2025-03-15 19:24:21 瀏覽:176
芬蘭編程教育 發布:2025-03-15 18:59:46 瀏覽:426
網際網路的伺服器地址 發布:2025-03-15 18:53:01 瀏覽:892
手機實體店什麼配置好 發布:2025-03-15 18:32:35 瀏覽:169
攜帶型電腦的原始密碼是什麼 發布:2025-03-15 18:25:52 瀏覽:798
壓縮空間小 發布:2025-03-15 18:14:05 瀏覽:848
env的腳本 發布:2025-03-15 18:01:24 瀏覽:730