Android代码混淆及ProGuard手册

【Android性能优化】:ProGuard,混淆,R8优化 文章主要讲解了关于R8编译器在整个编译过程中对apk代码以及资源的一些优化操作,主要集中在代码缩减,资源缩减,代码混淆,代码优化这几部分,其中对代码混淆做了一个比较全面的分析。 阅读详情

Android代码的缩减、混淆和优化

为什么把这三个内容放到一起说?因为在Android Gradle中配置方法基本是在一起的。

官方说明如下:

为了尽可能减小应用的大小,您应在发布 build 中启用缩减功能来移除不使用的代码和资源。启用缩减功能后,您还会受益于两项功能,一项是混淆处理功能,该功能会缩短应用的类和成员的名称;另一项是优化功能,该功能会采用更积极的策略来进一步减小应用的大小。本页介绍 R8 如何为项目执行这些编译时任务,以及您如何对这些任务进行自定义。

当您使用 Android Gradle 插件 3.4.0 或更高版本构建项目时,该插件不再使用 ProGuard 执行编译时代码优化,而是与 R8 编译器协同工作,处理以下编译时任务:

  • 代码缩减(即摇树优化):从应用及其库依赖项中检测并安全地移除不使用的类、字段、方法和属性(这使其成为了一个对于规避 64k 引用限制非常有用的工具)。例如,如果您仅使用某个库依赖项的少数几个 API,那么缩减功能可以识别应用不使用的库代码并仅从应用中移除这部分代码。如需了解详情,请转到介绍如何缩减代码的部分。
  • 资源缩减:从封装应用中移除不使用的资源,包括应用库依赖项中不使用的资源。此功能可与代码缩减功能结合使用,这样一来,移除不使用的代码后,也可以安全地移除不再引用的所有资源。如需了解详情,请转到介绍如何缩减资源的部分。
  • 混淆:缩短类和成员的名称,从而减小 DEX 文件的大小。如需了解详情,请转到介绍如何对代码进行混淆处理的部分。
  • 优化:检查并重写代码,以进一步减小应用的 DEX 文件的大小。例如,如果 R8 检测到从未采用过给定 if/else 语句的 else {} 分支,则会移除 else {} 分支的代码。如需了解详情,请转到介绍代码优化的部分。

默认情况下,在构建应用的发布版本时,R8 会自动执行上述编译时任务。不过,您也可以停用某些任务或通过 ProGuard 规则文件自定义 R8 的行为。事实上,R8 支持所有现有 ProGuard 规则文件,因此您在更新 Android Gradle 插件以使用 R8 时,无需更改现有规则。

开启混淆功能

上面没有提到的一个代码混淆的重要作用:我们知道apk文件是相对容易被反编译的,未加混淆的apk,反编译后基本裸奔。而混淆的apk即使被反编译,类名与变量名都会处理成无意义的字符,很大程度上降低了源码的可读性。

以下是在Android Studio中开启混淆的方法和常用的配置。Android Studio的Gradle混淆功能默认是关闭的,我们需要手动在module的build.gradle中打开。

  1. 在Module的build.gradle中添加如下配置:
