當前位置:首頁 » 安卓系統 » android編譯apk

android編譯apk

發布時間: 2023-03-25 09:20:02

『壹』 Android 解決編譯 APK 後 so 的 md5 值發生改變的問題

不得不說,還是要 google 比較給力,搜索 so files unzipped from apk md5sum changed 第一條就出來了, The .so file abnormal modified after build in Android Studio - Stack Overflow

編譯晌坦得到 APK 後把 APK 解壓拿出 so 文件,對鍵謹簡比發稿褲現,其 md5 值和原始文件的 md5 值不匹配。

『貳』 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 apk反編譯

1. apktool.jar

2. dex2jar-2.0

3.jd-gui-0.2.7.osx.i686.dmg

1.java -jar /usr/local/bin/apktool.jar d aaa.apk

2.aaa.apk->aaa.zip

解壓

3./apktool/dex2jar-2.0/d2j-dex2jar.sh classes.dex

4.JD-GUI 打開classes-dex2jar.jar

『肆』 Gradle編譯-APK編譯過程

在早期的Android設備中(Android5.0以下)都是使用的Dalvik虛擬機,Dalvik支持經過轉換的.dex文件。.dex格式是專為Dalvik設計的一種適合內存和處理器速度有限的系統。

但是在Android5.0,google用ART全面取代的Dalvik。Android7.0中又添加了JIT編譯器,使得Android性能也有不少提升。

上圖為從Android源文件開始,最終到APK的過程。
下面博客文章詳細介紹了dalvik虛擬機,可供參考學習。
https://www.cnblogs.com/lao-liang/p/5111399.html

dvm(art)和jvm屬於不同的虛擬機平台,不同平台要求執行的文件類型也就不一樣
dvm(art)--.dex文件
jvm--.class文件

在編譯和生成上
java source --.class文件 ---jvm執行
java source --.class文件 ---.dex文件 --- dvm執行

Android Runtime (ART) 是 Android 上的應用和部分系統服務使用的託管式運行時。ART 及其前身 Dalvik 最初是專為 Android 項目打造的。作為運行時的 ART 可執行 Dalvik 可執行文件並遵循 Dex 位元組碼規范。

ART 和 Dalvik 是運行 Dex 位元組碼的兼容運行時,因此針對 Dalvik 開發的應用也能在 ART 環境中運作。不過,Dalvik 採用的一些技術並不適用於 ART。

ART的功能
1.預先 (AOT) 編譯
使用ART編譯器時,應用程序在安裝期間就已經把dex位元組碼翻譯並存儲在設備上,運行時,只需要執行這些翻譯好的就可以了,因此執行速度也快了不少。
2.垃圾回收方面的優化

3.開發和調試方面的優化

構建流程涉及許多將項目轉換成 Android 應用軟體包 (APK) 的工具和流程。構建流程非常靈活,因此了解它的一些底層工作原理會很有幫助。

『伍』 Android Studio 編譯apk,so庫一起打包

如下圖所示,在編譯洞耐慶apk的時候,我需要把libs/armeabi-v7a下的納握so庫一起打包到apk裡面。

需要在build.gradle中添加如下內容:
ndk {
abiFilters "armeabi-v7a"
}

sourceSets.main.jniLibs.srcDirs = ['libs']

===============================================================
深圳上班,
生活簡簡單單,
14年開始從事Android Camera相關軟體開發工作,
做過車載、手機、執法記錄儀......
公畝仔眾號記錄生活和工作的點滴,
關注「小馳筆記」,期待和你相遇~

『陸』 Android 將 apk 反編譯為源碼

將 apk 解壓,在解壓後的文件夾中可以找到 classes.dex 文件。(除了 classes.dex 文件,可能還會有 classes2.dex , classes3.dex 等等,本文以 classes.dex 為例,對其他幾個 dex 文件的操作是類似的)

使用 dex2jar 工具,將 dex 文件轉換為 jar 文件

使用方式:

執行命令後,生成的 classes-dex2jar.jar 就是我們需要的 jar 文件。

使用 Luyten 工具查看 jar 文件,就能看到反編譯後的源碼了。

本例中, classes.dex 文件中存儲的是 android 的一些基礎庫,實際編寫的源碼在 classes3.dex 中,對 classes3.dex 執行第二步,查看生成的 classes3-dex2jar.jar 文件,可以看到如下內容:

這就是反編譯 apk 的基本操作了。

Cmder 是一個非常好用的命令行工具。

效果如下:

只需要執行 apk2jar 命令,就可以實現把 apk 解壓到 apk_ 文件夾中,並將 apk_ 文件夾中的 classes.dex 文件轉換為 jar 。原理就是通過 Cmder 添加別名,把上述的第一步和第二步中執行的命令行組合起來了。

為 Cmder 添加別名很簡單,編輯 Cmder安裝目錄\config\user_aliases.cmd 文件,將別名添加到裡面即可。本例添加的別名如下:

其中:

『柒』 android 工程 如何一鍵編譯打包成apk

打包步驟:

1、生成keystore

按照下面的命令行在C:ProgramFilesJavajdk1.6.0_10in>目錄下,輸入keytool-genkey-aliasandroid.keystore-keyalgRSA-validity100000-keystoreandroid.keystore

