`
52bugly
  • 浏览: 725 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

微信Android资源混淆打包工具,如何让应用安装包立减1M

阅读更多

 

腾讯Bugly特约作者:shwen 微信客户端 高级工程师

微信中的资源混淆工具主要为了混淆资源ID长度(例如将res/drawable/welcome.png混淆为r/s/a.png),同时利用7z深度压缩,大大减少了安装包体积,同时也增加了逼格,提升了反破解难度。本文主要是对此做一个简单分析。

写在前言

资源混淆工具大约是在2014年4月实现,并在微信5.4中使用,减少了大约1M的空间。然后在8月在公司内部开源,现以推广到QQ邮箱、QQ空间、手机管家等多个产品中使用。

具体源码与使用方法详细在github中:

https://github.com/shwenzhang/AndResGuard

方案演进

资源混淆简单来说希望实现将res/drawable/icon,png变成res/drawable/a.png,或我们甚至可以将文件路径也同时混淆,改成r/s/a.png。

Proguard  -> Resource Proguard
R.string.name     -> R.string.a   
res/drawable/icon -> res/drawable/a
                         r/s/a

我们可以想到以下几种方案:

  1. 最简单的方法,我们按照Proguard的做法,直接在源码级别修改,将代码以及xml的R.string.name中替换到R.string.a,icon.png重命名为a.png 然后再交给Android编译。

  2. 根据Android的编译流程,所有资源ID已经被编译成32位int值。这说明我们并不需要去修改xml与java,因为在编译过程已经被R.java所替换,我们直接修改resources.arsc的二进制数据,不改变打包流程,只要在生成resources.arsc之后修改它,同时重命名资源文件。

  3. 但是方案二看起来不错,但是它依然依赖了编译流程,不利于使用。其实我们可以做到直接处理安装包. 不依赖源码,不依赖编译过程,仅仅输入一个安装包,得到一个混淆包。

几种方案的对比如下:



毫无疑问,微信采用的是方案三。现在关键问题是我们如何直接修改resources.arsc文件来达到资源混淆的效果?

技术实现

在回答上面的问题之前,我们首先需要对resources.arsc的文件格式有一定的了解。resources.arsc一共有五种chunk类型,分别为TYPETABLE,TYPEPACKAGE,TYPE_STRING ,TYPETYPE,TYPECONFIG。



 

—table,是整个reousces table的开始,它的chunksize即是整个文件的大小。

—package,指的是一个package的开始,其实在resources,arsc是可以有多个package的。而packageID即是资源resID的最高八位,一般来说系统android的是1(0x01),普通的例如com.tencent.mm会是127(0x7f),剩下的是从2开始起步。当然这个我们在aapt也是可以指定的(1-127即八位的合法空间,一些混合编译就是改这个packageID)。

—string, 代表stringblock,我们一共有三种类型的stringblock。分别是table stringblock,typename stringblock, specsname stringblock。

—type,这里讲的是typename stringblock里面我们用到的各种type(用到多少种类型的type,就有多少个type chunk),例如attr, drawable, layout, id, color, anim等,Type ID是紧跟着Package ID。

—config, 即是Android用来描述资源维度,例如横竖屏,屏幕密度,语言等。对于每一种type,它定义了多少种config,它后面就紧跟着多少个config chunk,例如我们定义了drawable-mdpi,drawable-hdpi,那后面就会有两个config。

—entry,尽管没有entry这个chunk,但是每个config里面都会有很多的entry,例如drawable-mdpi中有icon1.png,icon2.png两个drawable,那在mdpi这个config中就存在两个entry。



 

简单来说方案为:



 

与7z极限压缩结合

根据上文安装包知识的文章,7z有着更好的压缩率,同时我们也可以强制压缩类似resources.arsc、png、jpg等Android默认不会打包压缩的文件。
最后把修改后的resources.arsc重打包即可,微信从解压,到混淆,到重打包耗费时间,不要799,也不要699,仅需35秒。具体效果如下图:



 

最后,整体的处理流程如下:



 

一些需要注意的问题

  1. compress参数对混淆效果的影响
    若指定compess 参数.png、.gif以及*.jpg,resources.arsc会大大减少安装包体积。若要支持2.2,resources.arsc需保证压缩前小于1M。

  2. 操作系统对7z的影响
    实验证明,linux与mac的7z效果更好

  3. keepmapping方式对增量包大小的影响
    影响并不大,但使用keepmapping方式有利于保持所有版本混淆的一致性

  4. 渠道包的问题(建议通过修改zip摘要的方式生产渠道包)
    在出渠道包的时候,解压重压缩会破坏7zip的效果,通过repackage命令可用7zip重压缩。

  5. 若想通过getIdentifier方式获得资源,需要放置白名单中。
    部分手机桌面快捷图标的实现有问题,务必将程序桌面icon加入白名单

TODO,除了资源混淆,其实我们还可以实现资源加密等其他功能。

Bugly是腾讯内部产品质量监控平台的外发版本,其主要功能是App发布以后,对用户侧发生的crash以及卡顿现象进行监控并上报,让开发同学可以第一时间了解到app的质量情况,及时机型修改。目前腾讯内部所有的产品,均在使用其进行线上产品的崩溃监控。

  • 大小: 18.5 KB
  • 大小: 47.3 KB
  • 大小: 27.5 KB
  • 大小: 30.3 KB
  • 大小: 14.6 KB
  • 大小: 22.3 KB
分享到:
评论

相关推荐

    微信签名工具Android 安装包(Gen-Signature-android.apk)

    微信签名工具,即`Gen-Signature-android.apk`,是一个专为开发者设计的工具,用于生成和管理Android应用的签名文件。这个工具可以帮助开发者对他们的APK进行签名,以确保其能够在用户的设备上正常安装和运行。由于...

    android 实现仿微信通讯录

    android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android 实现仿微信通讯录android ...

    中标麒麟系统微信安装包.zip

    【标题】"中标麒麟系统微信安装包.zip"指的是专为基于MIPS64架构的中标麒麟操作系统设计的微信客户端安装程序。中标麒麟操作系统是国产操作系统的重要代表,它以Linux为基础,广泛应用于政府、企业以及教育等领域,...

    Android-一个微信android工具

    【Android开发:构建微信Android工具】 在Android开发领域,微信Android工具是一个专为开发者设计的实用工具集,它可以帮助开发者更高效地进行微信相关的功能开发和调试。这个工具包,名为"android-wechat-tool-...

    微信安装包

    微信安装包

    Delphi调用微信AndroidSDK(微信支付)

    在本文中,我们将深入探讨如何使用Delphi编程环境来调用微信的Android SDK,特别是实现微信支付功能。2018年3月18日的这篇文档和代码将为我们提供宝贵的指导,帮助开发者在这个过程中遇到的问题。 首先,让我们理解...

    仿微信 Android Studio

    【标题】"仿微信 Android Studio" 是一个专为Android开发者设计的项目,旨在帮助他们学习如何构建类似微信的用户界面。这个项目不仅关注外观的模仿,更注重代码的组织结构和可读性,使得初学者能够理解并学习到...

    Ubuntu18微信安装包

    这是一个专门为Ubuntu 18.04 LTS(Long Term Support)版本设计的微信安装包,它可能包含了在Linux环境下运行微信所需的依赖项和应用程序本身。通常,这种跨平台的应用程序会在一个可执行的.deb文件中打包,这是...

    微信小程序安装包

    微信小程序安装包 微信小程序安装包微信小程序安装包 微信小程序安装包

    Android应用源码之高仿微信.zip

    1. **源代码文件**:包括Android应用的主工程文件夹,里面会有`java`和`res`目录,分别存放源代码和资源文件。 2. **布局文件** (`res/layout`): 这里会有XML文件,定义了各种屏幕元素和界面布局,如聊天界面、个人...

    Ubuntu安装企业微信(含Deb安装包)

    在Ubuntu操作系统中安装企业微信是许多用户特别是企业员工的需求,因为企业微信提供了高效沟通和协作的平台。本文将详细介绍如何在Ubuntu上安装企业微信的DEB安装包。 首先,我们需要了解DEB安装包是什么。DEB是...

    微信获取APP签名工具

    老版本微信平台注册APP签名工具

    ubuntu微信安装包,deb格式,直接安装使用。

    在这里,我们有两个文件:`ukylin-wechat_3.0.0_amd64.deb` 和 `ukylin-wine_70.6.3.25_amd64.deb`,它们是专门为Ubuntu系统设计的微信和Wine的DEB安装包。 1. **DEB格式**: `.deb` 是Debian和Ubuntu等基于Debian的...

    android微信支付带java后台工具类

    这个"android微信支付带java后台工具类"提供了一种解决方案,帮助开发者在Android客户端和Java后端之间建立有效的通信机制,以实现微信支付流程。 1. **微信支付流程概述** 微信支付涉及的主要步骤包括:用户选择...

    android仿微信源码

    在Android平台上,仿微信源码是一项复杂而细致的工作,它涉及到许多Android开发的关键技术,包括UI设计、网络通信、数据存储、多线程处理、消息推送等。以下将详细阐述这些知识点。 首先,UI设计是整个应用的外观...

    基于Android Studio开发的安卓的高仿微信

    在本文中,我们将深入探讨如何基于Android Studio开发一个高仿微信的应用程序。Android Studio是Google提供的官方集成开发环境(IDE),特别适用于Android应用的开发。它提供了丰富的工具集,包括代码编辑器、调试器...

    Android安卓仿微信最新版源码 微信APP源码.zip

    这篇详尽的文章将深入探讨基于Android的仿微信应用的源码结构、主要功能模块和关键技术。首先,我们从标题和描述中可以了解到,这是一份针对Android平台开发的微信应用程序的源代码,它旨在模仿微信的最新功能和用户...

    微信ANDROID客户端架构演进及其对开发流程的影响.pdf

    ### 微信ANDROID客户端架构演进及其对开发流程的影响 #### 概述 随着移动互联网技术的迅猛发展,微信作为一款国民级应用,其ANDROID客户端的架构经历了多次重大的变革与优化。这些变革不仅反映了软件工程实践中...

    Linux版微信开发者工具安装包

    Linux版微信开发者工具是针对微信小程序开发的一款专业软件,它为开发者提供了在Linux操作系统上进行微信小程序设计、调试和发布的能力。本安装包是针对Linux用户的一个特别版本,特别是Ubuntu系统的用户,因为开源...

    微信公众号文章批量下载工具

    微信公众号文章批量下载工具

Global site tag (gtag.js) - Google Analytics