ProGuard 进阶系列(一): 运行源代码

news2025/2/22 15:40:21

在前面的文章深入 Android 混淆实践:ProGuard 通关秘籍和深入 Android 混淆实践:多模块打包爬坑之旅中,已经讲到了如何在 Android 中使用 ProGuard,以及如何自定义实现混淆规则的生成。为了更深入地理解 ProGuard 的细节,本系列文章从我感兴趣的点出发,记录在阅读 ProGuard 源码过程中的思考与启发,希望对你也有所帮助。本文为此系列文章的开篇,将最基础的讲起,使用 ProGuard 源码去实现代码混淆。

1. ProGuard 的使用

在之前的文章中,使用 ProGuard 的流程已经融入到 Android Gradle Tools 中了。除了自带的流程,我们也可以直接使用 android-sdk/tools/proguard/libs 里面的  proguard.jar 。在 android-sdk/tools/proguard/bin 下有 proguard.sh 这个可执行文件:

PROGUARD_HOME=`dirname "$0"`/..
java -jar $PROGUARD_HOME/lib/proguard.jar "$@"

可以看到,就是使用 java -jar 进行执行的,并且将参数直接透传。除了使用这个可执行脚本执行外,我们也可以直接使用如下命令直接运行:

java -jar proguard.jar [options ...]

根据使用混淆的经验,你应该可以想到,加固过程中,主要需要以下四部份内容:

  • 要被混淆的内容,如常见的 jar 包。

  • 被混淆内容的依赖库, 如 Android SDK。

  • 混淆的配置,哪些类、方法不被优化混淆处理。

  • 混淆后的输出内容。

在执行命令中,必须包含这些内容,我们可以使用以下几条参数来指定:

  • -injars  classpath,classpath 指定当前需要混淆的 jar 包,classpath 路径中支持 apk, aab, aar, war, ear, jmod, zip 以及文件夹,支持多个输入。

  • -outjars classpath,classpath 指定当前混淆后输出的 jar 包, 格式支持与 -injars 一致, 一般情况下,此处仅有一个可输出的 classpath 路径

  • -libraryJars classpath, classpath 指定依赖库,支持格式与-injars 一致,如有多个 library 依赖,写多行就可以指定

  • -include filename,filename 指定配置文件的路径,也可使用  @filename  替代

我们所编写的 混淆配置 通过 -include filename 即可指定。当然,-injars-outjars-libraryJars-keep 规则 放到同一个配置文件中,运行时,指定对应配置文件即可,使用起来更方便,比如我将配置信息写到 debug_proguard.pro 文件中,即可按如下方式进行运行:

java -jar proguard.jar @debug_proguard.pro

当写好配置后,运行如上命令,就能将混淆后的内容输出到 -outjars 指定的路径中。

2. ProGuard 源码下载与运行配置

前面的内容中,可以了解到 ProGuard 的使用,而 ProGuard 是一个开源项目,它使用的是 GPL 协议,而其还依赖了ProGuard-core ,此项目也为开源项目。为了了解其实现细节,可以将代码下载下来,如下所示:

git clone git@github.com:Guardsquare/proguard.git
git clone git@gitcode.net:mirrors/Guardsquare/proguard.git

代码下载好后,可以直接使用 Intellij IDEA 打开它并且运行起来,这样我们就可以直接进行运行调试,能够更方便的去读懂  ProGuard 中的逻辑。

在 ProGuard 代码仓库中写到,要编译源码,需要使用 JDK 8 , 此处需要注意你当前使用的 JDK 版本。

首先,要运行代码,就需要找到 main() 方法所在的类,才能执行运行。在第一节的内容中,使用 java -jar proguard.jar 就可以执行,从 jar 包中的 MANIFEST.MF 文件中,可以看到, main()  方法在 proguard.ProGuard 中, 如下图所示:

64928f071a40e09b81a8bb4085cbabdc.png
proguard.jar 中的 MANIFEST.MF 文件

在源码中,我们也能看到 proguard/ProGuard.java 的类中,正好有一个 main() 方法。在 Intellij IDEA 可以直接运行此 main 方法:

31fe3a899ffae9d10c3729a994887539.png
在 Intellij IDEA 直接运行

如果直接点击绿色的 ▶︎ ,运行肯定会报错。在这里,我们还需要手动将第一部分中使用的 debug_proguard.pro 文件路径放到参数列表中去,具体操作方法如下图所示:

