Java代码混淆(把类和变量混淆成诸如abcdefg的样子)

Android-混淆学习 前言 今天对项目进行了混淆配置,一直没开启项目混淆,深感可耻,当然有对项目进行加固。前面迟迟不肯行动,畏惧于他人的错误经验,说是混淆出现的坑,这种旁人的意识观,真是害人不浅,其实敢于“对症下药”的去解决,不会花很多时间。 在此我只是抛砖引玉,更高级的混淆知识,可以看如下文章 一篇文章带你领略Android混淆的魅力 在Android Studio中的混淆debug与release https://zhuanlan.zhihu.com/p/49098044 https://www.jianshu.com/p/ 阅读详情

首先下载混淆工具:
http://proguard.sourceforge.net/downloads.html
如果你是初学者,又急于使用混淆功能,不用去找其他什么工具了,就这个就够了。
第一步:将我们的代码从eclipse中以普通export的方式导出成一个jar包,只导出src中的代码,其他钩全部去掉,右边的那些资源文件什么的也要去掉钩。导出之后放在桌面,直到混淆完成之前都不要移动这个jar包。
这里写图片描述

第二步:打开我们的混淆工具之后,点击Input/Output,然后Add Input,选择我们刚才export的那个jar,然后点击Add Output,选择混淆之后的jar输出路径和文件名,这里也放在桌面。
这里写图片描述

第三步,在桌面新建一个lib文件夹,将我们在第一步里标注的libs里面引用到的jar全部找出来,放在桌面的lib文件夹里。然后点击右边的Add,将这些jar文件添加进去。
这里写图片描述

第四步,点击process,然后点击save configuration,保存配置文件到桌面。然后编辑这个文件,添加:

-optimizationpasses 5          # 指定代码的压缩级别
-dontusemixedcaseclassnames   # 是否使用大小写混合
-dontpreverify           # 混淆时是否做预校验
-verbose                # 混淆时是否记录日志

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  # 混淆时所采用的算法
-keep class com.vzone.tmdsdk.TMDAgent {*;}#不要混淆我们的入口类
-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    # 保持哪些类不被混淆

保存该配置文件
第五步, 点击Proguard按钮,点击Load configration按钮,导入上面配置好的混淆文件。点击左边的Process,点击右下角的Process!,直到完成,搞定。

完整配置文件参考:

-injars tmdsdk.jar
-outjars tmdsdk-mixed.jar

-libraryjars 'D:\software\jdk\jre\lib\rt.jar'
-libraryjars lib\android-support-v4.jar
-libraryjars lib\android.jar

-optimizationpasses 5          # 指定代码的压缩级别
-dontusemixedcaseclassnames   # 是否使用大小写混合
-dontpreverify           # 混淆时是否做预校验
-verbose                # 混淆时是否记录日志

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*  # 混淆时所采用的算法
-keep class com.vzone.tmdsdk.TMDAgent {*;}
-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    # 保持哪些类不被混淆

