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混淆步骤,混淆结果查看以及混淆后出现的问题和衍生问题

今天说说Android原生的混淆,原生项目即将上线,伴随着整体功能的完成和完善,一些涉及安全和自我保护以及优化的问题被提到日程上。混淆恰恰能解决的就是我们的APP代码的保护以及优化的问题。前言: 因...
  • xinluqishi123
  • xinluqishi123
  • 2017年03月14日 15:32
  • 1137

android 代码混淆导致问题,快速定位

我们在打包时,debug版本没问题,但混淆后release版本有时会出现异常崩溃, 比如:**a(SourceFile:) NullPointerException ** 针对这种情况,可以通过抓U...
  • u011570979
  • u011570979
  • 2015年05月28日 22:33
  • 2190

Android 混淆问题集锦

android使用打包过程中proguard混淆后, 会导致一些错误 1. 写在视图xml中的onClick响应出错. 因为写在xml中的onClick是通过反射调用的, proguard认为它们没...
  • heng615975867
  • heng615975867
  • 2016年03月24日 21:21
  • 925

Android应用混淆问题记录

1.怎么打开混淆器混淆Android代码
  • qiu592198740
  • qiu592198740
  • 2014年11月19日 14:50
  • 811

Android混淆心得

最近在做Android应用的混淆,踩了一些坑,这里记录分享下个人的心得。
  • maxwell_nc
  • maxwell_nc
  • 2016年07月22日 22:07
  • 4198

android studio 代码混淆如何忽略第三方jar包

android studio 代码混淆如何忽略第三方jar包 日前在打包混淆包含第三方jar包的android studio项目时 报出了各种错误,但是debug版本却能正常运行,于是怀疑andro...
  • i374711088
  • i374711088
  • 2015年07月07日 10:41
  • 28849

关于Android studio混淆遇到的问题

先给出官方文档链接: https://stuff.mit.edu/afs/sipb/project/android/sdk/android-sdk-linux/tools/proguard/docs...
  • dingjikerbo
  • dingjikerbo
  • 2016年01月18日 20:16
  • 3423

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

解决了混淆代码常见问题,真正实现代码混淆,而且不影响程序的原有功能,同时对程序还进行适当的优化...
  • a__a_
  • a__a_
  • 2015年01月08日 20:01
  • 1317

Android 开发技巧 开发常见问题归纳 需要注意的坑和解决方案

1. 在Activity还没完全显示时,弹出PopupWindow或者Dialog  崩Activity not running 错误         解决方案: 重写onWindowFocusCha...
  • soul_code
  • soul_code
  • 2015年12月01日 13:59
  • 2905

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

1.什么是混淆?为什么混淆? 将代码中的各种元素,如变量,函数,类的名字改写成无意义的名字。比如改写成单个字母,或是简短的无意义字母组合,甚至改写成“__”这样的符号,使得阅读的人无法根据名...
  • wangshuainan
  • wangshuainan
  • 2017年03月23日 15:55
  • 198
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android代码混淆常见问题解决方案总结
举报原因:
原因补充:

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