android打包資源
❶ android app 打包流程
App 打包
aapt是android中的資源打包工具,打包資源就用它。
打包大致流程:
aapt把resources目錄下的資源生成R.java文件,並為AndroidManifest.xml生成Manifest.java類。
aidl把項目中自定義的aidl文件生成對應的java類。
JavaCompiler把所有的Java源文件編譯成class文件,包括:aapt生成的、aidl生成的、項目中自有的java源文件
使用proguard混淆,並生成一個proguardMapping.xml文件(可選項:可以混淆也可以不混淆)
使用dex工具把所有的class文件生成.dex文件
使用aapt資源打包工具把resources、assets目錄下的資源打包成一個_ap文件
使用apkbuilder把所有的dex、_ap文件、AndroidManifest.xml文件打包成一個未簽名的apk
使用jarsinger生成一個簽名過的apk包
使用zipalign工具對要發布的apk文件進行對齊操作,以便在運行時節約內存。
❷ android aapt 打包是什麼意思這個過程的目的是什麼。
意思:在一個APK文件中,除了有代碼文件之外,還有很多資源文件。這些資源文件是通過Android資源打包工具aapt(Android Asset Package Tool)打包到APK文件裡面的。在打包之前,大部分文本格式的XML資源文件還會被編譯成二進制格式的XML資源文件。
目的:將XML資源文件從文本格式編譯成二進制格式解決了空間佔用以及解析效率的問題和根據資源ID來快速找到對應的資源。
❸ 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
❹ android如何將res文件夾下的資源打包到jar中
1.打包時,將資源放在asset文件夾內,通過AssetsManager獲取指定資源:
目標應用和jar中的assets文件夾會合並,所以可以通過獲取該應用的此類文件夾來獲取目標資源
2.使用library項目
此類方法不能混淆代碼,也就是說發布時需要提供library源項目.在引用此lib的目標項目中會看到一個包含已經編譯成class.dex的jar文件,這個文件反編譯以後仍然是只有代碼部分。
3.使用雙重library項目
提供一種雙層library項目的方法,可以混淆代碼,但是xml與圖片資源仍然是暴露的,且發布時需要提供二級引用項目,操作上復雜度較高,不如直接提供jar包和資源
4.直接提供jar包和資源(分開)
依然是反射R文件,資源會被暴露給開發者。
❺ 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
❻ Android多渠道打包
Demo傳送門
參考:
多渠道打包之動態修改App名稱,圖標,applicationId,版本號,添加資源
AndroidStudio3.0 gradle多渠道打包之 動態設置app名稱、圖標、包名等
Android多渠道打包且根據不同產品打包不同的assets資源目錄
❼ android如何將res文件夾下的資源打包到jar中
1.打包時,將資源放在asset文件夾內,通過AssetsManager獲取指定資源: 目標應用和jar中的assets文件夾會合並,所以可以通過獲取該應用的此類文件夾來獲取目標資源 2.使用library項目 此類方法不能混淆代碼,也就是說發布時需要提供library源項目.在引用此lib的目標項目中會看到一個包含已經編譯成class.dex的jar文件,這個文件反編譯以後仍然是只有代碼部分。 3.使用雙重library項目 提供一種雙層library項目的方法,可以混淆代碼,但是xml與圖片資源仍然是暴露的,且發布時需要提供二級引用項目,操作上復雜度較高,不如直接提供jar包和資源 4.直接提供jar包和資源(分開) 依然是反射R文件,資源會被暴露給開發者。
❽ Android APK打包流程備忘
APK文件的組成部分及apk打包流程是Android開發中的基礎知識點,做一個簡單的記錄。
apk文件是Android應用包文件格式,其本質是一個壓縮文件。將apk文件拖動到Android Studio中即可查看裡面的內容,如下圖:
從上圖中可以看到apk包里的幾個重要組成部分:
打包流程的經典流程圖如下:
其中七個橢圓形內容對應了打包流程中的七個重要步驟,也對應著打包中的七個重要工具,具體如下:
對上面七個重要的打包流程進一步說明。
aapt打包資源文件,生成R.java文件,resources.arsc等文件。
aapt在打包資源文件之前會檢測 AndroidManifest.xml 文件的合法性,對res目錄下的資源目錄進行掃描合法性,因此資源命名有問題時會在編譯階段就會直接報錯。
需要注意的是xml文件會被編譯為二進制的,因此我們並不能直接打開apk包中的xml文件。
AIDL是Android介面定義語言,是Android進程間通訊的一種實現方式。
此步驟中會對aidl文件進行處理,生成java文件。
通過javaCompiler對java文件進行編譯,生成class文件。
dx工具將class文件轉變為Android系統Dalvik虛擬機可執行的Dex文件。
將classes.dex,res文件夾等所有文件打包成apk文件。
生成APK包之後還需要進行簽名處理,Release簽名需要我們自己去進行配置。
常用的簽名方式有兩種:jarsigner和apksigner。
Zipalign是Android平台上APK文件對齊的整理工具,能夠對APK中未壓縮的數據進行4位元組對齊。
需要注意的是根據採用簽名方式的不同,對齊處理的先後順序有所區別。
APK打包流程備忘。
❾ 如何將android項目的圖片等資源文件打包復用
可以將資源做成一個APK
然後在需要調用的application中使用createPackageContext方法獲取資源APK的Context 然後就可以訪問了
❿ 創造 | 一個強大的 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 腳本,如果需要的話可以自己做細微的修改。對於這個腳本,如果你有更好的建議和想法,可以跟我交流~