安卓代码混淆注意事项

安卓代码混淆时经常会出现各种问题,下面罗列一些注意事项

1.依赖的工程中使用的jar包若和工程自身中的jar包一样的话,直接删除依赖工程中相同的jar包即可

2.native方法要阻止混淆
 例:
# natvie 方法不混淆
-keepclasseswithmembernames class * {
    native <methods>;
} 

3.若自定义基类Activity中有根据名称为控件注入值的要采用如下方法阻止字段被混消

如 基类Activity中有如下控件注入方法  

	protected void smartInject() {
        Class<? extends Activity> clz=getClass();
        Field[] fs=clz.getDeclaredFields();
        Resources res = getResources();
        String packageName = getPackageName();
        for (Field field : fs) {
        	if (!View.class.isAssignableFrom(field.getType())) {
				continue;
			}
            int viewId = res.getIdentifier(field.getName(), "id", packageName);
            if (viewId==0)
                continue;
            field.setAccessible(true);
            try {
                View v=findViewById(viewId);
                field.set(this,v);
                Class<?> c=field.getType();
                Method m=c.getMethod("setOnClickListener", android.view.View.OnClickListener.class);
                m.invoke(v, this);
            } catch (Throwable e) {
//                e.printStackTrace();
            }
            field.setAccessible(false);  

        }  

    } 

-keep class 应用包名.R$id{*;}

-keep public class * extends 包名.基类Activity {

      <fields>;
}

3.常见的一些阻止代码混淆的写法

-keep class com.iflytek.**{*;}

-libraryjars libs/BaiduLBS_Android.jar
-libraryjars libs/fastjson-1.1.39.jar
-libraryjars libs/bcprov-jdk15-143.jar
-libraryjars libs/android-support-v4.jar

-keep class com.baidu.** { *; } 

-keep class vi.com.gdi.bgl.android.**{*;} 

-keep class okio.** {*;}
-dontwarn  okio.**
-dontwarn  com.alibaba.**
-dontwarn  org.bouncycastle.**

-keepattributes Signature
-keepattributes *Annotation*

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-08 02:12:10

安卓代码混淆注意事项的相关文章

安卓 代码混淆与打包

gradle的配置 proguard-rules.pro混淆配置 ###-----------基本配置-不能被混淆的------------ -keep public class * extends android.app.Activity -keep public class * extends android.app.Fragment -keep public class * extends android.app.Application -keep public class * exten

Android项目外接高德地图代码混淆注意事项

如今好多项目中都加入了第三方jar包,可是最大的问题就是打包的时候代码混淆报错,下面是高德地图混淆报错解决方式: 在proguard-project.txt中加入例如以下代码: -libraryjars   libs/android-support-v4.jar -dontwarn android.support.v4.** -keep class android.support.v4.** { *; } -keep interface android.support.v4.app.** { *

安卓代码混淆中常量的处理方法

最近一直在研究代码混淆,其中发现一个问题,就是我们定义的一些公用的常量在代码混淆后,经过反编译,竟然完完整整的显示在我的眼前,比如服务请求地址,竟然以完整路径的形式显示在混淆后的代码中,比自己定义的还要完整,要是这样的话,代码混淆还有意义吗?当时很郁闷,不过又一想,常量肯定是不能被混淆的,若常量被混淆,1混成个2,其它地方再去引用必然会出错啊,那这怎么办呢?又想进行混淆,又不想让比较重要的常量明目张胆的显示?办法肯定是有的,只是你愿不愿去思考.我们可以对比下原项目和混淆后解压出来的项目结构,你就

御安全浅析安卓开发代码混淆技术

御安全浅析安卓开发代码混淆技术[关键词:代码混淆,Android应用加固,移动应用保护,APP保护,御安全] 提高native代码的安全性有什么好办法吗?答案是肯定的,今天我们就来介绍一种有效对抗native层代码分析的方法--代码混淆技术.随着移动互联网的快速发展,应用的安全问题不断涌现出来,于是越来越多的应用开发者将核心代码由java层转到native层,以对抗成熟的java逆向分析工具,然而如果native层的代码如果没有进行任何保护,还是比较容易被逆向分析工作者获取其运行逻辑,进而完成应

安卓与“Proguard”——安卓的代码混淆

谨以此文,记我在公司实习时,所接到的第一个正式的.真正有意义的任务--将公司即将发布的APK进行代码混淆. 什么是代码混淆 混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义.被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量.函数.类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的况下,即使被反编译,也将难以阅读.同时混淆是不

安卓解决代码混淆与反射的冲突

此前的代码混淆,因为并没有用到反射,所以常规的代码混淆方式一遍就能通过,而此项目中某些类利用到了反射机制(本人的这个项目中有即时通讯功能,所以有表情类资源,因此需要通过反射由文件名找到表情资源id),当由文件名去寻找资源id时就报空指针异常了,期初我并不知道什么原因,通过反编译已经混淆的apk,一步一步寻找到出错的地方,才恍然大悟,正是反射那一步出现了问题:Field field = R.drawable.class.getDeclaredField(name);走到这一步就挂了,程序直接崩溃.

77.Android之代码混淆

转载:http://www.jianshu.com/p/7436a1a32891 简介 作为Android开发者,如果你不想开源你的应用,那么在应用发布前,就需要对代码进行混淆处理,从而让我们代码即使被反编译,也难以阅读.混淆概念虽然容易,但很多初学者也只是网上搜一些成型的混淆规则粘贴进自己项目,并没有对混淆有个深入的理解.本篇文章的目的就是让一个初学者在看完后,能在不进行任何帮助的情况下,独立写出适合自己代码的混淆规则. 说在前面 这里我们直接用Android Studio来说明如何进行混淆,

ProGuard代码混淆技术详解

前言 受<APP研发录>启发,里面讲到一名Android程序员,在工作一段时间后,会感觉到迷茫,想进阶的话接下去是看Android系统源码呢,还是每天继续做应用,毕竟每天都是画UI和利用MobileAPI处理Json还是蛮无聊的,做着重复的事情,没有技术的上提升空间的.所以,根据里面提到的Android应用开发人员所需要精通的20个技术点,写篇文章进行总结,一方面是梳理下基础知识和巩固知识,另一方面也是弥补自我不足之处. 那么,今天就来讲讲ProGuard代码混淆的相关技术知识点. 内容目录

oc代码混淆

混淆内容 1.混淆思路:利用宏定义进行混淆,混淆文件需要在需要混淆的文件中引用(或全局引用) 2.混淆内容:(橘黄色) 公开变量  @property (nonatomic, strong) NSString  *gameName; 私有变量 @interface XXXX () { NSString  *gameName; } 类名    @interface ClassName () 方法名 公开 - (void)getUserName:(NSString *)name age:(NSInt