參數意義:-validity主要是證書的有效期,寫100000天;空格,退格鍵都算密碼。

命令執行後會在C:ProgramFilesJavajdk1.6.0_10in>目錄下生成android.keystore文件。如圖-1

圖-2EclipseAndroid打包工具

接下來的步驟就是不斷的next。下面僅貼出圖片,不解釋。

step2:選擇打包的項目

step3:選擇生成的EclipseAndroid.keystore文件並輸入密碼

step4:選擇aliaskey並輸入密碼

step5:最後選擇生成androidapk文件的目錄及文件名

最終生成的apk文件。

『捌』 如何在eclipse中把Android工程編譯為apk安裝文件

1、生成keystore

按照下面的命令行在C:ProgramFilesJavajdk1.6.0_10in>目錄下,輸入

keytool -genkey -alias android.keystore -keyalg RSA -validity100000

-keystore android.keystore

參數意義:-validity主要是證書的有效期,寫100000天;空格,退格鍵都算密碼。

命令執行後會在C:ProgramFilesJavajdk1.6.0_10in>目錄下生成android.keystore文件 。如圖-1

"Destination APK file "指定APK存儲的位置。單擊"Finish"按鈕,打包完成。

進入"D:My Document",會看到生成的HelloWorld.apk以及sharpandroid證書庫。


『玖』 Android 如何對apk文件進行反編譯以及重新

第一:使用apktool直接反編譯apk

第六:把生成的hellodemo.apk安裝到手機,可以看到主界面上已經顯示的是hello,而不再是你好。說明反編譯重新打包成功!

『拾』 Android APK編譯流程

apk 是Android Package的簡寫, 在平時的開發過程中,通過點擊 Run app 按鈕 或者 在命令行中輸入

這樣Android Studio就會啟動構建流程,最終輸出一個我們想要的APK。

直達官網介紹

對於小白來說,上面一張圖已經可以解釋apk的構建過程了,不過對於Andoid開發者而言還需要了解一些更詳細的構建過程。

詳細的對應步驟 和 使用工具如下:

資源文件(res文件夾下的文件)通過 AAPT(Android Asset Packaging Tool)打包生成R.java類(資源索引表)、.arsc資源文件 和res文件。

resources.arsc 是一個App的資源索引表,通過R.java 文件 和 resources.arsc 可以定位到資源的內存地址,resources.arsc文件的作用是通過一樣的ID,根據不同的配置索引到最佳的資源顯示在UI中。

AIDL (Android Interface Definition Language), 是Android介面定義語言,是Android提供的IPC (Inter Process Communication,進程間通信)的一種獨特實現。
如果有aidl文件,這個階段會生成對應的Java介面文件。

R.java文件、工程源碼文件、aidl.java文件, 在這一步通過javac生成.class文件。

源碼.class文件和第三方jar或者library通過dx工具打包成dex文件

Android系統的Dalvik虛擬機的可執行文件為DEX格式,所以這里會將上一步中生成的.class文件 和 引用的第三方jar等過程中的.class 一起通過dx工具打包成dex文件

apkbuilder工具會將所有沒有編譯的資源、.arsc資源、.dex文件打包到一個完成apk文件中

tips:

apksigner工具會對未簽名的apk驗證簽名。得到一個簽名後的apk(signed.apk)

apksigner 是google 退出的V2簽名方式
Jarsigner 是之前一直使用的V1簽名方式

可以通過在命令行中輸入apksigner --help來獲取詳情信息,如果沒有特殊需求,使用下面命令即可完成簽名

release mode 下使用 aipalign進行align,即對簽名後的apk進行對齊處理

所謂對齊,主要過程是將APK包中所有的資源文件距離文件起始偏移為4位元組整數倍,這樣通過內存映射訪問apk文件時的速度會更快。對齊的作用主要是為了減少運行時內存的使用。

zipalign是一個android平台上整理APK文件的工具,它對apk中未壓縮的數據進行4位元組對齊,對齊後就可以使用mmap函數讀取文件,可以像讀取內存一樣對普通文件進行操作。如果沒有4位元組對齊,就必須顯式的讀取,這樣比較緩慢並且會耗費額外的內存。

參考文章:
Android-Studio配置構建
淺談Android打包流程
apk打包流程

END!

熱點內容
thinkphp緩存關閉 發布:2024-04-26 18:19:32 瀏覽:96
linux信號捕捉 發布:2024-04-26 18:19:27 瀏覽:934
編譯有哪兩種模式 發布:2024-04-26 17:53:30 瀏覽:871
伺服器電腦上能用嗎 發布:2024-04-26 17:44:42 瀏覽:560
組件式編程 發布:2024-04-26 17:19:57 瀏覽:943
電子兒童存錢罐如何改密碼 發布:2024-04-26 17:19:13 瀏覽:601
什麼安卓手機直播投屏好 發布:2024-04-26 17:18:31 瀏覽:627
linuxhba查看 發布:2024-04-26 16:57:28 瀏覽:903
啟動mongodb服務linux 發布:2024-04-26 16:38:37 瀏覽:553
525標軸選裝哪些配置 發布:2024-04-26 16:34:24 瀏覽:849