在精簡apk之前,首先要了解一下它的結構。
1.結構分析
APK包結構如下:
lib/
so庫存放位置。
so庫文件分為不同的CPU架構,像armeabi,armeabi-v7a, arm64-v8a,x86,x86_64,和mips。大多數情況下我們可以只用一種armeabi-v7a,后面會講到原因。
res/
資源文件夾,包含著圖片、布局、菜單等文件,resources.arsc 中索引的文件均存放在該目錄中(進行過資源混淆的除外)。
assets/
副資源文件夾。
META-INF/
包含CERT.SF和 CERT.RSA簽名文件以及MANIFEST.MF 清單文件。
resources.arsc
資源配置文件,包含著字符串、主題、圖片文件索引、布局文件索引等信息
classes.dex
包含以Dalvik / ART虛擬機可理解的DEX文件格式編譯的類。
AndroidManifest.xml
應用清單文件,版本號、版本名稱、權限、應用名稱、應用圖標、活動、服務、廣播等配置信息,均在這個文件中。該文件使用Android的二進制XML格式。
在這些文件中,除了META-INF/其它都是本文的精簡對象
下面正式開始
1. 對lib目錄下的文件進行瘦身處理
如果我直接告訴你只留下 armeabiv-v7a 文件夾就行是很不負責任的
如果你感興趣,可以往下看
參考一下
armeabiv-v7a: 第7代及以上的 ARM 處理器。2011年15月以后的生產的大部分Android設備都使用它。
arm64-v8a: 第8代、64位ARM處理器,很少設備,三星 Galaxy S6是其中之一。
armeabi: 第5代、第6代的ARM處理器,早期的手機用的比較多。
x86: 平板、模擬器用得比較多。
x86_64: 64位的平板。
armeabi-v7主要不支持ARMv5(1998年誕生)和ARMv6(2001年誕生).目前這兩款處理器的手機設備占比太少。
而許多基于 x86 的設備也可運行 armeabi-v7a 和 armeabi NDK 二進制文件。對于這些設備,主要 ABI 將是 x86,輔助 ABI 是 armeabi-v7a。
最后總結一點:如果適配版本高于4.1版本,可以只留下armeabiv-v7a,當然,如果armeabi-v7a不是設備主要ABI,那么會在性能上造成一定的影響。
so,,,,只留 armeabiv-v7a,,沒錯的undefined
(至于能省下多大空間,因應用而定)
另,,,如果有termux
[color=rgb(51, 102, 153) !important]復制代碼
可以查看你手機的cpu框架類型
當然還有進階玩法--精簡so文件,,只保留有用的核心代碼,,但是,我不會undefined
2. 精簡res/asstes
①刪除asstes里的廣告插件
主要有bdx開頭的壓縮包(百度)
和
gdt_開頭的文件夾(騰訊)
②使用圖片壓縮工具對圖片進行壓縮。
(注:在壓縮前要先看一下,不能預覽的不要動)
例:
使用tinypng有損壓縮
TinyPNG工具只支持上傳PNG圖片到官網上壓縮,然后下載保存,在保持alpha通道的情況下對PNG的壓縮可以達到1/3之內,而且用肉眼基本上分辨不出壓縮的損失.
Tinypng的官方網站:http://tinypng.com/
注意:圖片在打包時已經進行過無損壓縮了,,故進行無損壓縮是沒有任何效果的。
③使用音頻壓縮工具對音頻進行壓縮。
(注:在壓縮前要先看一下,不能播放的不要動)
④還可以刪除abc_開頭的圖片文件,,
(這種一般都是自動生成的,開發者也不會調用)
[color=rgb(51, 102, 153) !important]復制代碼
正則搜索刪除。
另:如果有能力,可以嘗試把非透明 png 格式大圖片轉換為 jpg 格式,效果顯著!
等等。。
3. 減小classes.dex大小
脫殼的就刪無用類,,比如某數字刪stub和jg
(mt新版可以一鍵去除調試信息,下面留作紀念)
(感謝@快樂小牛的提醒~來自545樓)
,,,,,,,,,,,,,,,,,,,,,
刪掉dex里的.line x和.prologue也是個不錯的方法,聽說proguard工具可以一鍵,,但我不會
留下我的方法
①全dex代碼搜
[color=rgb(51, 102, 153) !important]復制代碼,全部替換即可(替換什么都不要填,強迫癥可以填個空格)
②然后就是.line ,這個比較麻煩,因為有一到幾千,,所以用正則匹配
[color=rgb(51, 102, 153) !important]復制代碼
全dex搜索代碼,,記得勾正則
雖然意義不大,但也有一定的效果,,而且可以增加dex對比的難度
4月1日補充:有人反應不能保存 (報錯) 的問題,猜測是工作量太大導致mt編譯出錯,,關閉彈窗,然后再保存一遍就好啦。(詳見43頁)
如果還是不能解決,就別搞了。。編譯的太多,手機帶不動。。。 強迫癥可以一個dex一個dex刪
,,,,,,,,,,,,,,,,,,,
高級一點的就是剝離廣告sdk,由于我不會,就不多說了。undefined
還有就是用工具,比如proguard,,自行百度
4. 精簡 resources.arsc
我有點懶,不多說了,
官方文檔有詳細教程
路徑:逆向功能 - 簡單實戰 - 漢化應用 - 精簡語言包
另附(特別感謝@小狗巧巧):
[答疑解惑]為什么arsc越精簡越大?
5.精簡AndroidManifest.xml
這個我真的不會說,刪掉無用activity 廣播 service啥的就可。
用activity 舉個例子。
- <activity開頭............xxxx........../>或者</activity>結尾
[color=rgb(51, 102, 153) !important]復制代碼
這個是通用的,,建議去設置里開啟 顯示空白符,一般都是刪八個點開頭,八個點結束的一段。
常見的廣告關鍵詞有
-
- qq.e(騰訊)
- ads.(通用)
- .ad.(大部分是應用內置)
- .mobad.(百度)
- .mobads.(百度)
- .bytedance.(穿山甲,今日頭條旗下)
- .ss.(穿山甲,和上一個在一塊)
- (如果軟件有其它功能和今日頭條合作)
- (刪 錯 會導致閃退)
- (建議備份后再刪除測試)
-
- .bytedance.sdk.openadsdk.
- (已確定是穿山甲廣告)
-
- sdk(帶有huawei,xiaomi,meizu,vivo , push等 字樣的刪)
-
- 還有 taobao, liulishuo, weibo 這些等等,自行判斷
-
-
- push.(通知推送)
-
[color=rgb(51, 102, 153) !important]復制代碼
注:push請根據實際情況刪除,,一般破解軟件通知推送什么的根本不需要。
(4月26號補充:對不起諸位,我沒有說清楚,,把自己的習慣帶了進去,其實SDK有講究的
,比如weibo的sdk刪了會導致無法用微博登陸和分享,刪淘寶可能會導致無法調用淘寶,
刪帶有手機型號的可能會導致無法使用手機運營商相關的服務,比如無法使用通知推送,無法調用應用商店更新,等等
再比如刪alipay可能導致無法調用支付寶支付,,這些請自行判斷)
(因為我平時是不在乎的,通知推送什么的,沒有才好。微博本人也不用。。所以沒有注明,抱歉,現在補上)
再次聲明
本文大部分節選自CSDN的這篇
https://blog.csdn.net/AndroidAlvin/article/details/103159561
及mt官方文檔
還有其它各種文檔參考及個人經驗,,
。。。THE END。。。
@MiBStudio 來看看啊undefined
(現在叫小狗巧巧undefined)
補幾張圖,順序亂了,湊合看吧undefined
補充:關于為什么不能預覽/播放的文件不要壓縮,
舉個例子,吃雞游戲的安裝包里有一個圖片文件,1g多的地圖,當然不能壓縮。
人臉識別的配置文件就是mp3格式,也不可壓縮
總結:只能壓縮可以查看的文件
|