android打包apk时混淆遇到的问题
android打包apk的时候一般会选择混淆,而在eclipse中常使用的是proguard来混淆。有很多时候引用了第三方包的时候会导致打包不成功,或者打包成功不能运行的情况。
首先看看正常的proguard.cfg文件里面可以怎么写:
简单的android系统,没有第三方包
- -injars bin/classes
 - -outjars bin/classes-processed.jar
 - -libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar
 - -dontpreverify
 - -repackageclasses ''
 - -allowaccessmodification
 - -optimizations !code/simplification/arithmetic
 - -keep public class mypackage.MyActivity
 
完整的android系统
- -injars bin/classes
 - -injars libs
 - -outjars bin/classes-processed.jar
 - -libraryjars /usr/local/java/android-sdk/platforms/android-9/android.jar
 - -dontpreverify
 - -repackageclasses ''
 - -allowaccessmodification
 - -optimizations !code/simplification/arithmetic
 - -keepattributes *Annotation*
 - -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.view.View {
 - public <init>(android.content.Context);
 - public <init>(android.content.Context, android.util.AttributeSet);
 - public <init>(android.content.Context, android.util.AttributeSet, int);
 - public void set*(...);}
 - -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.content.Context {
 - public void *(android.view.View);
 - public void *(android.view.MenuItem);}
 - -keepclassmembers class * implements android.os.Parcelable {
 - static android.os.Parcelable$Creator CREATOR;}
 - -keepclassmembers class **.R$* { public static <fields>;}
 
如果加了android.support包的话,那么要加上
- -keep class android.support.**{*;}
 
- -dontwarn android.support.**
 
一劳永逸,免得打包的时候就报错。加上keep就是 告诉proguard不用混淆这个包里面的类,如果不加这个,报错会比较明显,会报出support包的错,其它的第三方的包最好也不要混淆,原样就可以了。
还有一些是打包的时候不会出错,但是在打成包之后安装运行就不行了。这时候要注意观察一下提示的信息,比如空指针异常,或者是反射的时候报错,那么这个时候要注意了,是不是实体类被混淆了。导致找不到实体类无法get或者set,那么这个时候应该做的事情是阻止proguard对实体类的混淆,比如:
- -keep public class mypackage.MyBean { public void setMyProperty(int); public int getMyProperty();}
 
这样的话实体类被保存下来了,就不会出现找不到的情况了,一般引用了json类的包或者orm类的包可能会有这样的错误出现。
当有注解的时候
- -keepattributes Signature
 - -keepattributes *Annotation*
 
别忘了加上这两句,减少错误的发生。
如果还有一些不明的错误的话,可以试着更新一下proguard的版本,使用最新的版本。毕竟再成熟的系统也是有BUG的。好了,先总结这么多吧。晚安~!
android打包apk时混淆遇到的问题的更多相关文章
- Android Studio 打包APK时,出现3个或多个APK
		
Android Studio 打包APK时,原来只会出现一个apk,结果现在出现3个apk,仔细检查了一下项目文件发现: Android Studio 的 buid.gradle文件里有个配置项被更改 ...
 - ReactNative之Android打包APK方法(趟坑过程)
		
欢迎大家加群讨论 点击链接加入群[ReactNative-解决问题交流群] :644124441 点击链接加入群[ReactNative技术交流群2] :687663534 多余的不解释了.直接上车吧 ...
 - Cocos2dx打包apk时变更NDK引发问题及解决
		
现在官方的Cocos Studio已经支持打包apk文件,写该随笔的时候还没试过官方的打包功能,所以就按自己的学习顺序先把打包的心得写下. 问题及最终解决方案: 其中耗时最长的问题就是ndk-r10改 ...
 - Android Studio打包APK时出现 is not translated in "en" (English) [MissingTranslation]
		
错误信息: Error:(16) Error: "baidutieba_client_inavailable" is not translated in "en" ...
 - Cocos Creator Android打包 apk
		
这一篇讲的是用 Cocos Creator 编译器打包 Android APP 的时候遇到的一些问题,虽然说打包的过程不是很复杂,但是在其中还是会遇到各式各样的坑. 我们将项目用CCC(Cocos C ...
 - unity调用安卓打包apk时的错误unable to convert classes into dex format
		
出现这种问题一般是由于有重复的文件所致,看下unity报的错误那些文件重复了,把重复的文件删了即可 例如,将eclipse中的安卓工程bin\class导出jar包时,会将下面的.class文件打包, ...
 - React Native Android打包apk
		
按照官方的5步曲: 1.在终端里面,cd 到项目的根目录后.执行下面这行命令: keytool -genkey -v -keystore my-release-key.keystore -alias ...
 - 关于 Android导出apk时碰到的[Unable to execute dex: Multiple dex files define]
		
这是一个编译错误,在ADT的编译器和SDK的工具有差异或是版本不一致时常会出现的一个问题,解决的方案如下: 第一步: updated eclipse (Help->Check for updat ...
 - [置顶]
        Android 打包apk无敌报错
		
前言: 这个问题从昨天上午一直到现在,请教了很多大佬,都没有给出确定的解决方案,可能他们也没碰到过可能,不过还是挺感谢他们的建议,一直到今天中午午休,我一直都在想这个问题,就是下面的这个,看了国内很多 ...
 
随机推荐
- sencha touch笔记(5)——DataView组件(1)
			
1.DataView组件可以显示列表,图像等等的组件或者元素,特别适用于数据仓库频繁更新的情况.比如像显示新闻或者微博等等的很多相同样式的组件的列表这种一次性从后台或者数据源拿取很多数据展示的样式.比 ...
 - 【转】如何在CentOS/RHEL中安装基于Web的监控系统 linux-das
			
Linux-dash是一款为Linux设计的基于Web的轻量级监控面板.这个程序会实时显示各种不同的系统属性,比如CPU负载.RAM使用率.磁盘使用率.网速.网络连接.RX/TX带宽.登录用户.运行的 ...
 - ZOJ 3594 年份水题 【注意:没有0年】
			
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #i ...
 - Android NumberPicker和DatePicker分割线颜色设置
			
NumberPicker /** * * 设置选择器的分割线颜色 * * @param numberPicker */ private void setDatePickerDividerColor(N ...
 - [Android] Activity 重复使用
			
Intent intent = new Intent(A.this, B.class); intent.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | ...
 - mysql启动的四种方式
			
mysql的四种启动方式: .mysqld 启动mysql服务器:./mysqld --defaults-file=/etc/my.cnf --user=root 客户端连接: mysql --def ...
 - 7款Linux下阅读PDF的阅读器。
			
5款Linux下阅读PDF的阅读器.1. Mupdf:link 2. Adobe Reader:link 3. Foxit Reader:link 4.Evince:link 5. Okular:li ...
 - Java基础02 方法与数据成员
			
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 在Java基础01 从HelloWorld到面向对象,我们初步了解了对象(obje ...
 - 禁止页面复制功能 js禁止复制 禁用页面右键菜单
			
<body oncontextmenu="return false">禁用网页右键菜单,但是仍然可以使用快捷键复制. js代码禁用复制功能: <script t ...
 - 推荐国内外优秀+免费CDN加速站点及公共cdn加速库
			
-----------------------------------------------------------------免费CDN加速站点 1.CloudFlare CloudFlare可能 ...