使用quicklz縮小程式體積

2022-03-22 20:23:18 字數 2124 閱讀 2174

目錄將二進位制檔案生成c陣列程式**

有乙個需求是這樣的,寫的乙個程式內建了乙個很大的檔案(實際就是抓取epsg.io的內容裡面的epsg.io.json),這個檔案篩選縮減後還有12mb,如果直接內建到程式中,編譯後的程式就很大了。

因為這個程式是乙個動態庫,而使用upx壓縮過的動態庫有時候會有一些異常問題出現,所以不考慮使用upx進行壓縮。

看到了quicklz後,感覺這是個好東西,於是就用這個來進行壓縮,把壓縮後的資料寫入程式中,使用前進行解壓即可。使用這個操作之後,程式大小從12mb縮小為不到1.5mb,效果很明顯。

關於quicklz的使用,在**上有比較詳細的說明,各個程式語言的介面也都有封裝好。

更多的可以參考

壓縮的**很簡單,因為我這裡只做字串的,所以壓縮率還比較高,可以達到12%左右。

壓縮的**如下:

// 壓縮字串src,返回qlz編碼格式的內容

std::string quicklz_compress(const std::string& src)

return dst;

}

下面是quiz.c裡面進行壓縮的**,可供參考

#include "quicklz.h"

#define max_buf_size 1024*1024

#define buf_buffer 400

#define bool int

#define true 1

#define false 0

int stream_compress(file *ifile, file *ofile)

free(state_compress);

free(compressed);

free(file_data);

return 0;

}

解壓的速度很快,對程式執行幾乎沒有影響,比讀取檔案快多了。

解壓**如下:

std::string quicklz_decompress(const std::string& qlzdata)

return dst;

}

下面是quiz.c裡面進行解壓的**,可供參考

int stream_decompress(file *ifile, file *ofile)

// do we need a bigger compressed buffer?

c = qlz_size_compressed(file_data);

if (c > d_size)

fread(file_data + 9, 1, c - 9, ifile);

d = qlz_decompress(file_data, decompressed, state_decompress);

fwrite(decompressed, d, 1, ofile);

}free(decompressed);

free(state_decompress);

free(file_data);

return 0;

}

上面的**用於壓縮和解壓qlz資料,但是這些資料還需要生成c風格的陣列,於是就寫了乙個小程式來做轉換,**如下:

#include #include #include int main(int c,char** v)

file* fin = fopen(v[1],"rb");

if(!fin)

file* fout = fopen(v[2],"wb");

if(fout)

fwrite(strbuffer,1,strlen(strbuffer),fout);

} if(strbuffer[0] != 'c')

strcpy(strbuffer,"\n};\n");

fwrite(strbuffer,1,strlen(strbuffer),fout);

fclose(fout);

} fclose(fin);

return 0;

}

縮小IPA包體積

這幾天被靜態庫的大小給嚇到了,新增了非常多的功能後導致包體達到了60m,這肯定是無法忍受的。網上搜尋了幾個比較好用的方法,這裡總結下,1 配置編譯選項 levels選項內 genetate debug symbols 設定為no,這個配置選項應該會讓你減去小半的體積。2 捨棄架構armv7,因為ar...

初識Doja(縮小你的程式)

在doja 環境裡,jar檔案和 scratchpad 檔案的的大小是有限制的,具體的限制如下表所示 版本jar 檔案大小 kbyte scratchpad 檔案大小 kbyte doja 1.0 3050 doja 2.0 30100 doja 2.1 30200 doja 2.2 30200 d...

減小Gcc編譯程式的體積

眾所周知,gcc編譯的原始程式一般很大,其實有幾種方法能大大減小目標 的體積,一般有以下幾種方法。1 禁用除錯資訊 release編譯時不要加上 g開關。2 使用 os編譯程式。不要使用 funroll loops等可以加速程式執行但是會大大增加目標 體積的開關。3 編譯後的程式使用strip去除符...