混淆jar包总结

首先是android混淆配置:

http://blog.csdn.net/dianyueneo/article/details/7212012

proguard命令行:
首先定位到proguard.jar所在目录   java -jar proguard.jar @config.pro

-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 <methods>;  【所有方法不进行混淆】
}
-keep public class com.asqw.android{
public void Start(java.lang.String); 【对该方法不进行混淆】
}

-keepclasseswithmembernames class * { 【保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)】

native <methods>;
}

-keepclasseswithmembers class * { 【保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。】
public <init>(android.content.Context, android.util.AttributeSet);
}

-keepclasseswithmembers class * {
public <init>(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 *;
}

如果资源文件(和R.java)中存在没有直接调用的文件 但对于程序来说又必须用到的 

例如通过反射 获取图片id  int imgResId = R.drawable.class.getField(indexVo.xx_img).getInt(new R());

可以不混淆R文件

-keepclassmembers class **.R$* {
    public static <fields>;
}

不混淆第三方jar包 例如:

-keep class org.** {*;} 
-keep class com.lenovo.lps.sdk.** {*;}


泛型

-keepattributes Signature


引入java环境

-libraryjars C:/Java/jre6/lib/rt.jar

reference :http://blog.csdn.net/jinwanmeng/article/details/7706925


Android APK及导出JAR包的代码混淆


Android开发基于java语言的,很容易被别人反编译出来,一下就相当于裸奔了,特别是用于商业用途的时候,防止反编译是必要的措施。而代码混淆是一种很好防止反编译的方式。

 

1、APK的代码混淆。

 

eclipse的开发环境下,使用android SDK 自带的proguard混淆工具。

主要用到红线框中的两个文件。

 

 

project.properties文件中,要指定混淆的文件。如图:

 

 混淆jar包总结_第1张图片

 

然后,详细的proguard-project.txt的写法如下:

-dontwarn 是让指定包名不提示警告

-libraryjars 是指明导入第三方包,不参加混淆

 

 混淆jar包总结_第2张图片

 

再看看我导入的第三方包:

 

 

 

 

好了,这些准备工作都OK,那就开始导出APK了。注意平时调试的时候是不会进行代码混淆的,切记不要直接COPY /bin目录下APK发布出去哦。导出APK的具体流程:

 

右键 ——> Export ------>  

 

 混淆jar包总结_第3张图片

 

我用的现在的一个keystore,当然你也可以新建一个,这个很容易的。

 混淆jar包总结_第4张图片

 

混淆jar包总结_第5张图片

再输入一个alias的密码

 

 


混淆jar包总结_第6张图片

 

选择好APK存储的目标目录,点击Finish,就可以在指定的目录下看到APK了。

但是如果你那个proguard-project.txt配置没有写好的话,如下:(有把一句屏蔽掉了)

 混淆jar包总结_第7张图片

 

当点击Finish的时候,就会出现下来这种报错:

 

 混淆jar包总结_第8张图片

 


OK了之后,你可以看看,混淆之前和之后异同:

 

 

 混淆jar包总结_第9张图片

 

 


 

2、Android工程导出JAR包的混淆。

我是参照:http://www.cnblogs.com/rayray/p/3421028.html

 

其实,还是用Android SDK 里自带的Proguard,位于目录android-sdk-windows\tools\proguard\bin下面proguardgui.bat。双击即可开始,

 

 

 

可以加载已经存在的配置文件,也可以点击Next,新建一个。

 

 

 

 混淆jar包总结_第10张图片

 混淆jar包总结_第11张图片

 

 混淆jar包总结_第12张图片

 

 混淆jar包总结_第13张图片

 混淆jar包总结_第14张图片



 

 

完成混淆!如果这时候它报错的话,可以先将这些配置文件保存下来,直接修改文件就可以了。

 混淆jar包总结_第15张图片


然后,我们可以看看混淆之前和混淆之后的效果。

 

 

 

 混淆jar包总结_第16张图片

 

reference:http://blog.csdn.net/yanyuanfen2011/article/details/36905627

Unable to execute dex: Multiple dex files define 解决方法

问题发生概述:
       程序编译正常,在用Eclipse调试执行时,报错Unable to execute dex: Multiple dex files define,因为以前也没有遇到这类错误,首先便尝试万能纠错发,如下方法一,也是上网搜索众多解决方案之一,尝试后未果,便按照搜索方案,逐一尝试,都未能解决,最后盯着工程突然发现问题。具体解决方案如下:

方法一:
       Eclipse->Project->去掉Build Automatically->Clear ->Build Project->Build Automatically,关闭Eclipse,再打开(我的问题不是出在这)


方法二:           
      更新ADT插件,删除workspace目录下的.metadata目录,(这个解决方案没有尝试,因为在开发过程中,我只是更换了一个jar包而出现的错误,而且开发环境不能连网络,不方便尝试)


方法三:
      在你的项目下某个文件夹中有一个后缀为*.APK的文件,删掉,重启Eclipse即可。(尝试未果)


方法四:
      原因是有重复的。jar被引用,可以查看你的build path,尤其是Android Dependencies一定有重复引入的.jar包,解决的方法是在libs删除重复的jar即可。 (我找了半天,也没有发现重复引用的jar包,不过还是得感谢这位同学,我最终能解决问题也是受到这个方案的启发,贴上博客连接http://blog.sina.com.cn/s/blog_4b9b6ad001016uuk.html)


方法五:(成功解决方法)
      在项目中,有一个类的包名和引用的jar包中的类和包名一致,我用的是jar包中的类,所以工程中的这个类就是重复引用的,删除工程中重复引用的类后,成功打包启动。希望各位同学注意这个小问题。


reference: http://blog.csdn.net/mxlxiao7/article/details/8978930

使用Proguard混淆代码,如何保留内部类并正常调用


在配置规则文件中加入:-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
就可以了

reference:http://bbs.csdn.net/topics/390209199

鸣谢以上的作者!




你可能感兴趣的:(android,jar,反编译)