dhroid - dhroid ioc模块对 加密混淆问题
大家应该已经看过ioc的知识
在ioc基础中中
视图事件都是通过注解实现的
问题1
如果有某个属性只声明了一下,其他代码没有引用由于混淆时会进行属性优化,将没用的属性去掉,这时需要处理
处理方法:在混淆配置文件中保留属性
问题2
混合代码时方法名都会变成a,b,c等,这样ioc事件可能就找不到方法
如下面的注解
InjectView(id=R.id.listView,itemClick="toEditStudent",itemLongClick="toDeleteStudent")
处理方法
在写代码时要有规范所有方法 所有事件方法都是以 on或to开头
在配置 混淆配置文件 对以on 和to的方法名保留
事件总线OnEvent 注解的方法也需要这样处理 ,不然方法可能被注释掉
当然现在还有更好的选择 使用第三方工具进行加密
爱加密的加密功能还是很牛的
http://www.ijiami.cn/treg?regCode=1003705
爱加密最后生成的classe.dex只有2k
我和他们客服聊了下
他说
原本的DEX文件被隐藏了的
现在这里的只是它们做的一个壳
这个基础版做了两部分处理,一是对apk内部每一个文件进行唯一值验证,只要apk内部的任何一个文件被修改 此文件的唯一值必定变化。运行时检测到变化程序将卡死。另一个就是DEX加壳隐藏
有点像帮他们做广告的嫌疑啊 当然你也可以先混淆后在让爱加密的加密
附上我的混淆配置文件
-optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontoptimize -ignorewarnings #工程中用到的第三方包 -libraryjars libs/android-support-v13.jar #工程中用到的第三方包 -libraryjars libs/baidu_moni.jar #不混淆第三方包 -keep class android.support.v13.** #忽略第三方包导致的异常 -dontwarn android.support.v4.** #忽略第三方包导致的异常 -dontwarn android.support.v13.** -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -keep public class * extends android.app.Activity -keep public class * extends android.support.v4.app.Fragment -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 * implements android.os.Parcelable -keep public class * extends OrmLiteSqliteOpenHelper -keep public class net.duohuo.dhroid.net.cache.Cache -keep public class net.duohuo.dhroid.net.cache.CacheManager -keep public class * extends net.duohuo.dhroid.util.Perference -keep public class com.android.vending.licensing.ILicensingService -keep class net.duohuo.dhroid.net.cache.CacheManager{ *; } -keep class net.duohuo.dhroid.net.cache.Cache{ *; } -keep class com.j256.ormlite.dao.*{ *; } -keep class com.j256.ormlite.db.*{ *; } -keep class com.j256.ormlite.table.*{ *; } -keep class com.j256.ormlite.stmt.*{ *; } -keep class com.j256.ormlite.support.*{ *; } -keep class com.j256.ormlite.misc.*{ *; } -keep class com.j256.ormlite.field.*{ *; } -keep class com.j256.ormlite.logger.*{ *; } -keep class com.j256.ormlite.android.*{ *; } -keep class com.j256.ormlite.android.apptools.*{ *; } -keep class com.google.gson.*{ *; } -keep class com.google.gson.stream.*{ *; } -keep class com.google.gson.reflect.*{ *; } -keep class com.google.gson.internal.*{ *; } -keep class com.google.gson.annotations.*{ *; } -keep class com.google.gson.internal.bind.*{ *; } -keep class net.duohuo.dhroid.util.*{ *; } -keep class net.duohuo.ivory.util.*{ *; } -keep public class * extends com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper{ *; } -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembernames class * { public <init>(android.content.Context, android.util.AttributeSet, int); } #保存itemclick的回调 -keepclassmembers class *{ public void on*(android.widget.AdapterView, android.view.View,int,long); public void to*(android.widget.AdapterView, android.view.View,int,long); public void on*( android.view.View); public void to*( android.view.View); public void on*(); public void to*(); } #保存所有的属性 -keepclassmembers class * { <fields>; } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }