Android studio 混淆碰到的坑
来源:互联网 发布:joo yeon seo三级 编辑:程序博客网 时间:2024/06/04 20:00
1.当res中有资源文件是动态使用时,不要在gradle里面加shrinkResources true //移除无用的resource 文件
原因:因为这个属性会帮你移除项目中没用到的资源文件
解决经历:第一次碰到这个坑得时候搞了我好久,一直以为是混淆出错了,但却一直找不到原因,后来是有一天早上,灵光一现,想通了所有环节,发现最有可能出错的点
就是那里,后来去掉后,果然一切正常
现象是:项目中有调用的图片都是正常的,没有调用的图片都变成小黑点,只有1kb
2.一般调用第三方库混淆非常简单:
1》一般第三方库,网上都有相应的混淆配置
2》如果没有,也非常简单:
-dontwarn org.androidannotations.**
-keep class org.androidannotations.** {*;}
--dontwarn 第三方库包名
-keep class 第三方库包名.** {*;}
3》基础配置:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-printmapping priguardMapping.txt
-keepattributes SourceFile,LineNumberTable
-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
-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 *;
}
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
-keepclassmembers class **.R$* {
public static <fields>;
}
-dontwarn android.support.**
-keepnames class * implements java.io.Serializable
# 这指定了继承Serizalizable的类的如下成员不被移除混淆
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
!private <fields>;
!private <methods>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# 保留自定义控件(继承自View)不能被混淆
-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*(***);
*** get* ();
}
4》自己的类的话,主要是实体类跟config,一般一个项目的实体类都放在同一个包下面,方便自己混淆,不遗漏
5》不能混淆的东西:
1.反射中使用的元素:如果一些被混淆使用的元素(属性,方法,类,包名等)进行了混淆,可能会出现问题,如NoSuchFiledException或者NoSuchMethodException等
2.GSON的序列化与反序列化
3.枚举也不要混淆
4.四大组件不建议混淆
Android中四大组件我们都很常用,这些组件不能被混淆的原因为
四大组件声明必须在manifest中注册,如果混淆后类名更改,而混淆后的类名没有在manifest注册,是不符合Android组件注册机制的.
外部程序可能使用组件的字符串类名,如果类名混淆,可能导致出现异常
5.注解不能混淆
6.其他不能混淆:
jni调用的java方法
java的native方法
js调用java的方法
第三方库不建议混淆
其他和反射相关的一些情况
参考博客:
http://droidyue.com/blog/2016/07/10/understanding-android-obfuscated-code-by-proguard/index.html
http://blog.csdn.net/zuiwuyuan/article/details/48552701
https://android.googlesource.com/platform/sdk/+/master/files/proguard-android-optimize.txt(标配)
总结:做项目,难免碰到一些难点,但是不要怕,当你真正沉浸在这件事中的时候,你总会找到解决方法!!只要相信:
世上无难事,只要肯付出,别人能做的,咱也能做
原因:因为这个属性会帮你移除项目中没用到的资源文件
解决经历:第一次碰到这个坑得时候搞了我好久,一直以为是混淆出错了,但却一直找不到原因,后来是有一天早上,灵光一现,想通了所有环节,发现最有可能出错的点
就是那里,后来去掉后,果然一切正常
现象是:项目中有调用的图片都是正常的,没有调用的图片都变成小黑点,只有1kb
2.一般调用第三方库混淆非常简单:
1》一般第三方库,网上都有相应的混淆配置
2》如果没有,也非常简单:
-dontwarn org.androidannotations.**
-keep class org.androidannotations.** {*;}
--dontwarn 第三方库包名
-keep class 第三方库包名.** {*;}
3》基础配置:
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-printmapping priguardMapping.txt
-keepattributes SourceFile,LineNumberTable
-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
-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 *;
}
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
-keepclassmembers class **.R$* {
public static <fields>;
}
-dontwarn android.support.**
-keepnames class * implements java.io.Serializable
# 这指定了继承Serizalizable的类的如下成员不被移除混淆
-keepclassmembers class * implements java.io.Serializable {
static final long serialVersionUID;
private static final java.io.ObjectStreamField[] serialPersistentFields;
!static !transient <fields>;
!private <fields>;
!private <methods>;
private void writeObject(java.io.ObjectOutputStream);
private void readObject(java.io.ObjectInputStream);
java.lang.Object writeReplace();
java.lang.Object readResolve();
}
# 保留自定义控件(继承自View)不能被混淆
-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*(***);
*** get* ();
}
4》自己的类的话,主要是实体类跟config,一般一个项目的实体类都放在同一个包下面,方便自己混淆,不遗漏
5》不能混淆的东西:
1.反射中使用的元素:如果一些被混淆使用的元素(属性,方法,类,包名等)进行了混淆,可能会出现问题,如NoSuchFiledException或者NoSuchMethodException等
2.GSON的序列化与反序列化
3.枚举也不要混淆
4.四大组件不建议混淆
Android中四大组件我们都很常用,这些组件不能被混淆的原因为
四大组件声明必须在manifest中注册,如果混淆后类名更改,而混淆后的类名没有在manifest注册,是不符合Android组件注册机制的.
外部程序可能使用组件的字符串类名,如果类名混淆,可能导致出现异常
5.注解不能混淆
6.其他不能混淆:
jni调用的java方法
java的native方法
js调用java的方法
第三方库不建议混淆
其他和反射相关的一些情况
参考博客:
http://droidyue.com/blog/2016/07/10/understanding-android-obfuscated-code-by-proguard/index.html
http://blog.csdn.net/zuiwuyuan/article/details/48552701
https://android.googlesource.com/platform/sdk/+/master/files/proguard-android-optimize.txt(标配)
总结:做项目,难免碰到一些难点,但是不要怕,当你真正沉浸在这件事中的时候,你总会找到解决方法!!只要相信:
世上无难事,只要肯付出,别人能做的,咱也能做
1 0
- Android studio 混淆碰到的坑
- android studio 碰到的问题
- android studio碰到的问题
- Android Studio的代码混淆
- Android studio 微信登录时碰到的坑
- Android Studio 1.0安装碰到的问题
- Android studio 安装碰到的问题
- 接触Android Studio以来碰到的问题
- android studio 碰到问题
- Android Studio 代码混淆(你真的会混淆吗)
- 关于Android studio混淆遇到的问题
- Android Studio 打包混淆出现的问题
- Android Studio混淆的简单使用
- android studio 下的LitePal 混淆处理
- 关于android studio的混淆操作
- android studio 生成混淆的jar包
- Android Studio的Proguard(代码混淆)
- Android studio 混淆时使用的词汇
- 40条Android开发优化建议
- (LeetCode)Count Primes --- 统计素数(质数)
- Android学习
- 今日头条架构演进之路
- RTMP协议过程分析
- Android studio 混淆碰到的坑
- java 基本数据类型和其封装类你知多少?
- 获取Android SHA1 、生成jks密钥、签名Apk
- PHP入门1.9
- tomcat配置浏览器直接输入IP登录首页
- Neural style之torch学习笔记1:Tensor
- ObjectAnimator 动画旋转 暂停时停止在旋转到的位置
- 疯狂ios讲义之自定义UI控件
- JAVA容器-HashTable