dc9f20fb49d7541767a6adb3dfa7a32b.png
Intellij IDEA 中参数配置

配置完成后,直接点击 Intellij IDEA 中的  ▶︎ ,输出的产物与用命令行执行出来的结果一致。

3. 结语

当拿到源码后,第一步就是将源码跑起来,这能够有助于我们对源码理解,以及后续分析源码时进行调试。本文内容很简单,但纸上得来终觉浅,绝知此事要躬行。朋友们可以自己去将源码下载下来,并使用你所熟知的 IDE 将其运行起来,相信你也有很多的收获,也欢迎各位与我交流。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/630429.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python3数据分析与挖掘建模(11)复合分析-分组分析与实现示例

1. 分组分析 1.1 概述 分组与钻取是数据分析中常用的技术,用于对数据进行聚合和细分分析。它可以帮助我们从整体数据中获取特定维度的汇总信息,并进一步钻取到更详细的子集数据中进行深入分析。 分组(Grouping)是指根据某个或多…

chatgpt赋能python:Python怎么写绝对值

Python怎么写绝对值 在Python编程语言中,有很多常用函数。其中包括求绝对值的函数。在这篇文章中,我们将介绍如何在Python中使用绝对值函数,并提供一些示例。 什么是绝对值函数? 绝对值函数是一个数学中常用的函数,…

WPF开发txt阅读器4:字体控件绑定

文章目录 控件折叠字体尺寸绑定选择字体字体的中文名称 txt阅读器系列: 需求分析和文件读写目录提取类💎列表控件与目录 控件折叠 作为一个txt阅读器,至少能够设置文字字体、尺寸,段落行间距等,还得有护眼模式等一系…

2023 年最新版Java面试题及答案整理(完整版,超详细)

程序员一步入中年,不知不觉便会被铺天盖地的“危机感”上身,曾经的那个少年已经不在,时间就是这样公平。就算你能发明Java语言,随着时间的推移,你注定还是要成为慢慢变蔫的茄子,缓缓变黑的葡萄。 看着金九…

支付宝商家多个账号下的账单管理工具配置指南

大家好,我是小悟 阅读这篇文章之前,结合这篇【有了这个工具,支付宝商家多个账号下的账单管理更方便了】干货食用更佳。 商户管理 这里录入的是商家应用相关信息 商户名称:应用id所属的应用名称。 应用id:支付宝开放…

Django新手必看:如何创建应用和定义数据表。(详细讲解)

Django新手必看:如何创建应用和定义数据表。 1. Django创建应用1.1 创建应用1.2 应用的添加 2. Django ORM2.1 定义数据表2.2 定义项目数据表2.3 通用字段选项2.4 外键使用2.5 应用数据库迁移 🏘️🏘️个人简介:以山河作礼。 &…

json-server操作restful

1.安装Node.js 默认已经内置npm&#xff0c;下载对应软件包直接安装即可。nodejs的官网 命令 描述 指令解释npm -v查看版本npm install <模块名>安装模块npm list查看所有全局安装的模块npm list -g查看某个模块的版本号npm install --save <模块名>在package.js…

【大模型】开源大模型汇总以及微调策略

目录 前言LLaMAstanford AlpacaGuanacoVicunaChinese-LLaMA-AlpacaChinese-VicunaLuotuo-Chinese FalconOpenBuddy-Falcon ChatGLM && VisualGLMMOSSAquilaPandaGPTTigerBot模型微调策略LoRAQLORAP-tuningv2 前言 自从ChatGPT出世以来&#xff0c;各个大厂/研究院都纷…

Hugging News #0609: 最新代码生成模型 StarCoder+ 和 StarChat Beta 重磅发布!

每一周&#xff0c;我们的同事都会向社区的成员们发布一些关于 Hugging Face 相关的更新&#xff0c;包括我们的产品和平台更新、社区活动、学习资源和内容更新、开源库和模型更新等&#xff0c;我们将其称之为「Hugging News」&#xff0c;本期 Hugging News 有哪些有趣的消息…

SG90舵机介绍

SG90舵机简介 SG90舵机是一种位置&#xff08;角度&#xff09;伺服的驱动器&#xff0c;适用于那些需要角度不断变化并可以保持的控制系统。在机器人机电控制系统中&#xff0c;舵机控制效果是性能的重要影响因素。舵机可以在微机电系统和航模中作为基本的输出执行机构&#x…

