热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android代码混淆需要知道以及注意的事情

自古英雄不问出处,奈何我却不是英雄!转载请标明出处:http:blog.csdn.netu011275767articledetails46440303以前项目中没有做过代码混淆,近期公司

自古英雄不问出处,奈何我却不是英雄!

转载请标明出处:http://blog.csdn.net/u011275767/article/details/46440303

以前项目中没有做过代码混淆,近期公司项目被安全测试机构检测出安全问题,结果第一个就是混淆问题,木有办法,只有混淆了。没有做过混淆真是一头雾水,前前后后搞了三天,想想也是喝多了。

说道混淆,就要提一下为什么混淆。如果不加混淆分分钟把你代码反编译出来。至于有什么影响我这里就不说了,既然你们看到这篇文章那么你们就是出现各自的问题了。

要注意的是不同的版本,不同IDE之间是有一些不同的。Eclipse中老版本的ADT里面是proguard.cfg,然后在defult.properties加入proguard.cOnfig=proguard.cfg。defult.properties文件是这样的

# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system use,
# "build.properties", and override values to adapt the script to your
# project structure.
# Project target.
target=android-19
proguard.cOnfig=proguard.cfg

新版ADT没有了proguard.cfg而是换成了project.properties和proguard-project.txt。其实没啥区别在project.properties加入proguard.cOnfig=proguard-project.txt。就可以了。proguard-project.txt文件是这样的。
这里要知道一个地方proguard.cfg是可以直接拿过来当proguard-project.txt用的。

# This file is automatically generated by Android Tools.
# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
#
# This file must be checked in Version Control Systems.
#
# To customize properties used by the Ant build system edit
# "ant.properties", and override values to adapt the script to your
# project structure.
#
# To enable ProGuard to shrink and obfuscate your code, uncomment this (available properties: sdk.dir, user.home):
# proguard.cOnfig=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt

