`

android 通过eclipse混淆代码 打包 + proguard 总结

 
阅读更多
android应用程序的混淆打包
1 . 在工程文件project.properties中加入下proguard.config=proguard.cfg , 如下所示:

target=android-8

proguard.config=proguard.cfg

Eclipse会通过此配置在工程目录生成proguard.cfg文件

 2 . 生成keystore (如已有可直接利用)

按照下面的命令行 在D:\Program Files\Java\jdk1.6.0_07\bin>目录下,输入keytool -genkey -alias android.keystore -keyalg RSA -validity 100000 -keystore android.keystore

参数意义:-validity主要是证书的有效期,写100000天;空格,退格键 都算密码。

命令执行后会在D:\Program Files\Java\jdk1.6.0_07\bin>目录下生成 android.keystore文件。

 3. 在Eclipce的操作

File -> Export -> Export Android Application -> Select project -> Using the existing keystore , and input password -> select the destination APK file 

 经过混淆后的源代码,原先的类名和方法名会被类似a,b,c。。。的字符所替换,混淆的原理其实也就是类名和方法名的映射。

 

proguard 自己考一个就行
----------------------------------------------------------------------------------------
 
proguard 原理
Java代码编译成二进制class 文件,这个class 文件也可以反编译成源代码 ,除了注释外,原来的code 基本都可以看到。为了防止重要code 被泄露,我们往往需要混淆(Obfuscation code , 也就是把方法,字段,包和类这些java 元素的名称改成无意义的名称,这样代码结构没有变化,还可以运行,但是想弄懂代码的架构却很难。 proguard 就是这样的混淆工具,它可以分析一组class 的结构,根据用户的配置,然后把这些class 文件的可以混淆java 元素名混淆掉。在分析class 的同时,他还有其他两个功能,删除无效代码(Shrinking 收缩),和代码进行优化 (Optimization Options)。
缺省情况下,proguard 会混淆所有代码,但是下面几种情况是不能改变java 元素的名称,否则就会这样就会导致程序出错。
一, 我们用到反射的地方。
二, 我们代码依赖于系统的接口,比如被系统代码调用的回调方法,这种情况最复杂。
三, 是我们的java 元素名称是在配置文件中配置好的。
所以使用proguard时,我们需要有个配置文件告诉proguard 那些java 元素是不能混淆的。
 
proguard 配置
最常用的配置选项
-dontwarn 缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。
-keep 指定的类和类成员被保留作为 入口 。
-keepclassmembers 指定的类成员被保留。
-keepclasseswithmembers 指定的类和类成员被保留,假如指定的类成员存在的话。
 
proguard 问题和风险
代码混淆后虽然有混淆优化的好处,但是它往往也会带来如下的几点问题
1,混淆错误,用到第三方库的时候,必须告诉 proguard 不要检查,否则proguard 会报错。
2,运行错误,当code 不能混淆的时候,我们必须要正确配置,否则程序会运行出错,这种情况问题最多。
3,调试苦难,出错了,错误堆栈是混淆后的代码 ,自己也看不懂。
 
 
为了防止混淆出问题,你需要熟悉你所有的code ,系统的架构 ,以及系统和你code的集成的接口,并细心分析。 同时你必须需要一轮全面的测试。 所以混淆也还是有一定风险的。 为了避免风险,你可以只是混淆部分关键的代码,但是这样你的混淆的效果也会有所降低。
 
常见的不能混淆的androidCode
Android 程序 ,下面这样代码混淆的时候要注意保留。
Android系统组件,系统组件有固定的方法被系统调用。
被Android Resource 文件引用到的。名字已经固定,也不能混淆,比如自定义的View 。
Android Parcelable ,需要使用android 序列化的。
其他Anroid 官方建议 不混淆的,如
android.app.backup.BackupAgentHelper
android.preference.Preference
com.android.vending.licensing.ILicensingService
Java序列化方法,系统序列化需要固定的方法。
枚举 ,系统需要处理枚举的固定方法。
本地方法,不能修改本地方法名
annotations 注释
数据库驱动
有些resource 文件
用到反射的地方
 
 
如何实施
现在的系统已经配置为混淆时候会保留
Android系统组件
自定义View
Android Parcelable
Android R 文件
Android Parcelable
枚举
各个开发人员必须检查自己的code 是否用到反射 ,和其他不能混淆的地方。告诉我来修改配置文件(已经保留的就不需要了)
 
 
目前系统部检查的第三方库为
-dontwarn android.support.**
-dontwarn com.tencent.**
-dontwarn org.dom4j.**
-dontwarn org.slf4j.**
-dontwarn org.http.mutipart.**
-dontwarn org.apache.**
-dontwarn org.apache.log4j.**
-dontwarn org.apache.commons.logging.**
-dontwarn org.apache.commons.codec.binary.**
-dontwarn weibo4android.**
proguard 参数
-include {filename}    从给定的文件中读取配置参数 
 
-basedirectory {directoryname}    指定基础目录为以后相对的档案名称 
 
-injars {class_path}    指定要处理的应用程序jar,war,ear和目录 
 
-outjars {class_path}    指定处理完后要输出的jar,war,ear和目录的名称 
 
-libraryjars {classpath}    指定要处理的应用程序jar,war,ear和目录所需要的程序库文件 
 
-dontskipnonpubliclibraryclasses    指定不去忽略非公共的库类。 
 
-dontskipnonpubliclibraryclassmembers    指定不去忽略包可见的库类的成员。 
 
 
保留选项 
-keep {Modifier} {class_specification}    保护指定的类文件和类的成员 
 
-keepclassmembers {modifier} {class_specification}    保护指定类的成员,如果此类受到保护他们会保护的更好
 
-keepclasseswithmembers {class_specification}    保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。 
 
-keepnames {class_specification}    保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除) 
 
-keepclassmembernames {class_specification}    保护指定的类的成员的名称(如果他们不会压缩步骤中删除) 
 
-keepclasseswithmembernames {class_specification}    保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后) 
 
-printseeds {filename}    列出类和类的成员-keep选项的清单,标准输出到给定的文件 
 
压缩 
-dontshrink    不压缩输入的类文件 
 
-printusage {filename} 
 
-whyareyoukeeping {class_specification}     
 
优化 
-dontoptimize    不优化输入的类文件 
 
-assumenosideeffects {class_specification}    优化时假设指定的方法,没有任何副作用 
 
-allowaccessmodification    优化时允许访问并修改有修饰符的类和类的成员 
 
混淆 
-dontobfuscate    不混淆输入的类文件 
 
-printmapping {filename} 
 
-applymapping {filename}    重用映射增加混淆 
 
-obfuscationdictionary {filename}    使用给定文件中的关键字作为要混淆方法的名称 
 
-overloadaggressively    混淆时应用侵入式重载 
 
-useuniqueclassmembernames    确定统一的混淆类的成员名称来增加混淆 
 
-flattenpackagehierarchy {package_name}    重新包装所有重命名的包并放在给定的单一包中 
 
-repackageclass {package_name}    重新包装所有重命名的类文件中放在给定的单一包中 
 
-dontusemixedcaseclassnames    混淆时不会产生形形色色的类名 
 
-keepattributes {attribute_name,...}    保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses. 
 
-renamesourcefileattribute {string}    设置源文件中给定的字符串常量
 
解决export打包的报错
这个时候export提示“conversion to Dalvik format failed with error 1”错误,网上说法有好多种,最后我还是把proguard从4.4升级到4.8就解决了。官方地址是http://proguard.sourceforge.net。上面的配置文件参数可以在这里查阅。
升级办法很简单,就是把android sdk目录下的tool/proguard目录覆盖一下即可。
 
打包出来的程序如何调试
一旦打包出来,就不能用eclipse的logcat去看了,这里可以用android sdk中ddms.bat的tool来看,一用就发现和logcat其实还是一个东西,就是多了个设备的选择。
 
使用 gson 需要的配置
当Gson用到了泛型就会有报错,这个真给郁闷了半天,提示“Missing type parameter”。最后找到一个资料给了一个解决办法,参考:http://stackoverflow.com/questio ... sing-type-parameter。
另外我又用到了JsonObject,提交的Object里面的members居然被改成了a。所以上面给的东西还不够,还要加上
# 用到自己拼接的JsonObject
-keep class com.google.gson.JsonObject { *; }
 
 
个人建议减少这些依赖包混淆带来的麻烦,干脆都全部保留不混淆。例如
-keep class com.badlogic.** { *; }
-keep class * implements com.badlogic.gdx.utils.Json*
-keep class com.google.** { *; }
 
使用libgdx需要的配置
参考http://code.google.com/p/libgdx-users/wiki/Ant
 
 
验证打包效果
利用了apktool的反编译工具,把打包文件又解压了看了一下,如果包路径、类名、变量名、方法名这些变化和你期望一致,那就OK了。命令:
 
 
apktool.bat d xxx.apk destdir
 
配置实例
-injars  androidtest.jar【jar包所在地址】 
-outjars  out【输出地址】
-libraryjars    'D:\android-sdk-windows\platforms\android-9\android.jar' 【引用的库的jar,用于解析injars所指定的jar类】
 
-optimizationpasses 5
-dontusemixedcaseclassnames 【混淆时不会产生形形色色的类名 】
-dontskipnonpubliclibraryclasses 【指定不去忽略非公共的库类。 】
-dontpreverify 【不预校验】
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 【优化】
-keep public class * extends android.app.Activity  【不进行混淆保持原样】
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service
-keep public class * extends android.content.BroadcastReceiver
-keep public class * extends android.content.ContentProvider
-keep public class * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep public abstract interface com.asqw.android.Listener{
public protected ;  【所有方法不进行混淆】
}
-keep public class com.asqw.android{
public void Start(java.lang.String); 【对该方法不进行混淆】
}
-keepclasseswithmembernames class * { 【保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)】
native ;
}
-keepclasseswithmembers class * { 【保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。】
public (android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {【保护指定类的成员,如果此类受到保护他们会保护的更好 】
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {【保护指定的类文件和类的成员】
public static final android.os.Parcelable$Creator *;
}
//不混淆指定包下的类 
-keep class com.aspire.**
分享到:
评论

相关推荐

    代码混淆Eclipse插件Jocky

    总结来说,Jocky插件是Eclipse开发环境中的一个重要工具,它帮助开发者实现代码混淆,以保护软件源代码,防止恶意分析。通过集成ProGuard,Jocky提供了一种便捷的方式来管理混淆规则,并在Eclipse的界面内直接执行...

    ant proguard 混淆编译 之Eclipse-Idea

    在Android开发中,为了保护应用的安全性和优化代码,开发者通常会使用ProGuard工具进行混淆编译。本篇文章将聚焦于如何在Eclipse和IntelliJ IDEA(Idea)这两个不同的集成开发环境中配置并使用ProGuard,以实现对Ant...

    Android添加Proguard混淆支持完整实例

    在Android开发过程中,为了保护应用的安全性和优化代码大小,开发者通常会使用Proguard工具进行代码混淆。Proguard是一个强大的Java类文件 shrinker、optimizer、 obfuscator 和 preverifier,它能够删除未使用的...

    Android studio和Eclipse分别生成jar包并混淆jar包的demo

    混淆jar包在Eclipse中的过程与Android Studio类似,也需要编写ProGuard规则,并在导出jar前进行混淆。 总的来说,Android Studio和Eclipse都提供了生成和混淆jar包的功能,但Android Studio的Gradle构建系统使得...

    在eclipse上实现gradle批量打包,并加签名、混淆、改图标及应用名称

    在Android开发过程中,...总之,虽然Android Studio已成为首选的开发环境,但在Eclipse中通过Gradle进行批量打包、签名、混淆和修改应用元数据仍然是可行的。了解这些步骤对于维护旧项目或处理多项目场景非常有用。

    Android代码混淆及签名.doc

    Android 代码混淆可以通过两种方式实现,一种是直接在 Eclipse 中实现,Android 2.3 开始支持这个功能。另一种是使用 Ant。无论使用哪种方式,都需要配置 proguard.cfg 文件或 proguard-project.txt 文件。 配置 ...

    ANDROID应用程序的混淆打包分享

    android应用程序的混淆打包1 . 在工程文件project.properties中加入下proguard.config=proguard.cfg , 如下所示:target=android-8 proguard.config=proguard.cfg Eclipse会通过此配置在工程目录生成proguard.cfg...

    android打包APK

    1. ProGuard:这是一个内置的代码混淆工具,可以移除未使用的代码,缩短类和方法名,提高反编译难度。 2. 图片资源优化:压缩图片大小,使用WebP等高效图片格式。 3. 多APK支持:根据不同的设备特性(如屏幕尺寸、...

    android ant多渠道打包

    总结,Android的Ant多渠道打包是一个涉及Android构建工具、项目配置、代码混淆、签名和资源管理等多个环节的过程。通过熟练掌握这些知识点,开发者可以有效地管理和发布针对不同市场的定制化应用。

    eclips打包成jar

    如果你的Eclipse是用来开发Android应用的,可能还需要Android Development Tools (ADT)插件,尽管Android应用通常被打包为APK而不是JAR。 1. **创建JAR包**: - 在Eclipse的工作区中,找到你要打包的Java项目,...

    proguard5.3.3.jar

    ProGuard 是一个 Java 代码混淆器和压缩器,它可以将 Java 代码进行混淆,使得攻击者难以...在使用 Eclipse 进行打包时,如果出现了 ProGuard 打包错误,可能是因为 Android SDK 编译版本大于当前使用的 Java 版本。

    Xinche.rar_android 小车_android 蓝牙_蓝牙_蓝牙 串口 源代码_蓝牙串口android

    3. `proguard-project.txt` 是ProGuard配置文件,用于代码混淆和优化,保护应用的源代码安全。 4. `AndroidManifest.xml` 是Android应用程序的核心配置文件,定义了应用的组件、权限、使用的SDK版本等信息。 5. `bin...

    安卓自动打包ant

    总的来说,安卓自动打包Ant是一个综合性的过程,涵盖了编译源代码、处理资源、混淆代码、签名和打包成APK等步骤。开发者通过定制`build.xml`和相关配置文件,可以实现高效的自动化构建流程,从而提高开发效率并确保...

    android build tools 21

    5. **ProGuard**:ProGuard是Android的代码混淆工具,用于减小APK大小并增加代码安全性。在Build Tools 21中,ProGuard的配置和使用得到了改进,可以帮助开发者更好地优化和保护他们的代码。 6. **Instant Run**:...

    android音乐播放器

    .proguard-project.txt文件涉及到代码混淆,这是为了保护应用的源代码不被轻易反编译,通过混淆,原始的类名、方法名会被替换为简短的随机字符串,增加逆向工程的难度。 .classpath和.project文件是Eclipse或...

    Android-PdfViewerPDF.rar_android_android 安装

    5. `proguard-project.txt`:用于ProGuard的配置文件,ProGuard是一个Java代码混淆工具,可以减小APK大小并提高代码安全性。 6. `AndroidManifest.xml`:Android应用的核心配置文件,声明了应用的组件(如Activity...

    android-sdk_r21-windows.zip

    3. **构建工具**: 提供编译和打包应用程序所需的工具,如`aapt`(Android Asset Packaging Tool)处理资源,`apkbuilder`用于构建APK文件,以及`proguard`进行代码混淆和优化。 4. **Android平台**: `android-sdk_r...

    android-demo-eclipse:android应用程序演示

    7. **proguard**: 如果启用混淆,这里会包含ProGuard配置文件,用于代码优化和安全。 8. **gen**: 自动生成的R.java文件,包含了应用资源的ID。 【知识点解析】 1. **Android应用程序结构**:理解Android应用的...

    Android代码-选择城市列表配本地数据库可以直接应用到项目.zip

    7. **proguard.cfg**:这是ProGuard的配置文件,ProGuard是一个优化、压缩和混淆Java字节码的工具。在发布应用时,它可以帮助减少APK大小,保护代码安全,防止反编译。 8. **.classpath**和`.project`:这两个文件...

Global site tag (gtag.js) - Google Analytics