耗时一个月,整理了这份大厂Java面试 / 学习指南,共计1500+ 题全面解析

程序员一步入中年&#xff0c;不知不觉便会被铺天盖地的“危机感”上身&#xff0c;曾经的那个少年已经不在&#xff0c;时间就是这样公平。就算你能发明 Java 语言&#xff0c;随着时间的推移&#xff0c;你注定还是要成为慢慢变蔫的茄子&#xff0c;缓缓变黑的葡萄。 看着金…

AI不能做什么?

什么是非人工智能 每个行业都需要的 3 种人为驱动的决策能力 布兰代斯马歇尔 支持统计数据的研究报告预计高度依赖AI的未来。 • 2018年,麦肯锡全球研究院发布了一份《工作未来报告》,估计到2030年,全球将有4亿人被AI系统、工具和平台取代。 • 2023年3月,高盛发布了其《全球经…

Typora安装使用

Typora安装使用 1、概述 因为本人电脑是Mac笔记本&#xff0c;所以本文介绍下Mac M1芯片下Typora的安装使用以及在线插件的安装。 2、安装Typora 下载Typora 1.5.8&#xff1a;下载 Typora 1.5.8 - 马可菠萝 完成安装。 自定义下载喜欢的主题&#xff1a;点击文件->偏好…

day10——线性回归的改进之岭回归

线性回归的改进之岭回归 一、过拟合和欠拟合二、正则化类别三、岭回归四、实操&#xff1a;波士顿房价预测 一、过拟合和欠拟合 1&#xff0c;欠拟合 如下所示&#xff0c;机器学习到的天鹅特征太少了&#xff0c;导致区分标准太粗糙&#xff0c;不能准确识别出天鹅。 2&…

asp.net归宿管理系统VS开发sqlserver数据库web结构c#编程Microsoft Visual Studio

一、源码特点 asp.net归宿管理系统 是一套完善的web设计管理系统&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为vs2010&#xff0c;数据库为sqlserver2008&#xff0c;使用c#语言开发 asp.net归宿管理系统VS开发sqlserver数…

Android垃圾分类助手APP(Java+Android Studio+SQLite)

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;69垃圾 获取完整源码源文件说明文档报告数据库文件等 开发运行环境 开发语言&#xff1a;Java 开发工具&#xff1a;Android Studio 模拟器&#xff1a;雷电模拟器9 数据库&#xff1a;SQLite 使用的核心类及组件 Activ…

广告数仓:采集通道创建

系列文章目录 广告数仓&#xff1a;采集通道创建 文章目录 系列文章目录前言一、环境和模拟数据准备1.hadoop集群2.mysql安装3.生成曝光测试数据 二、广告管理平台数据采集1.安装DataX2.上传脚本生成器3.生成传输脚本4.编写全量传输脚本 三、曝光点击检测数据采集1.安装Zookee…

CentOS6.10上离线安装ClickHouse19.9.5.36并修改默认数据存储目录

背景 在一台装有 CentOS6.10 操作系统的主机上安装 ClickHouse &#xff08;其实本来计划是先安装 Docker &#xff0c;然后在 Docker 中快速启动 ClickHouse 的&#xff0c;但是由于 CentOS6 对 Docker 支持不好&#xff0c;就直接在系统上装 ClickHouse 吧&#xff09;&…

jvm 命令和工具, jvm 堆 内存泄露 fullgc

目录 堆太大? 堆内存分析工具 MAT JProfiler ZProfiler - 线上的mat - 已进化为Grace EagleEye-MProf - 命令行 jhat jvisual 问题 w使用JProfiler和MAT打开内存超大的hprof文件时报错的解决方案_hprof太大_CoderBruis的博客-CSDN博客 很简单,把jvm参数调整下,设置小…

vue3---模板引用 nextTick

目录 模板引用--ref 访问模板引用 v-for 中的模板引用 函数模板引用 组件上的 ref 简单理解Vue中的nextTick 示例 二、应用场景 三、nextTick源码浅析 实战 --- vue3实现编辑与查看功能 模板引用--ref 虽然 Vue 的声明性渲染模型为你抽象了大部分对 DOM 的直接操作&…