前言
一个apk从开始到发布一般过程:
- 搭建框架(选择使用的框架,分配包名)
- 开始编码(编写布局,逻辑,自测)
- 编码完成,混淆签名打包(混淆保证apk的代码安全,签名打包可以保证开发的应用在应用市场的唯一性)
- 测试优化(测试crash和优化性能)
- 上线发布
从蜻蜓fm没有加混淆,导致宙斯和普罗米修斯的代码泄露,就可以看出一个应用混淆的重要性。因此我们为了保证自己的开发成果不会被别人窃取,添加混淆必须的。 所以下面记录一些常用的混淆。
使用混淆
混淆一般是在项目工程的project.properties中来配置混淆文件的路径,默认的路径是
${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt,${sdk.dir}代表的是sdk所在路径。但是默认混淆是被注销的,如果需要启用默认的混淆就需要把#号去掉。
# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
//也就是这里如果需要启用默认的混淆文件就需要去掉行首的#号
#proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt
# Project target.
target=android-20
自定义混淆文件
一般我们在开发中,可能会添加或引用到第三方的开发包或库,所以有些文件是不需要混淆的,这时候可能就需要自定义混淆文件,添加我们自己开发中不需要混淆的部分。一般的做法是使用项目目录中的proguard-project.txt文件
1、修改项目工程的project.properties中混淆文件配置
proguard.config = proguard-project.txt
2、在proguard-project.txt中编写混淆
常用混淆指令
如果需要自己定义混淆文件,那么常用的一些混淆指令就需要有所了解。
- 基本配置
# 是否使用大小写混合
-dontusemixedcaseclassnames
#如果应用程序引入的有jar包,并且混淆jar包里面的类dont skip nonpublic library classes
-dontskipnonpubliclibraryclasses class
#混淆时不做预校验 dont preverify
-dontpreverify
#混淆采用的算法.
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
# 屏蔽警告 ignore warnings
-ignorewarnings
#设置混淆的压缩比率 0 ~ 7 optimization passes
-optimizationpasses 5
#混淆后生产映射文件 map 类名->转化后类名的映射
-verbose
- 可选配置
#应用的依赖包,如android-support-v4
-libraryjars class_path
#不混淆某些类
-keep [,modifier,...]
#不混淆类的成员
-keepclassmembers [,modifier,...]
#不混淆类及其成员
-keepclasseswithmembers [,modifier,...]
#不混淆类及其成员名
-keepnames class_specification
#不混淆类的成员名
-keepclassmembernames class_specification
#不混淆类及其成员名
-keepclasseswithmembernames class_specification
#假设调用不产生任何影响,在proguard代码优化时会将该调用remove掉。如system.out.println#和Log.v等等
-assumenosideeffects class_specification
#不提示warnning
-dontwarn [class_filter]
混淆产生的文件#
一旦混淆生成,打包发布,可能会遇到一些混淆过的代码报出的异常,那么可能代码报错分析可能就需要用到下面的文件。
mapping.txt
表示混淆前后代码的对照表,这个文件非常重要。如果你的代码混淆后会产生bug的话,log提示中是混淆后的代码,希望定位到源代码的话就可以根据mapping.txt反推。
每次发布都要保留它方便该版本出现问题时调出日志进行排查,它可以根据版本号或是发布时间命名来保存或是放进代码版本控制中。dump.txt
描述apk内所有class文件的内部结构。seeds.txt
列出了没有被混淆的类和成员。usage.txt
列出了源代码中被删除在apk中不存在的代码。