APK瘦身,混淆

来源:互联网 发布:韩国网络电视直播 编辑:程序博客网 时间:2024/05/18 03:27

网址1

作者:张明云
链接:http://www.jianshu.com/p/bd90dee57ad0


APK为什么要瘦身?

APK在安装和更新之前都需要经过网络将其下载到手机,如果APK越大消耗的流量就会越多,特别是对于使用移动网络的用户来讲,消耗流量越多就代表需要花更多的钱去购买流量。同时一些第三方应用商城也会对上传的APK大小有限制,所以为了能够让产品能够更受商城和用户欢迎,APK瘦身是第一步,更小的APK标示着更多地用户愿意去下载和体验。

APK解压后的文件结构:
classes.dex,resources.arsc,AndroidManifest.xml,proguard.cfg,project.properties,assets,等等网址里有详细介绍.


真*瘦身

1.首先可以随便找一个APK,修改后缀成.zip
可以看到



主要是这么5个

META-INF目录下存放的是签名信息,用来保证apk包的完整性和系统的安全

res:apk图片资源

AndroidManifest.xml:清单文件

resources.arsc:编译后的布局文件

classes.dex:是java源码编译后生成的java字节码文件


参考资料:https://yq.aliyun.com/articles/57284?utm_source=qq

瘦身方案:修改都在Module的builder.gradle文件里进行

1.开启minifyEnabled,具体看混淆的proguard-rules.pro文件配置

2.开启shrinkResources(去除无用资源)

    buildTypes {

        release {

            minifyEnabled true

            shrinkResources true

            proguardFiles getDefaultProguardFile('proguard-android.txt'),        'proguard-rules.pro'

        }

提示:记着去除工程中临时展示的图片,也可以减小APK的体积


3.删除无用的语言资源

    defaultConfig {

.....

resConfigs "zh"

}

4.使用tiypng有损压缩(官方网站:https://tinypng.com/或者腾讯的智图:https://zhitu.isux.us/)

>* TinyPNG使用一种智能有损压缩技术(通过降低图片中的颜色数量,来减少存储图片所需的数据)来降低PNG图片的大小

这样的压缩对图片的效果影响是很小的,但是可以大大降低图片的大小,并且还能保持PNJ的alpha透明度

使用步骤:把压缩完的图片去替换项目中的图片,就可以有效的减少APP的体积

>*因为TinyPNG将PNG图片压缩成8位的PNG(而不是24位),所以它的压缩比例非常高,至少都是50%以上的压缩比例,有些甚至可以达到70%,并且压缩之后的图片和原图人眼看不出来


5.把图片PNG转换为JPG(软件:格式工厂)

原因:PNG包含了图片一些和显示效果无关的信息,转换为JPG,体积也会变小,且转换之后的图片和原图人眼看不出来

如果图片中没有透明度的要求,可以将png图片转换为jpg图片.但如果png进行过有损压缩可能会让转换后的图片文件变大.


6.webp

可以减小几K,不像上面的方法,消除的体积大,所以不常用


7.使用shape(android新特性里的属性:Vector)文件替换简单图片


8.删除或者替换兼容包(V4,V7,V13)中无用的一些图片

删除drawable-ldret:是layout-direction-right-to-left的缩写,意味着布局方式从右到左,主要是为了适配阿拉伯语.这是API17,android4.2新功能

drawable-ldrtl-xxxhdpi-v4

drawable-ldrtl-xxhdpi-v4

drawable-ldrtl-xhdpi-v4

drawable-ldrtl-hdpi-v4

drawable-ldrtl-mdpi-v4

替换v4,v7,v13中无用图片资源_可选方式

可以使用1*1像素图片,替换V4,V7,V13中的一些图片资源


混淆


apk加固实际就是混淆.

作用:

1.使别人不能轻易的反编译代码.

2.被别人植入代码(恶意的脚本,广告),进行二次打包

3.动态修改内存/动态的注入->支付(修改支付账户)


梆梆,爱加密,360加固保,阿里聚安全,以爱加密为例子:

http://www.ijiami.cn/



项目中proguard-rules.pro文件作用:

1.混淆        2.删除无用的类或无用的方法        3.代码压缩

使用注意:不能对第三方进行包混淆,会给你弹出一堆警告

参考资料:http://blog.csdn.net/ljd2038/article/details/51308768#reply

https://github.com/krschultz/android-proguard-snippets/tree/master/libraries

http://www.jianshu.com/p/f3455ecaa56e?utm_campaign=haruki&utm_content=note&utm_medium=reader_share&utm_source=qq


proguardFiles这部分有两段,前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明,免去了我们很多事,这个文件的目录在 <sdk目录>/tools/proguard/proguard-android.txt , 后一部分是我们项目里的自定义的混淆文件,目录就在 app/proguard-rules.txt , 如果你用Studio 1.0创建的新项目默认生成的文件名是 proguard-rules.pro , 这个名字没关系,在这个文件里你可以声明一些第三方依赖的一些混淆规则,最终混淆的结果是这两部分文件共同作用的。

 

proguard-rules.pro文件,直接在他的下面进行个性化混淆.


//原理

http://blog.csdn.net/fulinwsuafcie/article/details/10947341

//这个写的好

http://www.jianshu.com/p/7436a1a32891

由于java和.net这类高层抽象语言,具有 天生的易反汇编 特性,其编译后的程序包包含了大量的源代码变量、函数名、数据结构等信息
根据其编译后的程序包,可以非常容易的得到 近乎源代码质量 的反汇编代码。如果不加混淆,相当于直接将源代码拱手送人,内容严密的app权限审核可以说是形同虚设。如果大家想避免源代码泄漏后重新修改策划而额外增加的工作量,建议都加上混淆。


android平台的混淆原理是用“ 不能直接猜出含义 的通用变量名和函数名a b c等”替换编译后程序包中“ 具有明显语义信息 的变量名和函数名”
这样,通过逆向工程得到的只是 难以理解 的代码。
从混淆的原理可以得出以下两点信息:
1.重命名变量名可能会导致程序异常。因为程序是需要跟平台交互的,平台只会以固定类名来调用我们的app,这就涉及到需要屏蔽不能重命名的函数及类 proguard.cfg文件就是起这个作用的,混淆后哪个地方出错,就将相关的类和函数加入到混淆屏蔽列表里面去
2.由于混淆只改变字符串,并不能改变程序逻辑,耐心的hacker还是能够理解程序的设计思路并尝试修改。但这类人群不会太多,加上有我们自定义框架的牵制,逆向工程也绝非轻而易举。


这个世界上没有不能破解的软件,只有 不值得破解 的软件,只有 逆向的成本超过了收益 ,我们的软件资产才是安全的,混淆则可以显著增加逆向成本。


在package编译时使用proguard混淆,即使用晦涩的名字重命名类名、字段名、函数名,以精简、优化和混淆代码。使用proguard处理的好处是apk文件会有一点点变小,同时更加难于被反编译。类似说明网上有很多,大家可以自己搜索了解一下。











原创粉丝点击