-keepclasseswithmembernames class * {  # 保持 native 方法不被混淆
    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 * {     # 保持枚举 enum 类不被混淆
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable { # 保持 Parcelable 不被混淆
    public static final android.os.Parcelable$Creator *;
}

# Keep - Applications. Keep all application classes, along with their 'main'
# methods.
-keepclasseswithmembers public class * {
    public static void main(java.lang.String[]);
}

# Also keep - Enumerations. Keep the special static methods that are required in
# enumeration classes.
-keepclassmembers enum  * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

# Also keep - Database drivers. Keep all implementations of java.sql.Driver.
-keep class * extends java.sql.Driver

# Also keep - Swing UI L&F. Keep all extensions of javax.swing.plaf.ComponentUI,
# along with the special 'createUI' method.
-keep class * extends javax.swing.plaf.ComponentUI {
    public static javax.swing.plaf.ComponentUI createUI(javax.swing.JComponent);
}

# Keep names - Native method names. Keep all native class/method names.
-keepclasseswithmembers,includedescriptorclasses,allowshrinking class * {
    native <methods>;
}

# Remove - System method calls. Remove all invocations of System
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.System {
    public static long currentTimeMillis();
    static java.lang.Class getCallerClass();
    public static int identityHashCode(java.lang.Object);
    public static java.lang.SecurityManager getSecurityManager();
    public static java.util.Properties getProperties();
    public static java.lang.String getProperty(java.lang.String);
    public static java.lang.String getenv(java.lang.String);
    public static java.lang.String mapLibraryName(java.lang.String);
    public static java.lang.String getProperty(java.lang.String,java.lang.String);
}

# Remove - Math method calls. Remove all invocations of Math
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.Math {
    public static double sin(double);
    public static double cos(double);
    public static double tan(double);
    public static double asin(double);
    public static double acos(double);
    public static double atan(double);
    public static double toRadians(double);
    public static double toDegrees(double);
    public static double exp(double);
    public static double log(double);
    public static double log10(double);
    public static double sqrt(double);
    public static double cbrt(double);
    public static double IEEEremainder(double,double);
    public static double ceil(double);
    public static double floor(double);
    public static double rint(double);
    public static double atan2(double,double);
    public static double pow(double,double);
    public static int round(float);
    public static long round(double);
    public static double random();
    public static int abs(int);
    public static long abs(long);
    public static float abs(float);
    public static double abs(double);
    public static int max(int,int);
    public static long max(long,long);
    public static float max(float,float);
    public static double max(double,double);
    public static int min(int,int);
    public static long min(long,long);
    public static float min(float,float);
    public static double min(double,double);
    public static double ulp(double);
    public static float ulp(float);
    public static double signum(double);
    public static float signum(float);
    public static double sinh(double);
    public static double cosh(double);
    public static double tanh(double);
    public static double hypot(double,double);
    public static double expm1(double);
    public static double log1p(double);
}

# Remove - Number method calls. Remove all invocations of Number
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.* extends java.lang.Number {
    public static java.lang.String toString(byte);
    public static java.lang.Byte valueOf(byte);
    public static byte parseByte(java.lang.String);
    public static byte parseByte(java.lang.String,int);
    public static java.lang.Byte valueOf(java.lang.String,int);
    public static java.lang.Byte valueOf(java.lang.String);
    public static java.lang.Byte decode(java.lang.String);
    public int compareTo(java.lang.Byte);
    public static java.lang.String toString(short);
    public static short parseShort(java.lang.String);
    public static short parseShort(java.lang.String,int);
    public static java.lang.Short valueOf(java.lang.String,int);
    public static java.lang.Short valueOf(java.lang.String);
    public static java.lang.Short valueOf(short);
    public static java.lang.Short decode(java.lang.String);
    public static short reverseBytes(short);
    public int compareTo(java.lang.Short);
    public static java.lang.String toString(int,int);
    public static java.lang.String toHexString(int);
    public static java.lang.String toOctalString(int);
    public static java.lang.String toBinaryString(int);
    public static java.lang.String toString(int);
    public static int parseInt(java.lang.String,int);
    public static int parseInt(java.lang.String);
    public static java.lang.Integer valueOf(java.lang.String,int);
    public static java.lang.Integer valueOf(java.lang.String);
    public static java.lang.Integer valueOf(int);
    public static java.lang.Integer getInteger(java.lang.String);
    public static java.lang.Integer getInteger(java.lang.String,int);
    public static java.lang.Integer getInteger(java.lang.String,java.lang.Integer);
    public static java.lang.Integer decode(java.lang.String);
    public static int highestOneBit(int);
    public static int lowestOneBit(int);
    public static int numberOfLeadingZeros(int);
    public static int numberOfTrailingZeros(int);
    public static int bitCount(int);
    public static int rotateLeft(int,int);
    public static int rotateRight(int,int);
    public static int reverse(int);
    public static int signum(int);
    public static int reverseBytes(int);
    public int compareTo(java.lang.Integer);
    public static java.lang.String toString(long,int);
    public static java.lang.String toHexString(long);
    public static java.lang.String toOctalString(long);
    public static java.lang.String toBinaryString(long);
    public static java.lang.String toString(long);
    public static long parseLong(java.lang.String,int);
    public static long parseLong(java.lang.String);
    public static java.lang.Long valueOf(java.lang.String,int);
    public static java.lang.Long valueOf(java.lang.String);
    public static java.lang.Long valueOf(long);
    public static java.lang.Long decode(java.lang.String);
    public static java.lang.Long getLong(java.lang.String);
    public static java.lang.Long getLong(java.lang.String,long);
    public static java.lang.Long getLong(java.lang.String,java.lang.Long);
    public static long highestOneBit(long);
    public static long lowestOneBit(long);
    public static int numberOfLeadingZeros(long);
    public static int numberOfTrailingZeros(long);
    public static int bitCount(long);
    public static long rotateLeft(long,int);
    public static long rotateRight(long,int);
    public static long reverse(long);
    public static int signum(long);
    public static long reverseBytes(long);
    public int compareTo(java.lang.Long);
    public static java.lang.String toString(float);
    public static java.lang.String toHexString(float);
    public static java.lang.Float valueOf(java.lang.String);
    public static java.lang.Float valueOf(float);
    public static float parseFloat(java.lang.String);
    public static boolean isNaN(float);
    public static boolean isInfinite(float);
    public static int floatToIntBits(float);
    public static int floatToRawIntBits(float);
    public static float intBitsToFloat(int);
    public static int compare(float,float);
    public boolean isNaN();
    public boolean isInfinite();
    public int compareTo(java.lang.Float);
    public static java.lang.String toString(double);
    public static java.lang.String toHexString(double);
    public static java.lang.Double valueOf(java.lang.String);
    public static java.lang.Double valueOf(double);
    public static double parseDouble(java.lang.String);
    public static boolean isNaN(double);
    public static boolean isInfinite(double);
    public static long doubleToLongBits(double);
    public static long doubleToRawLongBits(double);
    public static double longBitsToDouble(long);
    public static int compare(double,double);
    public boolean isNaN();
    public boolean isInfinite();
    public int compareTo(java.lang.Double);
    public byte byteValue();
    public short shortValue();
    public int intValue();
    public long longValue();
    public float floatValue();
    public double doubleValue();
    public int compareTo(java.lang.Object);
    public boolean equals(java.lang.Object);
    public int hashCode();
    public java.lang.String toString();
}

# Remove - String method calls. Remove all invocations of String
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.String {
    public static java.lang.String copyValueOf(char[]);
    public static java.lang.String copyValueOf(char[],int,int);
    public static java.lang.String valueOf(boolean);
    public static java.lang.String valueOf(char);
    public static java.lang.String valueOf(char[]);
    public static java.lang.String valueOf(char[],int,int);
    public static java.lang.String valueOf(double);
    public static java.lang.String valueOf(float);
    public static java.lang.String valueOf(int);
    public static java.lang.String valueOf(java.lang.Object);
    public static java.lang.String valueOf(long);
    public boolean contentEquals(java.lang.StringBuffer);
    public boolean endsWith(java.lang.String);
    public boolean equalsIgnoreCase(java.lang.String);
    public boolean equals(java.lang.Object);
    public boolean matches(java.lang.String);
    public boolean regionMatches(boolean,int,java.lang.String,int,int);
    public boolean regionMatches(int,java.lang.String,int,int);
    public boolean startsWith(java.lang.String);
    public boolean startsWith(java.lang.String,int);
    public byte[] getBytes();
    public byte[] getBytes(java.lang.String);
    public char charAt(int);
    public char[] toCharArray();
    public int compareToIgnoreCase(java.lang.String);
    public int compareTo(java.lang.Object);
    public int compareTo(java.lang.String);
    public int hashCode();
    public int indexOf(int);
    public int indexOf(int,int);
    public int indexOf(java.lang.String);
    public int indexOf(java.lang.String,int);
    public int lastIndexOf(int);
    public int lastIndexOf(int,int);
    public int lastIndexOf(java.lang.String);
    public int lastIndexOf(java.lang.String,int);
    public int length();
    public java.lang.CharSequence subSequence(int,int);
    public java.lang.String concat(java.lang.String);
    public java.lang.String replaceAll(java.lang.String,java.lang.String);
    public java.lang.String replace(char,char);
    public java.lang.String replaceFirst(java.lang.String,java.lang.String);
    public java.lang.String[] split(java.lang.String);
    public java.lang.String[] split(java.lang.String,int);
    public java.lang.String substring(int);
    public java.lang.String substring(int,int);
    public java.lang.String toLowerCase();
    public java.lang.String toLowerCase(java.util.Locale);
    public java.lang.String toString();
    public java.lang.String toUpperCase();
    public java.lang.String toUpperCase(java.util.Locale);
    public java.lang.String trim();
}

# Remove - StringBuffer method calls. Remove all invocations of StringBuffer
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.StringBuffer {
    public java.lang.String toString();
    public char charAt(int);
    public int capacity();
    public int codePointAt(int);
    public int codePointBefore(int);
    public int indexOf(java.lang.String,int);
    public int lastIndexOf(java.lang.String);
    public int lastIndexOf(java.lang.String,int);
    public int length();
    public java.lang.String substring(int);
    public java.lang.String substring(int,int);
}

# Remove - StringBuilder method calls. Remove all invocations of StringBuilder
# methods without side effects whose return values are not used.
-assumenosideeffects public class java.lang.StringBuilder {
    public java.lang.String toString();
    public char charAt(int);
    public int capacity();
    public int codePointAt(int);
    public int codePointBefore(int);
    public int indexOf(java.lang.String,int);
    public int lastIndexOf(java.lang.String);
    public int lastIndexOf(java.lang.String,int);
    public int length();
    public java.lang.String substring(int);
    public java.lang.String substring(int,int);
}

参考链接:http://blog.youkuaiyun.com/android_panda/article/details/18604121#comments

Unidbg Trace实战:动态还原OLLVM控制流平坦化混淆算法 在安卓应用安全分析和算法逆向领域,动态分析技术是破解复杂混淆的关键手段。其核心原理在于通过模拟执行目标代码,实时捕获并记录其运行时行为,从而绕过静态分析难以处理的代码变形和保护。这项技术的核心价值在于能够穿透如OLLVM控制流平坦化等高级混淆,直接观测到程序的实际执行流与数据变换过程。在常见的应用场景中,如加密算法还原、协议分析和漏洞挖掘,动态追踪能有效揭示被混淆掩盖的核心逻辑。本文聚焦于利用Unidbg模拟执行框架的Trace功能,结合对寄存器状态和内存访问模式的精细分析,实战演示如何从海量执行日志中,系 阅读详情

相关推荐

Spring Boot配置文件加密实战:用Jasypt 3.0.5保护你的数据库密码(附完整配置流程)

本文详细介绍了如何使用Jasypt 3.0.5对Spring Boot配置文件中的敏感数据进行加密,特别是数据库密码的保护。通过完整的配置流程和实战案例,帮助开发者快速集成Jasypt,确保生产环境的安全性。文章还涵盖了密钥管理、多环境配置技巧以及常见问题的解决方案,是Spring Boot项目安全加固的实用指南。

weixin_33670713的博客 695

关于代码混淆,看这篇就够了

可对IOS ipa 文件的代码,代码库,资源文件等进行混淆保护。如果先混淆,DplDbtransferApplication类名被修改的话(比如为A.class),该配置将会无效,所有代码都会被 shrink 删除,因为已经找不到DplDbtransferApplication这个类了(类名被修改)。-- 其他属性( language-conformity ,overload-enabled,obfuscation-prefix,digests,expose-attributes)请参考官方文档。

博客简介 3718

抖音私信接口reuqest_sign签名逆向分析:从抓包到算法还原实战

在移动应用安全与API接口设计中,签名机制是保障请求合法性与数据完整性的核心技术,其原理通常基于哈希算法(如MD5、SHA256)或HMAC,对请求参数进行特定规则处理后生成唯一标识。这项技术的核心价值在于防止请求被篡改和伪造,是构建安全通信的基石,广泛应用于用户认证、支付、数据提交等关键场景。以抖音企业版私信接口为例,其reuqest_sign参数正是这一机制的典型实现。通过动态插桩工具Frida进行Hook,结合静态反编译工具Jadx和IDA Pro对SO库进行深度分析,可以逆向出签名算法的完整逻辑,包

weixin_33957648的博客 418

ProGuard详解 - Java代码混淆

proGuard简介及使用proGuard工具加密混淆java的jar文件的过程示例

weixin_44462773的博客 3万+

Java前后端AES加密交互实战:从原理到Spring Boot实现

在前后端分离架构中,数据传输安全是保障用户隐私和业务完整性的基石。对称加密算法作为数据加密的核心技术,通过使用同一密钥进行加解密,在性能与安全性之间取得了良好平衡。AES(高级加密标准)作为目前最广泛采用的对称加密算法,以其高安全性和高效率成为保护敏感信息的首选。其技术价值在于能够有效防止数据在传输过程中被窃取或篡改,尤其适用于用户登录、支付交易等关键业务场景。在实际工程实践中,结合Java后端与JavaScript前端实现AES加密交互,需要重点关注密钥管理、工作模式选择和异常处理等环节。通过Spring

weixin_33698823的博客 356

Wireshark实战:解密Shiro反序列化与JWT攻击的流量特征与防御

在Web安全领域,理解网络协议层面的攻击原理是构建有效防御的基础。反序列化漏洞和身份验证机制缺陷是常见的高危风险点,攻击者常利用这些弱点实施入侵。通过流量分析技术,安全人员可以深入洞察攻击行为,将抽象的威胁转化为可视化的数据证据。Wireshark作为主流的网络协议分析工具,能够捕获和解析原始数据包,帮助识别攻击流量中的特定模式。例如,针对Apache Shiro框架的反序列化攻击,会在HTTP Cookie中留下特征明显的rememberMe字段;而JWT攻击则可能表现为算法篡改或令牌伪造。掌握这些流量特

weixin_33827731的博客 392

ProGuard-Java代码混淆(把类和变量混淆成诸如abcdefg的样子)

首先下载混淆工具: http://proguard.sourceforge.net/downloads.html  如果你是初学者,又急于使用混淆功能,不用去找其他什么工具了,就这个就够了。  第一步:将我们的代码从eclipse中以普通export的方式导出成一个jar包,只导出src中的代码,其他钩全部去掉,右边的那些资源文件什么的也要去掉钩。导出之后放在桌面,直到混淆完成之前都不要移动这个j...

xiao190128的专栏 6846

逆向解析动态API签名:从Oklink X-Apikey生成机制看HMAC安全设计

在Web API安全领域,动态签名是保障接口认证与防重放攻击的核心技术。其原理通常基于HMAC(哈希消息认证码)算法,结合时间戳、随机数与请求参数生成唯一签名,替代静态API Key以提升安全性。从技术价值看,这种机制确保了请求的完整性、时效性与不可抵赖性,广泛应用于金融、区块链及高安全要求的开放平台。在应用场景中,开发者常需对接第三方数据接口,但遇到类似Oklink的动态X-Apikey时,需通过逆向分析理解其生成逻辑。本文以Oklink为例,通过浏览器开发者工具进行代码定位与调试,详解如何从混淆的Jav

weixin_34416754的博客 963

前端代码保护实战:从混淆到加密,守护你的网页源码

在Web开发中,前端代码保护是一个重要的工程实践课题。其核心原理在于通过技术手段增加代码的逆向分析和直接复制的难度,而非实现绝对加密。从概念上讲,这主要涉及代码混淆与访问控制。代码混淆通过重命名变量、删除格式、控制流扁平化等技术,在不影响功能的前提下大幅降低代码可读性,有效提升破解成本。其技术价值在于以极低的性能开销,为业务逻辑和核心算法提供基础防护,尤其适用于防止自动化抓取和初级抄袭。在实际应用场景中,开发者常结合构建工具链,对JavaScript模块进行自动化混淆处理。例如,使用Webpack集成Ter

weixin_34342207的博客 579

Frida与Unidbg实战:逆向分析移动端API签名算法

在移动应用安全与数据通信领域,API签名是保障请求合法性、防止数据篡改与重放攻击的核心安全机制。其原理通常基于哈希算法(如MD5、SHA系列)或消息认证码(HMAC),对请求参数、时间戳及密钥进行特定组合与计算,生成唯一的身份凭证。这项技术的价值在于为客户端与服务器间的通信建立了可信验证层,广泛应用于金融支付、社交网络、电商平台等涉及敏感数据交互的场景。本文聚焦于**Frida动态注入**与**Unidbg模拟执行**两大逆向工程利器的协同运用,通过一个完整案例,系统演示如何定位、分析并最终复现一个典型移动

weixin_34199335的博客 396

【项目实战】Java代码反编译工具的使用 以及 如何对Java代码进行混淆?

现在交付给客户的代码,虽然不是以源码的形式交付,但是还经常会需要进行反编译,如何更好的做到反编译呢?本文探讨的是如何进行反编译的方法。

奶爸的编程之路,也就一周冷个三天 3499

浅谈java中的equals和==

对于初学JavaSE的同学们来说,equals和==可谓是一对十分容易混淆的概念。他们两个之间如何区分和比较呢?下面我们通过代码示例来说明: 一."==" public class Test{ public static void main(String[] args){ int a = 100; int b = 100; float ...

程小白的博客 269

我设计的Java代码混淆解决方案

特别声明:本文是博主阅读大量硕博论文和知网文献后原创,非公司内部解决方案。 一 、代码混淆方案图 各模块功能简介: 程序预处理分析:对原应用程序进行程序分析预处理,为后续混淆奠定结构基础。 布局混淆模块:对代码中有意义的标识符进行重命名。 控制流混淆模块:对程序进行控制流混淆,包括插入多余的分支路径、压扁控制流、强化不透明谓词。 字符串混淆模块:加密隐藏代码中的常量字符串。 混淆算法库:对程序的混淆处理主要依靠混淆算法库支撑,算法库中包含一系列的基本块混淆算法。混淆算法...

武天旭的博客 7138

HTTP接口RSA加密实战:从原理到Python/Java代码实现

在公网数据传输中,保障数据的机密性与完整性是核心安全需求。非对称加密算法,如RSA,通过公钥加密、私钥解密的原理,为数据在不可信信道中的安全传输提供了基础保障。其技术价值在于能够实现安全的密钥交换与数字签名,是构建HTTPS、数字证书等安全体系的基石。在实际工程中,RSA常被应用于对敏感字段(如支付令牌、会话密钥)进行端到端加密,或作为混合加密体系的关键组件,以应对金融、物联网等场景下的合规与强化保护需求。本文聚焦于HTTP接口对接这一具体应用场景,深入剖析了RSA直接加密模式的实现细节,包括密钥管理、PK

weixin_30561177的博客 410

Java基础知识面试题(2026版)

序列号 内容 链接 1 Java基础知识面试题(2022版) 待续… 2 Java集合容器面试题(2022版) 待续… 3 Java异常面试题(2022版) 待续… 4 并发编程面试题 (2022版) 待续… 5 JVM面试题(2022版) 待续… 6 Spring面试题(2022版) 待续… 7 Spring MVC面试题(2022版) 待续… 8 Spring Boot面试题(2022版) 待续… 9 Spring Cloud面试题(2022版) 待续… ....

拉格朗日的学习笔记 3万+

【ELF2学习板】基于OpenMP与RK3588多核架构优化FFTW的并行计算效率

本文详细介绍了如何在ELF2学习板上利用OpenMP与RK3588多核架构优化FFTW的并行计算效率。通过编译支持OpenMP的FFTW库、合理设置线程绑定与调度策略,以及内存访问优化等技巧,显著提升了FFT计算的性能。实测数据显示,多核并行优化可使4096点FFT计算速度提升一倍以上,特别适合信号处理、图像分析等高性能计算场景。

weixin_30352645的博客 607

Abracadabra 魔曰:将文本加密为文言文的开源加密工具全解析

Abracadabra(魔曰)是一个开源的文本加密工具,核心能力是把任意文本加密为"看似通顺的文言文"密文。本文基于仓库内 [docs/index.md](https://link.gitcode.com/i/df288bfc7f159f34a70fa80c1ebdd3dd)(项目主页)与 README 展开,结合 [src/javascript/](https://link.gitcode.co

gitblog_00260的博客 1688

零基础入门篇③ PyCharm使用指南(个性化设置、开发必备插件、常用快捷键)

Python从入门到精通👉零基础入门篇③

hacker707的博客 4375

从零到一:基于UniApp离线SDK的安卓原生应用打包实战指南

本文详细介绍了基于UniApp离线SDK的安卓原生应用打包全流程,从环境准备、项目初始化到最终打包优化。重点解析了Android Studio与离线SDK版本匹配、关键配置文件修改及AppKey申请等核心环节,帮助开发者高效完成UniApp离线本地打包,适用于Android应用开发场景。

weixin_29264201的博客 231

Transformer实战(32)——Transformer模型压缩

在本节中,我们学习了如何在硬件资源受限的情况下减轻运行大模型的负担。我们介绍了如何通过蒸馏、剪枝和量化从训练好的模型中提取高效模型。预训练轻量级的通用语言模型(如 DistilBERT) 可以在各种任务上进行微调,并表现出与非蒸馏模型相当的性能。随着数据量的不断增加,我们希望模型能够更快地运行,在这方面,高效 Transformer 起着至关重要的作用。

盼小辉丶的博客 2570

179、运动控制中的行业标准:机器人安全标准ISO 10218

今天这篇笔记,就把我踩过的坑和标准里的硬骨头掰开揉碎讲清楚。

m0_50546716的博客 169

Python入门学习笔记

本文系统梳理了Python基础语法与核心编程概念,涵盖变量、数据类型、列表、字典、函数、模块及面向对象编程。重点讲解了变量命名规则、f-string格式化、列表增删改查操作、字典嵌套遍历、函数参数传递与返回值、异常处理机制,以及文件读写与JSON数据持久化。内容结合实战案例,强调可变类型陷阱、循环中修改列表的风险,并通过B站评论系统等项目实例,实现从基础语法到综合应用的完整知识闭环。

AA_AA114514的博客 418

Open3D 计算点云基本特征

在 Open3D 中,可以通过 PCA(主成分分析)来求得点云的特征值和特征向量。然后基于这些特征值,进一步计算各种几何特征,如线性、平面性、球度等。

纵马踏花向自由 1606
上一篇: 安卓获取清单文件中的meta_data
下一篇: Tomcat The JRE_HOME environment variable is not defined correctly
ithouse
博客等级 码龄12年 200粉丝 212原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ithouse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值