android{
    ...
    buildTypes {

        release {
            // 开启混淆
            minifyEnabled true
            // 开启资源压缩,编译时会自动删除未使用到的res资源
            shrinkResources true
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        debug {
            //开启混淆会导致编译速度变慢,debug通常不开启
            minifyEnabled false
            shrinkResources false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
} 

之后我们需要在proguard-rules.pro文件中编辑混淆规则。

proguard手册

输入/输出配置项

  • @filename

    等同于:-include filename,filename 文件名。

  • -include [filename]

    从给定文件中读取配置项,filename 文件名。

  • -basedirectory [directoryname]

    为后续的相对文件指定基础目录,directoryname 目录名。

  • injars [classPath] 指定要处理的输入jar(等压缩包),包中的class文件会被处理后输出到outjars的指定路径下,非class文件直接输出到outjars指定路径,classpath jar包输入路径。

  • outjars [classPath] 指定输出路径,接收injars的文件输出,classPath 输出路径。

  • libraryjars [classPath] 指定不被混淆的jar,classPath 文件路径。

压缩配置项

  • -dontshrink

    不进行代码压缩,默认会进行代码压缩,打开此配置项则不进行压缩。

  • -printusage [fileName]

    将被压缩的代码输出到指定路径。

优化配置项

  • -dontoptimize

    指定不进行代码优化,默认情况下ProGuard会优化所有代码。

  • -optimizations [optimization_filter]

    在更细粒度的级别指定要启用和禁用的优化,篇幅有限不展开讲了,具体可以参考:Configuration - Optimizations

    常用的配置方式:-optimizations !code/simplification/cast,!field/*,!class/merging/*

  • -optimizationpasses n

    指定代码迭代优化的次数,默认执行一遍。

混淆配置

  • -dontobfuscate

    不进行混淆,默认会进行代码混淆。

  • -printmapping [filename]

    将混淆前后映射表输出到指定文件。

  • -dontusemixedcaseclassnames

    混淆时不使用大小写混合,混淆后类名为小写。

  • -keepattributes [attribute_filter]

    指定要保留的属性,如:-keepattributes Exceptions,InnerClasses,具体可参考:Optional attributes

通用配置项

  • -verbose

    指定在处理期间输出更多信息。如果程序因异常终止,此选项将打印出整个堆栈跟踪,而不仅仅是异常消息。

  • -dontnote [class_filter]

    指定不打印匹配类的相关异常信息,class_filter为正则表达式,符合表达式的类不打印信息。

  • -dontwarn [class_filter]

    指定相关类不发出警告,class_filter为正则表达式。如:-dontwarn androidx.**

  • -dump [filename]

    将所有class的内部结构输出到指定文件。如:-dump proguard/class_files.txt

keep配置项

  • -keep []

    指定要保留的类和类成员。

    //View子类,类名不混淆
    - keep public class * extends android.view.View{
     		//set开头的方法不混淆
        void set*(***);
      	//构造函数不混淆
        public <init>(android.content.Context);
        public <init>(android.content.Context, android.util.AttributeSet);
        public <init>(android.content.Context, android.util.AttributeSet, int);
    } 
    

    指定的类名和类成员不被混淆,需要注意的是以下配置只能保证类名不被混淆。

    -keep public class * extends android.app.Activity 
    

    想要类名和类成员全部不混淆应该使用:

    -keep public class * extends android.app.Activity{*;} 
    
  • -keepclassmembers

    保留指定的类成员。

    //指定不混淆的类成员,类名会混淆
    -keepclassmembers class * {
        //事件监听类(参数符合**On*Event)的方法不混淆
        void *(**On*Event);
    } 
    
  • -keepclasseswithmembers

    在所有类成员都存在的情况下,指定要保留的类和类成员。

    //需要匹配类和所有指定成员都存在的类,类和类成员不混淆
    -keepclasseswithmembers class * {
        public <init>(android.content.Context, android.util.AttributeSet);
        public <init>(android.content.Context, android.util.AttributeSet, int);
    } 
    

    功能与-keep很像,举个例子:

    public class MyClass extends android.view.View{
        public MyClass(Context context) {
            super(context);
        }
    
        public MyClass(Context context, @Nullable AttributeSet attrs) {
            super(context, attrs);
        }
    
        public MyClass(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
        }
    
        /**
         * 自定义方法
         * @param onClickListener
         */
        public void addListener(OnClickListener onClickListener){
            //TODO: todo
        }
    } 
    

    当使用-keep时:

    - keep public class * extends android.view.View{
      	//构造函数不混淆
        public <init>(android.content.Context);
        public <init>(android.content.Context, android.util.AttributeSet);
        public <init>(android.content.Context, android.util.AttributeSet, int);
      
      	public void addListener(***)
      	public void getListener(***)
    } 
    

    MyClass类名和指定的类成员不会被混淆(未指定的类成员也会被混淆),因为MyClass符合 class * extends android.view.View条件。

    而使用-keepclasseswithmembers时:

    - keep public class * extends android.view.View{
      	//构造函数不混淆
        public <init>(android.content.Context);
        public <init>(android.content.Context, android.util.AttributeSet);
        public <init>(android.content.Context, android.util.AttributeSet, int);
      
      	public void addListener(***)
      	public void getListener(***)
    } 
    

    MyClass会被混淆,因为MyClass不符合public void getListener(***)条件。当keepclasseswithmembers指定的类和类成员全部存在的情况下,才会匹配该类(MyClass不存在getListener()方法,所以不能被匹配)。

  • -keepnames/-keepclassmembernames和-keepclasseswithmembernames

    选项等同于作用
    -keepnames **-keep,allowshrinking **指定要保留的类和类成员,允许代码压缩优化,成员可能在压缩阶段被删除
    -keepclassmembernames **- keepclassmembers,allowshrinking **指定要保留的类成员,允许代码压缩优化,成员可能在压缩阶段被删除
    -keepclasseswithmembernames **-keepclasseswithmember,allowshrinking **在所有类成员都存在的情况下,指定要保留的类和类成员,允许代码压缩优化,成员可能在压缩阶段被删除

    简单来说使用-keep/-keepclassmember和-keepclasseswithmember可能会阻止成员被压缩优化,而使用-keepnames/-keepclassmembernames和-keepclasseswithmembernames而不会。

Keep配置项修饰符

可用用来修饰-keep/-keepclassmember和-keepclasseswithmember,使用方式:

-keep[,modifiter,...] class_specification
-keep,allowshrinking public class * extends android.view.View{*;} 
  • allowshrinking

    上面提到过了,允许对象进行代码压缩,对象可能在压缩阶段被删除。

  • allowoptimization

    指定的对象可能会被改变(优化步骤),但可能不会被混淆或者删除。

  • allowobfuscation

    指定对象可能会被重命名,但是不会被删除和优化。

  • includedescriptorclasses

  • includecode

    这两个自行了解吧,太不常用了。(其实我也没搞懂。。。)

通配符

符号意义人话
?matches any single character in a class name, but not the package separator. For example, “com.example.Test?” matches “com.example.Test1” and “com.example.Test2”, but not “com.example.Test12”.匹配名称中的任意单个字符。
*matches any part of a class name not containing the package separator. For example, “com.example.*Test*” matches “com.example.Test” and “com.example.YourTestApplication”, but not “com.example.mysubpackage.MyTest”. Or, more generally, “com.example.*” matches all classes in “com.example”, but not in its subpackages.匹配名称中任意多个字符,不包含包分隔符和目录分隔符,用在类体中可以匹配任意字段和方法。
**matches any part of a class name, possibly containing any number of package separators. For example, “**.Test” matches all Test classes in all packages except the root package. Or, “com.example.**” matches all classes in “com.example” and in its subpackages.匹配名称中任何部分,可以包含分隔符。
<n>matches the n’th matched wildcard in the same option. For example, “com.example.*Foo<1>” matches “com.example.BarFooBar”.在相同选项中匹配第n个匹配的通配符。

篇幅有限只列举了部分常用的配置项。
proguard常用配置规则

常用文件配置如下:

1.常用配置

-optimizationpasses 5
# 混淆时不使用大小写混合,混淆后的类名为小写
-dontusemixedcaseclassnames
# 指定不去忽略非公共库的类
-dontskipnonpubliclibraryclasses
# 指定不去忽略非公共库的成员
-dontskipnonpubliclibraryclassmembers
# 混淆时不做预校验
-dontpreverify
# 混淆时不记录日志
-verbose
# 代码优化
-dontshrink
# 不优化输入的类文件
-dontoptimize
# 保留注解不混淆
-keepattributes *Annotation*,InnerClasses
# 避免混淆泛型
-keepattributes Signature
# 保留代码行号,方便异常信息的追踪
-keepattributes SourceFile,LineNumberTable
# 混淆采用的算法
-optimizations !code/simplification/cast,!field/*,!class/merging/*

# dump.txt文件列出apk包内所有class的内部结构
-dump proguard/class_files.txt
# seeds.txt文件列出未混淆的类和成员
-printseeds proguard/seeds.txt
# usage.txt文件列出从apk中删除的代码
-printusage proguard/unused.txt
# mapping.txt文件列出混淆前后的映射
-printmapping proguard/mapping.txt 

2. Android 系统类

android类
# Android类
-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 * extends android.view.View 
support包
# support
-keep class android.support.** {*;}
-keep public class * extends android.support.**
-dontwarn android.support.**
-keep interface android.support.** { *; } 
androidx包
# androidx
-keep class androidx.** {*;}
-keep interface androidx.** {*;}
-keep public class * extends androidx.**
-dontwarn androidx.** 
自定义控件get/set和构造
# 自定义控件
-keep public class * extends android.view.View{
    *** get*();
    void set*(***);
    public <init>(android.content.Context);
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
} 
R文件
# R文件
-keep class **.R$* {
 *;
} 
webview
# webview
-keepclassmembers class android.webkit.WebView {
   public *;
}
-keepclassmembers class * extends android.webkit.WebViewClient {
    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
    public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.WebViewClient {
    public void *(android.webkit.WebView, *);
} 
android事件方法
# 按键等事件
-keepclassmembers class * {
    void *(**On*Event);
}
# onClick
-keepclassmembers class * extends android.app.Activity{
    public void *(android.view.View);
} 
枚举类型
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
} 
其他类
# native方法
-keepclasseswithmembernames class * {
    native <methods>;
}
# View构造方法
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet);
    public <init>(android.content.Context, android.util.AttributeSet, int);
}
# Parcelable
-keep class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator *;
}
# Serializable
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
} 

3. 第三库

ButterKnife
-keep class butterknife.** { *; }
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder { *; }
-keepclasseswithmembernames class * {
    @butterknife.* <fields>;
}
-keepclasseswithmembernames class * {
    @butterknife.* <methods>;
} 
OkHttp
-dontwarn com.squareup.okhttp3.**
-keep class com.squareup.okhttp3.** { *;}
-dontwarn okio.** 
glide 3
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
} 
glide 4
-keep public class * implements com.bumptech.glide.module.AppGlideModule
-keep public class * implements com.bumptech.glide.module.LibraryGlideModule
-keep public enum com.bumptech.glide.load.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
} 
gson
-keep class com.google.gson.** {*;}
-keep class com.google.**{*;}
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; } 
greendao
-keepclassmembers class * extends org.greenrobot.greendao.AbstractDao {
public static java.lang.String TABLENAME;
}
-keep class **$Properties
# If you do not use SQLCipher:
-dontwarn org.greenrobot.greendao.database.**
# If you do not use Rx:
-dontwarn rx.** 
Retrofit2
-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepattributes Signature
-keepattributes Exceptions 
RxJava、RxAndroid
-dontwarn sun.misc.**
-keepclassmembers class rx.internal.util.unsafe.*ArrayQueue*Field* {
   long producerIndex;
   long consumerIndex;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueProducerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode producerNode;
}
-keepclassmembers class rx.internal.util.unsafe.BaseLinkedQueueConsumerNodeRef {
    rx.internal.util.atomic.LinkedQueueNode consumerNode;
} 
Picasso
-keep class com.parse.*{ *; }
-dontwarn com.parse.**
-dontwarn com.squareup.picasso.**
-keepclasseswithmembernames class * {
    native <methods>;
} 
fastJson
-dontwarn com.alibaba.fastjson.**
-keep class com.alibaba.fastjson.**{*; } 
EventBus
# EventBus2
-keepclassmembers class ** {
    public void onEvent*(***);
}

# Only required if you use AsyncExecutor
-keepclassmembers class * extends de.greenrobot.event.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
}
#EventBus3
-keepattributes *Annotation*
-keepclassmembers class ** {
    @org.greenrobot.eventbus.Subscribe <methods>;
}
-keep enum org.greenrobot.eventbus.ThreadMode { *; }

# Only required if you use AsyncExecutor
-keepclassmembers class * extends org.greenrobot.eventbus.util.ThrowableFailureEvent {
    <init>(java.lang.Throwable);
} 
阿里云推送
-keepclasseswithmembernames class ** {
    native <methods>;
}
-keepattributes Signature
-keep class sun.misc.Unsafe { *; }
-keep class com.taobao.** {*;}
-keep class com.alibaba.** {*;}
-keep class com.alipay.** {*;}
-keep class com.ut.** {*;}
-keep class com.ta.** {*;}
-keep class anet.**{*;}
-keep class anetwork.**{*;}
-keep class org.android.spdy.**{*;}
-keep class org.android.agoo.**{*;}
-keep class android.os.**{*;}
-keep class org.json.**{*;}
-dontwarn com.taobao.**
-dontwarn com.alibaba.**
-dontwarn com.alipay.**
-dontwarn anet.**
-dontwarn org.android.spdy.**
-dontwarn org.android.agoo.**
-dontwarn anetwork.**
-dontwarn com.ut.*
-dontwarn com.ta.** 

以上只是列举了一些Android系统和第三方库常用的混淆配置方式,项目中需要按照实际需求进行配置。

最后

在技术领域内,没有任何一门课程可以让你学完后一劳永逸,再好的课程也只能是“师傅领进门,修行靠个人”。“学无止境”这句话,在任何技术领域,都不只是良好的习惯,更是程序员和工程师们不被时代淘汰、获得更好机会和发展的必要前提。

**如果你觉得自己学习效率低,缺乏正确的指导,可以扫码,加入我们资源丰富,学习氛围浓厚的技术圈一起学习交流吧!

Android ProGuard配置与混淆详解 本文还有配套的精品资源,点击获取 简介:在Android开发中,ProGuard是用于代码混淆、优化和压缩的工具,它能有效保护代码安全、减小APK体积并提高运行效率。本篇详细介绍了ProGuard的基础知识、作用、以及针对jPush混淆问题的解决策略。通过理解ProGuard的工作原理和配置规则,开发者能够确保在使用jPush等第三方服务时,混淆过程不会破坏应用的功能。文章... 阅读详情

相关推荐

【硬件】通俗易懂的讲解晶体管(三极管和MOS管)的工作原理

晶体管是一个简单的元器件,可用于构建许多有趣的项目。在本文中,我将用通俗易懂的语言给您讲解晶体管的工作原理,以便您可以在电路设计中更好的使用静态管。一旦你学习这些基础知识,对以后的设计和使用来说,将会变得非常容易。我们将重点介绍两种最常见的晶体管:双极型晶体管(三极管)和MOSFET。晶体管的工作原理其实是类似于电子开关。它可以打开和关闭电路。一个简单的思考方法是将晶体管视为无源的继电器。晶体管类似于继电器,从某种意义上说,您可以使用它来打开和关闭某些东西。但晶体管也可以部分导通,一般在放大电路中使用,这部

1万+

Android 代码混淆Proguard

假设没指定白名单就进行混淆打包,而某某类的类名被混淆了(假设变成了a),那么可能其他引用或使用该类的类就找不到该类,说不定应用就会因此崩溃或是导致相应的功能无法使用。在Android的具体表现就是打包时,将项目里的包名、类名、变量名根据混淆规则进行更改,使反编译工具反编译出来的代码人难以阅读,从而达到防止被逆向破解的目的。Android代码混淆,又称Android混淆,是伴随着Android系统的流行而产生的一种APP保护技术,用于保护APP不被破解和逆向分析。(每次混淆修改后,打包前注意clean)

DeMonnnnnn 4475

Dynamics CRM证书更换

  Dynamics CRM产品一般有两种认证方式。第一种是基于声明的内部访问也就是无证书单纯用账号密码验证。第二种就是联合身份认证,需要安装网站证书。   对于联合身份认证的情况因为需要安装证书,而且证书是有一个一年的有效期,所以运维人员每年都需要进行证书更换的操作。以下就是更换证书的方法及过程。 证书根据申请方式一般也分两种,第一种是自建证书,这种证书是没有机构认证的所以安装上之后网站因为没...

bzpfly的博客 877

Android学习之路(27) ProGuard,混淆,R8优化

使用java编写的源代码编译后生成了对于的class文件,但是class文件是一个非常标准的文件,市面上很多软件都可以对class文件进行反编译,为了我们app的安全性,就需要使用到Android代码混淆这一功能。针对 Java 的混淆,ProGuard就是常用的混淆工具,且他不仅仅是混淆工具,它同时可以对代码进行压缩优化混淆。下面我们来简单介绍下ProGuard工作流程。ProGuard 工作流程shrinkoptimizeobfuscatepreverigy。这四个步骤都是可选,但是顺序都是不变的。

qq_32907491的博客 3130

现代SerDes解剖:从CTLE/DFE到PAM4与ADC+DSP架构

高速有线通信的物理层瓶颈,正从并行总线的时钟偏斜转向串行链路的信号完整性挑战。SerDes作为解决这一问题的核心技术,其内部架构远超“并转串”的朴素认知。接收端的CTLE线性均衡与DFE判决反馈均衡,配合CDR时钟恢复,共同构成对抗信道损耗与码间干扰的关键机制。随着速率迈向56G/112G,PAM4调制以电平幅度换取带宽,而ADC+DSP架构则把均衡算法搬入数字域,实现更灵活的非线性补偿。理解这些模块如何协同工作,是调试PCIe、以太网等高速链路、优化眼图余量与抖动预算的基础,也是硬件工程师从盲目调参走向系

weixin_29194817的博客 301

Autosar MCAL-S32K324 Fee配置-基于EB

Autosar MCAL S32K324 Fee配置详解

赞的博客 1546

Android ProGuard技术详解

一. 简介 ProGuard是一个开源的Java代码混淆器,在Android中一提起ProGuard,我们通常第一想到的是用来混淆代码的,其实它的功能并不仅限于此,有以下四个功能: (1)压缩(Shrink):侦测并移除代码中无用的类、字段、方法和特性 (2)优化(Optimize):对字节码进行优化,移除无用的指令 (3)混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对类、字段和方法进行重命名 (4)预检(Preverify):在Java平台上对处理后的代码进行预检 总结: Pro

假装你是大灰狼的专栏 3794

【异常】解决 Cursor 报错 Unexpected seqno: 2 != 1. Please try again, or contact support if the issue 的排坑指南

在使用 Cursor 辅助编程时,你是否遇到过 AI 突然中断输出,并在右下角弹出一个红色的 Network Error 弹窗?今天我们就来彻底解析并解决这个网络断连问题。

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

Android开发者的混淆使用手册

综述 毫无疑问,混淆是打包过程中最重要的流程之一,在没有特殊原因的情况下,所有 app 都应该开启混淆。 首先,这里说的的混淆其实是包括了代码压缩、代码混淆以及资源压缩等的优化过程。依靠 ProGuard,混淆流程将主项目以及依赖库中未被使用的类、类成员、方法、属性移除,这有助于规避64K方法数的瓶颈;同时,将类、类成员、方法重命名为无意义的简短名称,增加了逆向工程的难度。而依靠 Gradle

Moonbow 252

Android Framework 开发工程师职位深度解析与面试指南

摘要:博泰车联网科技(上海)股份有限公司招聘Android Framework开发工程师,负责车载系统的底层开发与优化。岗位要求5年以上经验,深入掌握Android Framework机制(WindowManager、PowerManager等模块),熟悉高通平台中间件架构及NDK/JNI开发,具备性能优化(启动时间、ANR处理)、OTA升级等能力。需熟练使用Android Studio、Git等工具,有车载开发经验者优先。工作内容包括Framework定制开发、问题排查及技术文档编写。

郑伟强dev的专栏 552

【QT开发教程】Qt中的跨平台文件系统操作

文件系统操作是应用程序开发中经常需要处理的任务。Qt提供了一套跨平台的文件系统操作API,使开发者能够在不同操作系统上无缝地进行文件和目录操作。本文将介绍Qt中的跨平台文件系统操作,包括基本概念、常用类和方法以及实际示例。

科技改变人类,技术成就未来 981

Android Proguard混淆

Proguard 四部曲: shrink(删减):删减无用代码,包括类、变量、方法和属性,缩减了APK包的大小 optimize(优化):优化方法字节码,并移除无用的构造方法 obfuscate(混淆):混淆现有代码,将有意义的命名替换为无意义的命名 preverify(预校验):给类添加预校验信息,这是J2ME和Java 6及以上要求的

fumeidonga的博客 2942

基于 YOLOv26 的校园安全监控系统:多场景应用

本文提出了一种基于YOLOv26的校园安全监控系统,采用多场景应用架构实现对校园安全的智能监测。系统核心技术包括YOLOv26目标检测、DeepSORT目标跟踪、区域安全定义和行为分析等模块,通过边缘计算平台实现实时处理。研究构建了包含多种校园场景的专业数据集,并采用数据增强技术提升模型性能。系统可检测人员、车辆和物品等目标,分析其行为轨迹,评估安全风险并触发告警。实验结果表明,该系统能有效识别校园安全隐患,为安全管理提供智能化解决方案。

一键难忘的博客 505

Android 混淆:proguard实践

前言网上关于使用proguard进行混淆的文章很多,但大部分是从讲解proguard知识点这个角度去写的,为什么要混淆,如何去混淆,混淆的注意点等重要的问题反而都没有写。 所以想通过这篇文章来记录我学习proguard的过程,一来是整理android混淆相关的知识点,二来是总结此次学习混淆的方法,提高学习能力。proguard实践学习任何技术之前应该要有一个明确的目标,本次学习混淆的目标就是会使用a

程序员闲谈 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Proguard混淆入门手册

Github源码: https://github.com/AnJiaoDe/MakeJar 混淆Jar包,首先得有一个普通的Jar包 死丢丢如何将多module生成一个Jar包? 目前小编掌握的比较简单方便的方法是:需要在所有module的build目录找到对应的class文件,然后合并 如各位有更好的方法,欢迎屏幕下方留言讨论,喜欢的朋友可以点击关注,了解更多 比如开发一个SDK,但是有多mo...

奋斗的IT青年 2187

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Android Proguard 混淆文件的规则及使用

Android Proguard 混淆文件的规则及使用

七月的南方博客 7765

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

安卓proguard代码混淆以及反编译工具

混淆以及反编译那些事儿 含义解释: - 压缩(Shrink): 检测并删除未使用的类,字段,方法和属性。 - 优化(Optimize): 分析并优化方法的字节码。 - 混淆(Obfuscate): 使用简短的无意义名称例如a,b,c等,重命名类,字段和方法。 - 预检(Preveirfy): 主要是在Java平台上对处理后的代码进行预检。 #### 输入/输出配置项 ```groovy @filename ```

热爱技术 1796

ProGuard代码混淆器如何使用

ProGuard 是一个免费的 Java 类文件的压缩,优化,混肴器。它删除没有用的类,字段,方法与属性。使字节码最大程度地优化,使用简短且无意义的名字来重命名类、字段和方法 。

m0_54892309的博客 4400

Android 2.3 代码混淆proguard技术介绍

<br />由于各种反编译工具的泛滥,作为Android程序员在2.3版本以前只能通过手动添加proguard来实现代码混淆<br /> <br />proguard这个工具是一个java代码混淆的工具<br /> <br />在2.3版本的sdk中 我们可以看到在android-sdk-windows/tools/下面多了一个proguard文件夹<br />google已经把proguard技术放在了android sdk里面 可以通过正常的编译方式也能实现代码混淆了<br /> <br /><br /

Zy的技术心得 3万+

Android 使用 ProGuard 代码混淆

ProGuard 是开源的优化 Java 字节码工具。官方称可用减少 10% 体积,并提升 20% 运行效率。将类名、方法名、变量名混淆成a、b、c基本字母,一定程度上提高了反编译的难度。 压缩(Shrinking):从入口开始建立引用关系网,去除网外为使用的代码。 优化(Optimization):对入口点以外所有的方法进行分析,将其中一部分方法变为 final的,static的,private的或内联的,从而提高执行效率。 混淆(Obfuscation):将入口点以外的类、方法、成员重构为简

技术笔记 4085

使用proguard混淆android代码

上面说到android为我们提供了两个默认的配置文件,在其中,我们可以看到他的一些语法。本节进行描述。保留选项(配置不进行处理的内容)-keep {Modifier} {class_specification} 保护指定的类文件和类的成员-keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好。

2501_90433289的博客 986

Android studio 代码混淆使用 —— ProGuard

Android studio 代码混淆使用 —— ProGuard

王小六的博客 1910

Android 混淆proguard的实现(图文)

1、  在Eclipse中的工程编译运行后,在目录bin下面有生成一些文件,其中classes.dex是未经过混淆生成的。而我们要混淆的话,就要重新生成一个混淆过的classes.dex。本文主要讲怎样手动生成混淆proguard。 2、  生成一个混淆过的classes.dex:要先对目录bin下面的classes目录(在Eclipse中看不到,系统文件管理中可查看)的class文件打包成

hytfly的专栏 5619

Android Studio:ProGuard 混淆配置

Android Studio 创建Module后,会自动生成 proguard-rules.pro 文件,在其中添加需要的规则即可对apk或jar进行混淆。

doris_d的专栏 1万+

使用proguard混淆android代码,阿里开发7年大牛

学习。

m0_57077948的博客 1011

【详解】ProGuard代码混淆

ProGuard是一个免费的Java类文件压缩器、优化器、混淆器和预验证器。压缩:删除未使用的类、字段、方法和属性。优化:优化字节码,移除无用的指令,减少代码体积。混淆:重命名类、字段和方法,使其难以阅读。预验证:确保混淆后的代码符合JVM规范。

牛肉胡辣汤 1412
上一篇: Android四大组件之BroadcastReceiver
下一篇: Android组件化下的路由框架
不秃头de程序猿
博客等级 码龄5年 4089粉丝 1478原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值