Android应用程序签名打包,混淆代码时报错的处理方法

来源:互联网 发布:卡拉ok软件 编辑:程序博客网 时间:2024/06/07 14:54

看了很多关于如何解决android应用程序打包出错的帖子,试用之后,发现并不能完全解决我所遇到的问题。纠结了几天,终于解决了我所遇到的问题,现将处理方法写出来以备自己日后查阅,也为遇到相同问题的朋友提供一点思路。

 

在我的程序中使用到了ksoap2.jar,关于这个Jar包的使用这里不再说明,网上有很多资料。如果要访问WebService服务,使用这个库会很方便。

下载地址:http://code.google.com/p/ksoap2-android/

 

使用Eclipse在工程目录下新建一个lib目录,将这个Jar包放进去,右击选择Build Path--->Add to Build Path

 

 

之后会在工程目录下生成一个Referenced Libraries目录,里面有刚刚添加进去的Jar包

再次右击该Jar包,选择Build Path--->Configure Build Path

在Order and Export选项卡中将刚刚添加进来的Jar包勾选中,OK退出。不勾选的话编译不会报错,运行时会报错。

Could not find class 'org.ksoap2.serialization.SoapObject', referenced from method xxx

 

下面就是要打开代码混淆的功能,默认情况下是关闭的。

在project.properties文件的末尾加上:

proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt::proguard-project.txt

网上都说加上:proguard.config= proguard.cfg,但是我的工程中并没有找到proguard.cfg文件,但是在工程目录下有一个proguard-project.txt,打开它会发现里面的内容和proguard.cfg的内容差不多,所有不必为没有proguard.cfg文件而纠结,也不需要手动创建一个,使用proguard-project.txt就可以了。

 

接下来就是导出apk,选择文件Export--->Export  Android  Application,其他的按照提示进行操作就可以了,如果是第一次导出的话,需要为该程序创建一个keystore,上面都设置好了之后就直接点击Finish,等待导出完成。

 

但是导出的过程并没有那么的顺利,可能会弹出如下提示:

提示代码混淆时发生错误,错误代码为1,让查看控制台输出信息,控制台输出如下:

Proguard returned with error code 1. See consoleNote: there were 4 duplicate class definitions.Warning: library class android.content.res.XmlResourceParser extends or implements program class org.xmlpull.v1.XmlPullParserWarning: library class android.content.Intent depends on program class org.xmlpull.v1.XmlPullParserWarning: library class android.content.IntentFilter depends on program class org.xmlpull.v1.XmlSerializerWarning: library class android.content.IntentFilter depends on program class org.xmlpull.v1.XmlPullParserWarning: library class android.content.res.ColorStateList depends on program class org.xmlpull.v1.XmlPullParserWarning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParserWarning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParserWarning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParserWarning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParserWarning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParserYou should check if you need to specify additional program jars.Warning: there were 10 instances of library classes depending on program classes.You must avoid such dependencies, since the program classes willbe processed, while the library classes will remain unchanged.java.io.IOException: Please correct the above warnings first.at proguard.Initializer.execute(Initializer.java:321)at proguard.ProGuard.initialize(ProGuard.java:211)at proguard.ProGuard.execute(ProGuard.java:86)at proguard.ProGuard.main(ProGuard.java:492)


 

大概意思是说发现有4个完全相同的类定义。

网上的解决办法是在proguard.cfg文件中添加如下两行代码屏蔽警告:

-dontwarn org.xmlpull.v1.XmlPullParser

-dontwarn org.xmlpull.v1.XmlSerializer

添加这两行代码的确是屏蔽了警告,而且也成功的导出了apk文件。

 

如果你的程序中只是使用到了ksoap2来调用WebService的话,可能不会有问题。但是,

如果程序中使用了ksoap2来调用WebService服务,在其他地方又使用的XmlPullParser来解析xml文档的话,程序运行到解析xml的是否就会出现如下问题:

W/System.err(427): caused by: a.c.a.b: resource not found: /META-INF/services/org.xmlpull.v1.XmlPullParserFactory make sure that parser implementing XmlPull API is available; nested exception is:a.c.a.b: resource not found: /META-INF/services/org.xmlpull.v1.XmlPullParserFactory make sure that parser implementing XmlPull API is available


 

会导致解析xml时抛出异常,得不到正确的解析结果,但是程序不会崩溃。

这是由于Android系统中已经集成XmlPullParser类,在ksoap2中也有这个类(之前导出时提示类重复定义的信息已被屏蔽),在混淆代码时产生了冲突,导致Android系统不知该如何处理,就抛出了异常,自己的理解,理解的不对的话欢迎交流。

 

这是ksoap2库中的包。

进入xmlpull--->v1

 

这是一个很头疼的问题,后来查了很多资料,找到了解决办法。

1.       到http://kxml.sourceforge.net/下载kxml2.jar并添加到lib目中;

2.       去掉之前在proguard-project.txt文件中添加的屏蔽警告的代码,并且添加

-libraryjars lib/kxml2-2.3.0.jar到该文件中,此kxml2.Jar包不需要添加到Build Path中,就直接放在lib目录中就可以了;

3.       再次导出apk,导出的过程中又会报错,信息如下:

Proguard returned with error code 1. See consoleNote: there were 19 duplicate class definitions.Warning: library class android.content.res.XmlResourceParser extends or implements program class org.xmlpull.v1.XmlPullParserWarning: library class android.content.Intent depends on program class org.xmlpull.v1.XmlPullParserWarning: library class android.content.IntentFilter depends on program class org.xmlpull.v1.XmlSerializerWarning: library class android.content.IntentFilter depends on program class org.xmlpull.v1.XmlPullParserWarning: library class android.content.res.ColorStateList depends on program class org.xmlpull.v1.XmlPullParserWarning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParserWarning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParserWarning: library class android.graphics.drawable.Drawable depends on program class org.xmlpull.v1.XmlPullParserWarning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParserWarning: library class android.view.LayoutInflater depends on program class org.xmlpull.v1.XmlPullParserYou should check if you need to specify additional program jars.Warning: there were 10 instances of library classes depending on program classes.You must avoid such dependencies, since the program classes willbe processed, while the library classes will remain unchanged.java.io.IOException: Please correct the above warnings first.at proguard.Initializer.execute(Initializer.java:321)at proguard.ProGuard.initialize(ProGuard.java:211)at proguard.ProGuard.execute(ProGuard.java:86)at proguard.ProGuard.main(ProGuard.java:492)


 

还是说类重复定义,这是由于ksoap2.Jar包与kxml2.Jar包中有重复定义的类,解决办法就是去掉ksoap2.jar中与kxml2.jar重复冲突的类。  

去掉以下内容:META-INF\maven\net.sourceforge.kxml、META-INF\maven\org.xmlpull、services、org\kxml2、org\xmlpull

下载地址:http://download.csdn.net/download/shlzxjp/4708356

 

然后,重新将ksoap2.jar拷贝到lib目录下覆盖原来的jar文件,clean一下工程,重新导出apk即可。

 

总之,要注意console的输出信息,多google一下,不过好多网页都打开不了,不过我相信你会有办法的,大家懂得!

 

原创粉丝点击