# Project target.
target=android-19
proguard.cOnfig=proguard-project.txt
新版ADT没下面说一下android studio的使用,到了android studio中又有了不同这回没有了proguard-project.txt变成了proguard-rules.txt其实就是名字变了而已。用法一样。不同的是studio中没有了eclipse里面的project.properties或者defult.properties。而是换成了build.gradle。build.gradle中有这么一段。只要把minifyEnabled 后面的false改为true就会执行混淆代码了。
buildTypes {
release {
// minifyEnabled为true会执行proguard-rules.txt混淆代码
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}

说完了两个IDE已经不同版本之间的不同再来说一下混淆代码时候一些注意的地方

1、android studio下 jar问题

我想你应该见过下面的代码。需要知道的是这个在android studio中是不能用的如果你加了这个在编译的时候会出现
> java.io.IOException: The same input jar [D:\xx\app\libs\xx.jar] is specified twice.(我就不翻译了)在eclipse是不会有问题了

-libraryjars libs/alipaysdk.jar
-libraryjars libs/alipaysecsdk.jar
-libraryjars libs/alipayutdid.jar
-libraryjars libs/android-support-v4-21.jar

2、javabean解析为null

如果你的项目中用到了Gson。并且你的程序在混淆之后运行后发现获取了数据,但是在看解析成Gson的时候都是null,那么你就要加上下面的代码。这里要注意最后一行。这个是你javabean对象的路径

-keepattributes Signature
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.** { *; }
-keep class com.xx.xx.**{ *; }

3、微信分享问题

微信的分享或者支付相当很多程序都有接入。很多第三方sdk为了在项目混淆的时候避免自己的sdk出现问题,在开发后台会提醒开发者在混淆的时候加上自己提供的一些-keep代码。来确保混淆的时候sdk不被混淆。如果你加上下面这段代码那么蛋疼的时候就来了,我看很多开发者因为这是在网上直接说微信分享就是垃圾。微信提供的是这句。

-keep class com.tencent.mm.sdk.openapi.WXMediaMessage {*;}
-keep class com.tencent.mm.sdk.openapi.** implements com.tencent.mm.sdk.openapi.WXMediaMessage$IMediaObject {*;}
谁会想到微信官方提供的竟然不能用。因为这段代码是可以用的,不过要放到以前。微信后来更新了支付还有其他的功能之后,那么这个jar包结构就变了。我因此也是弄了半天,本来一个复制粘贴的时候搞的这么悲催换了谁都会怒一把。加上下面这两句代码就可以(不要问我为什么)

-dontwarn com.tencent.mm.**
-keep class com.tencent.mm.**{*;}

4、自定View问题

(这个问题我网上没看到和我相似情况的帖子)如果你项目中有自定义的View,那么要保持自定义View不被混淆。一般情况下网上的混淆帖子都会给出下面三个代码段中的后两个。但是我加上后两个之后仍然会出错,后来我又加上了第一个才解决了问题

-keepclasseswithmembers class * {
public (android.content.Context);
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public (android.content.Context, android.util.AttributeSet, int);
}
5、webview与js交互,方法无法调用

如果你的项目中有webView页面比且需要和android交互的话,要注意加上下面的代码。如果不加在webView页面调用android代码会不起作用。下面代码用通配符的目的是解决如果一个项目中有多个webView页面的情况

-keepattributes *JavascriptInterface*
-keepclassmembers class com.xx.activity.**$**{ //通配符标识的分别是activity的名字和类名 注意下面的事例
public *;
}
项目实例

    /**
* AndroidHtml 5J函数说明 ()
*/
final class MaiLeGouApp { // MaiLeGouApp 就是第二个通配符
@JavascriptInterface
public void XX(String xx, String xx) {

}
}

这是我在项目中遇到的一些问题,感觉这些问题听普遍的,所以写了出来,希望能帮到也在做混淆的你们。以后这篇文章还会更新。







推荐阅读
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • baresip android编译、运行教程1语音通话
    本文介绍了如何在安卓平台上编译和运行baresip android,包括下载相关的sdk和ndk,修改ndk路径和输出目录,以及创建一个c++的安卓工程并将目录考到cpp下。详细步骤可参考给出的链接和文档。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • Google在I/O开发者大会详细介绍Android N系统的更新和安全性提升
    Google在2016年的I/O开发者大会上详细介绍了Android N系统的更新和安全性提升。Android N系统在安全方面支持无缝升级更新和修补漏洞,引入了基于文件的数据加密系统和移动版本的Chrome浏览器可以识别恶意网站等新的安全机制。在性能方面,Android N内置了先进的图形处理系统Vulkan,加入了JIT编译器以提高安装效率和减少应用程序的占用空间。此外,Android N还具有自动关闭长时间未使用的后台应用程序来释放系统资源的机制。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 拥抱Android Design Support Library新变化(导航视图、悬浮ActionBar)
    转载请注明明桑AndroidAndroid5.0Loollipop作为Android最重要的版本之一,为我们带来了全新的界面风格和设计语言。看起来很受欢迎࿰ ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 如何搭建Java开发环境并开发WinCE项目
    本文介绍了如何搭建Java开发环境并开发WinCE项目,包括搭建开发环境的步骤和获取SDK的几种方式。同时还解答了一些关于WinCE开发的常见问题。通过阅读本文,您将了解如何使用Java进行嵌入式开发,并能够顺利开发WinCE应用程序。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 本文介绍了在Mac上安装Xamarin并使用Windows上的VS开发iOS app的方法,包括所需的安装环境和软件,以及使用Xamarin.iOS进行开发的步骤。通过这种方法,即使没有Mac或者安装苹果系统,程序员们也能轻松开发iOS app。 ... [详细]
  • 模块化区块链生态系统的优势概述及其应用案例
    本文介绍了相较于单体区块链,模块化区块链生态系统的优势,并以Celestia、Dymension和Fuel等模块化区块链项目为例,探讨了它们解决可扩展性和部署问题的方案。模块化区块链架构提高了区块链的可扩展性和吞吐量,并提供了跨链互操作性和主权可扩展性。开发人员可以根据需要选择执行环境,并获得奖学金支持。该文对模块化区块链的应用案例进行了介绍,展示了其在区块链领域的潜力和前景。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
author-avatar
尜艾
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有