ant+proguard签名打包 .jar
ant+proguard签名打包 .jar
摘自: https://blog.csdn.net/a_ycmbc/article/details/53432812
很久没有更新了,最近做了个小功能,想把代码打成 .jar文件给别人引用。除了基本的调用方法,其余核心代码都经过混淆打包。用到了ant+proguard,这里记录一下。
ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。常常用于Android开发用于混淆最终的项目,增加项目被反编译的难度。android的sdk中已经有此工具,在sdk\tools\proguard\lib\proguardgui.jar,打包是可以直接用此工具混淆,只是流程比较复杂,需要手动更改其中的配置。如图:
Ant是Apache软件基金会JAKARTA目录中的一个子项目,它有以下的优点。跨平台性。Ant是纯Java语言编写的,所以具有很好的跨平台性。操作简单。Ant是由一个内置任务和可选任务组成的。Ant运行时需要一个XML文件(构建文件)。 Ant通过调用target树,就可以执行各种task。每个task实现了特定接口对象。由于Ant构建文件 是XML格式的文件,所以很容易维护和书写,而且结构很清晰。Ant可以集成到开发环境中。由于Ant的跨平台性和操作简单的特点,它很容易集成到一些开发环境中去。
安装和配置环境变量
到官方主页http://ant.apache.org下载新版的ant,得到的是一个apache-ant-bin.zip的压缩包。将其解压到你的硬盘上。
window中设置ant环境变量:
ANT_HOME C:/ apache-ant-1.8.1
path C:/ apache-ant-1.8.1/bin
classpath C:/apache-ant-1.8.1/lib
测试是否配置成功
ant执行需要一个build文件,此次项目用到的build文件配置
<?xml version="1.0" encoding="UTF-8"?>
<project
name="ProjectName"
basedir="."
default="optimize_class" >
<!-- 设置全局属性 -->
<property file="project.properties" />
<property environment="env" />
<property name="encode" value="utf-8"/>
<property name="debug" value="false"/>
<property name="includeAntRuntime" value="false"/>
<property name="target_version" value="1.7"/>
<property name="src_dir" value="${basedir}\src"/>
<!--
========================================
工程构建目录
========================================
-->
<property name="build_dir" value="${basedir}\build" />
<property name="java_build_dir" value="${build_dir}\java" />
<property name="class_build_dir" value="${build_dir}\class" />
<property name="jar_build_dir" value="${build_dir}\jar"/>
<property name="unOptimize_jar_build_dir" value="${jar_build_dir}\unOptimize.jar"/>
<!--
========================================
构建完成文件
========================================
-->
<property name="release_jar_dir" value="${basedir}\${releaseJar}"/>
<!-- 声明第三方依赖的jar -->
<path id="dependencies">
<fileset dir="${basedir}\libs">
<include name="**/*.jar" />
</fileset>
</path>
<!-- 引入Android依赖 -->
<property
name="lib.android"
value="${sdk.dir}\platforms\${target}\android.jar" />
<!-- 引入混淆依赖 -->
<property
name="lib.proguard"
value="E:\adt-bundle-windows-x86_64-20140702\sdk\tools\proguard\lib\proguard.jar" />
<!-- dx命令(当前系统为windows,如果系统为linux,可将.bat文件替换成相对应的命令) -->
<property
name="dx"
value="${sdk.dir}\build-tools\24.0.1\dx.bat" />
<!-- 拆分java文件-->
<target name="init">
<mkdir dir="${build_dir}" />
<mkdir dir="${java_build_dir}" />
<mkdir dir="${class_build_dir}" />
<mkdir dir="${jar_build_dir}" />
</target>
<!-- 拆分java文件 -->
<target name="separate_java" depends="init">
<copy todir="${java_build_dir}" >
<fileset dir="${src_dir}" >
<include name="com/project/package/*.java" />
</fileset>
</copy>
</target>
<!-- 编译java文件 -->
<target name="compile_java" depends="separate_java" >
<javac
bootclasspath="${lib.android}"
debug="${debug}"
destdir="${class_build_dir}"
encoding="${encode}"
includeAntRuntime="${includeAntRuntime}"
srcdir="${java_build_dir}"
target="${target_version}">
<classpath refid="dependencies" />
</javac>
</target>
<!-- 混淆class文件 -->
<target
name="optimize_class"
depends="compile_java" >
<!-- class文件生成jar包 -->
<jar destfile="${unOptimize_jar_build_dir}" >
<fileset
dir="${class_build_dir}"
includes="**/*.class" />
</jar>
<!-- jar包进行混淆 -->
<java
failonerror="true"
fork="true"
jar="${lib.proguard}" >
<jvmarg value="-Dmaximum.inlined.code.length=32" />
<arg value="-injars ${unOptimize_jar_build_dir}"/>
<arg value="-outjars ${release_jar_dir}"/>
<arg value="-libraryjars ${lib.android}"/>
<arg value="-dontpreverify"/>
<arg value="-dontoptimize"/>
<arg value="-dontusemixedcaseclassnames"/>
<arg value="-allowaccessmodification"/>
<arg value="-optimizationpasses 7"/>
<arg value="-verbose"/>
<arg value="-dontskipnonpubliclibraryclasses"/>
<arg value="-dontskipnonpubliclibraryclassmembers"/>
<arg value="@${proguard.cfg}"/>
</java>
<!-- 删除构建目录 -->
<delete dir="${build_dir}"/>
</target>
</project>
常用基本配置不用管,注意其中几个地方:
1. <property file="project.properties" /> 指定文件,设置全局属性
2.<property name="encode" value="utf-8"/> 项目的编码格式
3.<property name="target_version" value="1.7"/> java的jdk版本
4. <include name="com/project/package/*.java" /> 需要混淆的java类,这里是将package包下面的所有类都混淆,可以根据自己的项目结构更改此处。
build.xml常用标签说明:
# 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.
sdk.dir=E:\\adt-bundle-windows-x86_64-20140702\\sdk
target=android-17
android.library=false
proguard.cfg=proguard.cfg
releaseJar=output.jar
-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-dontwarn
-dontnote
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-dump proguard/class_files.txt
-printseeds proguard/seeds.txt
-printusage proguard/unused.txt
-printmapping proguard/mapping.txt
-keep public class * extends android.app.Activity
-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 * extends android.app.backup.BackupAgentHelper
-keep public class * extends android.preference.Preference
-keep public class com.android.vending.licensing.ILicensingService
-keep public class com.gn.qiaw.mn.Entry {
public static <methods>;
}
-keep public class com.gn.qiaw.mn.PayCallBack {
public <methods>;
}
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
}
-keepclassmembers class * extends android.app.Activity {
public void *(android.view.View);
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
最后,添加proguard文件夹,拷入需要引用的文件proguard.jar,proguardgui.jar,retrace.jar
-keep public class com.gn.qiaw.mn.Entry {
public static <methods>;
}
-keep public class com.gn.qiaw.mn.PayCallBack {
public <methods>;
}
Dx unsupported class file version 52.0
Conversion to Dalvik format failed with error 1
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)