Android代码混淆常见问题解决方案总结

原创 2015年01月08日 20:01:33
	什么是代码混淆呢?混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义
	为什么要进行Android代码混淆?Android是基于Java的,Java源代码编译成中间“字节码”存储于class文件中,很容易被反编译成Java源代码。为了防止辛辛苦苦开发的东西轻易流失,就需要对将要发布出去的程序进行混淆。接下来切入今天的正题,Android代码混淆,可以参考上篇android应用的反编译(点击打开链接),加深对代码混淆要性的理解
	Android混淆用到的工具:ProGuard,还具有代码优化的作用,工作方式:去除无效的代码,将代码中的类名、函数名替换为晦涩难懂的名字。只能混淆java代码,对其它的如资源文件等无影响,相关联的文件主要有proguard、proguard-project.txt、project.properties,如下图所示:
	为什么要配置proguard-project.txt文件,如果不配置,启用混淆功能时会把所有的java代码混淆,而Android工程中有些代码是不能被混淆的,所以该文件配置的是哪些文件不能混淆。不能被混淆的文件主要有以下几类:a 引用的第三方jar,已经被第三方公司混淆,再次混淆的话,执行程序就会报找不到该jar中的类;b 用到泛型的类;c 用到反射的类; d 用到java和js交互的类
	基本的配置有以下三种:1 不混淆该包中的所有类 -keep class com.alipay.android.app.** {*; } 
                 	忽略混淆引起的包中所有类产生的警告 -dontwarn com.alipay.android.app.**
             		表明当前是一个jar(需要对jar包中的所有包下的类进行1和2处理) -libraryjarslibs/pinyi						n4j-2.5.0.jar 

	衍生配置如下:a  不混淆某个类的构造函数  -keepclassmembers class com.ticktick.example.Test { 
					         		public void setTestString(java.lang.String);
 						 }
           	      b  不混淆某个包中的特定类  -keep class com.ticktick.example.Test { * ; }
 
           	      c  不混淆某个类的特定的函数 -keepclassmembers class com.ticktick.example.Test {
        				        		public void setTestString(java.lang.String);
	 					 }

            d  不混淆某个类的子类 -keep public class extends com.ticktick.example.Test                     
		      e  不混淆某个接口的实现 -keep class * implementscom.ticktick.example.TestInterface { 
					      			public static final com.ticktick.example.TestInterface$Creator *; 
               					}

	其它配置:-optimizationpasses 3 
              	  -dontusemixedcaseclassnames #混淆时不会产生形形色色的类名 
                  -dontskipnonpubliclibraryclasses#指定不去忽略非公共的类库 
                  -dontpreverify#不预校验 
                  -verbose 
                  -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*#优化 
          
	注意:根据以上并不能保证所有不该混淆的都有配置,可以通过运行程序,通过程序给出的错误log信息,在proguard-project.txt文件中充不需要混淆的配置,这样既能达到保护代码不泄露,又能优化程序并同时保证程序应有的功能运行正常     
    
	常见问题归类:1 用到afinal和gson jar包做,且已经做过jar防混淆处理,还需要对用到的实体进行防混淆配置
        	 	  -keep class cn.gyyx.android.qibao.model.** {*; }
                    	  -dontwarn cn.gyyx.android.qibao.model.**
         	      2 解决missing a type错误
               		  #过滤泛型 
                    	  -keepattributes Signature
            		  -keep class sun.misc.Unsafe { *; }
                    	  #Application classes that will be serialized/deserialized over Gson
 		          -keep class com.google.gson.examples.android.model.** { *; } 
    
   		      3 过滤Javascript webview.addJavascriptInterface(this, "install");
               		  this就是需要过滤的类
               		  -keepclassmembers class cn.gyyx.android.qibao.context.fragment.servantchild.AppRecommendF			 		  ragment{
    				public *;
        		  }
          		  -keepattributes *Annotation*
           		  -keepattributes *JavascriptInterface*

	附上配置截图:供参考

    以上所有配置完善后,签名打包一个apk,试着反编译查看程序源码,对照一下原工程的代码,就可以知道代码混淆的强大威力,经过混淆之后再也不用担心辛辛苦苦的代码被拿走了

相关文章推荐

Android Studio混淆打包忽略第三方jar包配置

写这篇博客的理由前段时间用Android Studioh的时候,碰到一些问题,网上找了很多资料,发现很多都是Copy Paste,找了许久没有找到有用的资料,然后在Stack Overflow中找到了...

代码混淆详解

什么是代码混淆 Java 是一种跨平台的、解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中。由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名、方法名,...

Android 混淆代码总结

Android 混淆代码总结

Android代码混淆之混淆规则

因为Android是使用Java开发的,所以开发者可以使用ProGuard对代码进行混淆。SDK已经集成了ProGuard工具,开发者可以从SDK目录下的\tools\proguard目录中进行查看。...
  • sxl403
  • sxl403
  • 2015年11月16日 11:33
  • 1927

Android Studio混淆模板及常用第三方混淆(看了都说好)

Android Studio混淆模板及常用第三方混淆(看了都说好) http://www.jianshu.com/p/f9438603e096?utm_campaign=hugo&utm_m...

Android Studio混淆模板及常用第三方混淆(看了都说好)

首先要在build.gradle中开启混淆,也就是minifyEnabled true,我用的build.gradle具体如下所示: def releaseTime() { return n...

读懂 Android 中的代码混淆

在Android开发工作中,我们都或多或少接触过代码混淆。比如我们想要集成某个SDK,往往需要做一些排除混淆的操作。 本文为本人的一些实践总结,介绍一些混淆的知识和注意事项。希望可以帮助大家更好...

Android代码混淆失败

Reading input...  Reading program jar [/data/rdm/projects/7060/bin/proguard/original.jar]  Reading...

Android 混淆问题集锦

android使用打包过程中proguard混淆后, 会导致一些错误 1. 写在视图xml中的onClick响应出错. 因为写在xml中的onClick是通过反射调用的, proguard认为它们没...

Android 项目的代码混淆,Android proguard 使用说明

Android 项目的代码混淆,Android proguard 使用说明
  • catoop
  • catoop
  • 2015年08月02日 18:43
  • 29086
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android代码混淆常见问题解决方案总结
举报原因:
原因补充:

(最多只允许输入30个字)