热门标签 | 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) {

}
}

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







推荐阅读
  • 解决Only fullscreen opaque activities can request orientation错误的方法
    本文介绍了在使用PictureSelectorLight第三方框架时遇到的Only fullscreen opaque activities can request orientation错误,并提供了一种有效的解决方案。 ... [详细]
  • Android中将独立SO库封装进JAR包并实现SO库的加载与调用
    在Android开发中,将独立的SO库封装进JAR包并实现其加载与调用是一个常见的需求。本文详细介绍了如何将SO库嵌入到JAR包中,并确保在外部应用调用该JAR包时能够正确加载和使用这些SO库。通过这种方式,开发者可以更方便地管理和分发包含原生代码的库文件,提高开发效率和代码复用性。文章还探讨了常见的问题及其解决方案,帮助开发者避免在实际应用中遇到的坑。 ... [详细]
  • 本文详细介绍了如何在 Linux 系统上安装 JDK 1.8、MySQL 和 Redis,并提供了相应的环境配置和验证步骤。 ... [详细]
  • 近期,微信公众平台上的HTML5游戏引起了广泛讨论,预示着HTML5游戏将迎来新的发展机遇。磊友科技的赵霏,作为一名HTML5技术的倡导者,分享了他在微信平台上开发HTML5游戏的经验和见解。 ... [详细]
  • 在多线程并发环境中,普通变量的操作往往是线程不安全的。本文通过一个简单的例子,展示了如何使用 AtomicInteger 类及其核心的 CAS 无锁算法来保证线程安全。 ... [详细]
  • 本文介绍如何使用 Python 的 DOM 和 SAX 方法解析 XML 文件,并通过示例展示了如何动态创建数据库表和处理大量数据的实时插入。 ... [详细]
  • 1.创建目录mkdir-phomerocketmqnamesvr1data&&mkdir-phomerocketmqnamesvr1log&&mkdir-phomerocketm ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文介绍了如何利用HTTP隧道技术在受限网络环境中绕过IDS和防火墙等安全设备,实现RDP端口的暴力破解攻击。文章详细描述了部署过程、攻击实施及流量分析,旨在提升网络安全意识。 ... [详细]
  • 在软件开发过程中,经常需要将多个项目或模块进行集成和调试,尤其是当项目依赖于第三方开源库(如Cordova、CocoaPods)时。本文介绍了如何在Xcode中高效地进行多项目联合调试,分享了一些实用的技巧和最佳实践,帮助开发者解决常见的调试难题,提高开发效率。 ... [详细]
  • PTArchiver工作原理详解与应用分析
    PTArchiver工作原理及其应用分析本文详细解析了PTArchiver的工作机制,探讨了其在数据归档和管理中的应用。PTArchiver通过高效的压缩算法和灵活的存储策略,实现了对大规模数据的高效管理和长期保存。文章还介绍了其在企业级数据备份、历史数据迁移等场景中的实际应用案例,为用户提供了实用的操作建议和技术支持。 ... [详细]
  • Hyperledger Fabric 1.4 节点 SDK 快速入门指南
    本文将详细介绍如何利用 Hyperledger Fabric 1.4 的 Node.js SDK 开发应用程序。通过最新版本的 Fabric Node.js SDK,开发者可以更高效地构建和部署基于区块链的应用,实现数据的安全共享和交易处理。文章将涵盖环境配置、SDK 安装、示例代码以及常见问题的解决方法,帮助读者快速上手并掌握核心功能。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 在Java项目中,当两个文件进行互相调用时出现了函数错误。具体问题出现在 `MainFrame.java` 文件中,该文件位于 `cn.javass.bookmgr` 包下,并且导入了 `java.awt.BorderLayout` 和 `java.awt.Event` 等相关类。为了确保项目的正常运行,请求提供专业的解决方案,以解决函数调用中的错误。建议从类路径、依赖关系和方法签名等方面入手,进行全面排查和调试。 ... [详细]
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社区 版权所有