Android开发中使用ProGuard

Android开发规范:APP常用混淆proguard模板 ** get*();文章所有资料全部已经打包整理好,另外小编手头上整理了大量Android架构师全套学习资料,Android核心高级技术PDF文档+全套高级学习资料+视频+2021 BAT 大厂面试真题解析资料展示:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门即可获取!文章所有资料全部已经打包整理好,另外小编手头上整理了大量Android架构师全套学习资料, 阅读详情

-injars  androidtest.jar【jar包所在地址】 
-outjars  out【输出地址】

-libraryjars    'D:\android-sdk-windows\platforms\android-9\android.jar' 【引用的库的jar,用于解析injars所指定的jar类】

 

-optimizationpasses 5
-dontusemixedcaseclassnames 【混淆时不会产生形形色色的类名 】
-dontskipnonpubliclibraryclasses 【指定不去忽略非公共的库类。 】
-dontpreverify 【不预校验】

-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 【优化】

-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 abstract interface com.asqw.android.Listener{
public protected <methods>;  【所有方法不进行混淆】
}
-keep public class com.asqw.android{
public void Start(java.lang.String); 【对该方法不进行混淆】
}

-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 *;
}

今天被同事问到怎么在release版本里面所有的log都去掉的时候,竟然只能回忆起用ProGuard做过这个,完全忘记怎么做的了,特立此存照。文章里面使用的例子放在 Android-Maven-ProGuard-Sample-App

ProGuard简介

在移动设备上面开发应用程序,性能是一个很关键的指标。你的老板走过来要你提高性能的时候,你的第一反应有可能是抓起熟悉的工具花几个小时profile自己的应用,找出那些时间都花在哪里了。在使用这么终极的手段之前,千万不要忘记了先试试ProGuard。

做Android之前就是Java程序员的可能早就已经对ProGuard很熟悉了。简单的来说,ProGuard就是一个Java的class文件处理器,主要的功能类似奥运会口号:

  • 让你的程序变得更小更快
  • 让你的程序变得更难被反向工程

尽管ProGuard不是专用于Android开发的,但是在Android的SDK里面已经包括了这个工具,路径是ANDROID_HOME/tools/proguard,文档可以在http://proguard.sourceforge.net看到。

让程序变得更小更快的好处是不言而喻的。ProGuard通过对bytecode进行优化,优化手段包括去掉无用的代码,去掉内联方法的调用,对类的继承结构进行优化,把所有能加上的final和static加上,以及对算术运算进行Peephole optimization等等。

让程序变得更难被反向工程就不一定是每个人都需要的了。一般情况下,对Android的反向工程是把Dalvik的bytecode转换成Java的bytecode,然后使用传统的Java反向工具转成成Java源代码。如果你的项目是开源的,显然也没有必要防止别人反向。但是如果是下面几种情况,你就很可能需要它了:

  • 你在源文件里面有一些不想被别人看到的信息,如密码等
  • 你的代码里面有自己或者公司的赖以生存的知识产权
  • 你的甲方有明确的要求
  • 你的程序按license等方式收费,你不想被别人把licens检查的部分去掉重新编译个版本

ProGuard可以帮助通过对类,方法和成员名称进行混淆,同时通过去掉结构化的信息,如文件名或者行号表等,来使得代码从理论上变得不可被反向工程。

如此看来,ProGuard真是美好事物一枚。但是ProGuard也不是随手一点药到病除的,也有一点学习曲线。

启用ProGuard

如果你使用Eclipse的ADT,每个新建的项目都会生成一个proguard.cfg文件在项目的根目录。你对ProGuard的所有设定就是在这个文件里面完成的。要想在项目里面启用Proguard,只需要把同样在项目根目录的default.properties里面加上:

proguard.config=proguard.cfg

当然,如果你蛋疼到要自己去移动cfg文件的位置,也要记得去改等号后面的部分。然后,在所有的release版本的build里,你的Proguard就已经生效了。对于使用Eclipse的同学来说,release的build就是指通过选择Android Tools>Export Signed/Unsigned Application Package来进行。

因为在大多数开发中我们都会使用Ant或者是Maven来对项目进行管理,所以一般不会直接用Eclipse来进行release版本的编译,所以通常我们还要掌握如何在不使用ADT的情况下使用ProGuard。对于Maven而言,可以通过使用Maven Android plugin来完成。同时,由于ProGuard已经完全集成到Android的工具链里面了,所以Android的Ant任务里面也有一个专门的private任务叫做-obfuscate,会把激活并使用ProGuard作为release这个target的一部分,所以使用Ant的话只要一个ant release就可以了。

当ProGuard执行以后,会产生几个特别重要的文件:

  • mapping.txt:保存了混淆后的名字和混淆前名字的对应关系。对于每次release的build,都要记得保存这个文件,要不然如果你收到release版本上报出的defect的时候,就等着哭吧。
  • seeds.txt:ProGuard找到的你的程序的entrypoint列表。
  • usage.txt:ProGuard觉得没有用所以移除了的一堆类,域和方法的list。要想学习写作“完美”的ProGuard规则的同学就要经常来这个文件看看自己定下的rule对ProGuard的行为究竟有什么样的影响。如果你有用的类出现在list里面了,说明你削得太猛了,反之亦然。

需要注意的是这些文件的输出目录。在使用Ant ProGuard target的时候,输出目录是bin/proguard/,但是如果是通过ADT(右键project>Android Tools>Export)的话,输出目录会是proguard/。

还有一个常见的困惑就是ProGuard是怎么找到那些需要处理的文件的。一般情况下,ProGuard希望你用-injars或者是-libraryjars来告诉它。但是对Android开发而言,Ant任务和ADT都会自动的查看你的libs,output和项目的classpath目录。

从执行过程的日志来看,ProGuard对类文件的操作分为三个步骤:shrink,optimize,obfuscate。每个步骤都是可选的,可以通过使用-dontshrink、-dontoptimize和-dontobfuscate来分别关掉。一般来说,不用因为结果“不如人意”就随意的关掉某个步骤。完整的进行三个步骤,然后不断的改变规则,直到达到最佳效果,是使用ProGuard的最佳方式。

编写ProGuard规则

ProGuard和很多工具一样,其强大之处在于选项够多。作为Android开发者使用,首先心里要明白,没有一个唯一的最佳配置规则。在此基础上,去掌握一些对Android程序而言通常是适用的规则。然后,就像在文章里面已经反复强调过的一样,以这些规则为起点,反复的调整你的规则,找出一个对自己的程序最适用的规则。

当然,因为选项太多,ProGuard给初学者的感觉难免是千头万绪,无从下手。因此,我们可以从一个例子程序入手来找到对ProGuard的“感觉”。

这个例子本身没有任何特别之处,MyButton类继承自Button但是没有添加新的方法,可以通过它来观察ProGuard如何对继承结构进行压缩。Click的handler除开显示toast之外也没有特别的功能,可以通过它来观察ProGuard对方法名的混淆。AMPSampleActivity里面还专门有一个没有被调用的方法,可以通过它来观察ProGuard对这种情况的处理。下面是程序的入口Activity的实现:

我们期望ProGuard做的事情包括:

  • 保留AMPSampleActivity类,因为它是我们在XML里面指定的程序入口
  • 保留StringUtils类和它的repeat方法
  • 保留myClickHandler方法
  • 保留MyButton类
  • 去掉unusedMethod
  • 除开XML里面引用的类(AMPSampleActivity和MyButton),其他的类名都需要被混淆
  • 除开XML里面引用的方法名(myClickHandler),其他的方法名都要被混淆
  • 完成一些对Android而言通常适用的优化(下面会仔细展开)

ProGuard的规则是“白名单”的,也就是说ProGuard只会对你特别指定的类刀下开恩。这也就是说,对任何程序,我们都至少要写一条规则,来保留程序的入口类。因为是Android程序,我们可以这么写:

-keep public class * extends android.app.Activity

这里我们可以看到ProGuard的rule用的语法基本上遵循了Java本身的语法(extends等等),但是它支持使用通配符。规则中的-keep告诉ProGuard不要删除也不要混淆任何从android.app.Activity继承的类。

很简单,不是吗?如果你这个时候运行程序,会看到:

    org.lenciel.android/org.lenciel.android.AMPSampleActivity}: 
    ➥ android.view.InflateException: Binary XML file line #6: Error inflating 
    ➥ class org.lenciel.android.MyButton

为什么在inflate我们自定义的view的时候crash了呢?这是因为自定义的view是在XML里面被用到的,而不是在Java代码里面。因此ProGuard会认为这是没有用的代码而试着删除它。要保证这些自定义的view不被误删,就需要定义如下的规则:

-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet); 
} 
 
-keepclasseswithmembers class * {
    public <init>(android.content.Context, android.util.AttributeSet, int); 
}

这两条规则告诉ProGuard不要对定义了可能被LayoutInflater调用的构造函数的任何类进行优化。我们这里使用了-keepclasseswithmembers而不是-keep。

再次运行,会遇到下面的错误:

java.lang.IllegalStateException: Could not find a method 
   ➥ myClickHandler(View) in the activity class org.lenciel.android.AMPSampleActivity for onClick handler on 
   ➥ view class org.lenciel.android.MyButton

去查看usage.txt你会发现myClickHandler又被干掉了。为什么在第一条规则里面我们告诉ProGuard不要动AMPSampleActivity里面的任何东西,还是会有这种情况发生?这是使用-keep的一个常见的误会。我们用-keep告诉ProGuard保留一个类的时候,没有提供任何类的“body”信息的话,ProGuard仅仅会保留这个类的名字。它仍然会对这个类内部的所有东西进行优化和混淆。要保留方法,我们需要这么写:

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

但是这样写显然又太过于慷慨了。下面这条规则会好很多:

-keepclassmembers class * extends android.app.Activity {
    public void *(android.view.View); 
}

这条规则告诉ProGuard,如果一个Activity在shrink阶段没有被去掉,那么就保留那些public的,没有返回值的,传入了android.view.View作为参数的方法。

可以看到,使用ProGuard存在一个不断调优的过程。他山之石,可以攻玉,已经有很多人使用ProGuard来优化Android程序了,于是也有了一些被普遍采用的规则和选项,我们下面来个简单说明。

常用规则和选项

前面看到的规则对于例子程序就足够了。但是如果我们的程序使用了Service怎么办?和Activity一样,Service也是在manifest xml里面定义的,因此我们需要对proguard.cfg做一定的扩展。

下面的规则是针对Android程序一般来说都比较有效的。

一般来说,下面的Android framework class都是需要保留的:

-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编出的版本crash之后去搞半天才发现有某个类似的规则需要更新但是你忘记了。

第二个有用的规则是保留static的CREATOR域,这个是Android用来parcel对象的。这个域由于是在运行的时候Instrospection的,所以ProGuard会认为它是无用的域并把它去掉。下面这条rule可以防止这样的事情发生:

-keepclassmembers class * implements android.os.Parcelable {
    static android.os.Parcelable$Creator CREATOR; 
}

在程序中如果你调用了native的code,比如你用JNI来调用了c的lib,由于在Java代码里面是一份方法的签名,而没有方法的实现,它必须被链接到native code上。这也就意味着这些函数名不能被ProGuard加以混淆了,不然链接的过程就会失败。下面的规则可以保证ProGuard不去动native的方法名:

-keepclasseswithmembernames class * { 
     native methods; 
}

我们这里使用的-keepclasseswithmembernames是告诉ProGuard,被调用过的方法留着,没有调用过的都去掉。

前面的规则看起来都一目了然。下面这个可能要费解一些:

-keepclassmembers enum * {   
     public static **[] values(); 
     public static ** valueOf(java.lang.String); 
}

这个规则是让ProGuard不要去动任何Enum的values和valueOf方法。这些方法之所以特殊是因为Java自己是通过发射机制来调用它们的。这可能也是Google不建议使用Java enum的原因吧:它们比final class fields的性能要低不少。如果你已经遵照Google的教诲停止使用Enum,那你也不需要这条规则了,恭喜。

下面来看看常用的选项:

-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose

第一个选项可以避免像Windows这样不区分大小写的操作系统不会因为类似A.class和a.class写到同一个文件里面就驾崩。

第二个选项是因为ProGuard默认不会处理任何非public的类。但是有时候我们会遇到public的类继承自内部的非public的类。所以打开这个选项可以更好的覆盖。

第三个选项是告诉ProGuard不要做preverify(预检验),因为这个只对J2ME或者是Java6的平台有用。

最后一个选项,你们懂的。

前面我们提到过ProGuard有一个优化代码(optimize)的过程。大多数时候ProGuard都会火力全开的对所有的代码做优化。这些优化操作有些时候是相当aggressive的,比如合并类的时候ProGuard会试着既从纵向上合并也从横向上合并,以便得到尽量少的类文件,也就可以得到尽量小的APK。同时它还会试着优化循环和代数运算。默认的ADT生成的ProGuard选项关掉了很多的优化选项:

-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

Google并没有提供他们这么配置的依据。我们可以试着先禁用这个选项,看看程序运行起来会不会有问题。如果遇到了问题再试着慢慢的减弱优化,来“探底”。

同时ProGuard的优化是可以“递归”的,也就是优化完的结果可以作为下次优化的输入继续优化。你可以指定它反复进行多少次。但ProGuard如果发现已经没有什么可以优化,会自动停下来,不一定跑到你指定的次数。一般设置成5就够了:

-optimizationpasses 5

如果处理混淆后版本的错误报告

如果你发布了混淆的版本,有一个问题你就得面对:用户提交的问题单里面产生自这些类和方法都完全打乱过后的版本。为了展示这种问题,在Demo程序里面专门加了这么一个类:

1
2
3
4
5
public class Bomb {
    public void explode() {
        throw new RuntimeException("Boom!");
    }
}

在onCreate方法里面它会被引爆:

1
2
3
4
5
6
7
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    String toast = StringUtils.repeat("Hello ProGuard! ", 3);
    Toast.makeText(this, toast, Toast.LENGTH_SHORT).show();
    new Bomb().explode();
}

如果你运行程序,就会看到下面的错误:

java.lang.RuntimeException: Unable to start activity ...MainActivity}: 
java.lang.RuntimeException: Boom!
...
Caused by: java.lang.RuntimeException: Boom!
   at org.lenciel.android.MainActivity.onCreate(Unknown Source)
   at android.app.Instrumentation.callActivityOnCreate(
   ➥ Instrumentation.java:1047)
   at android.app.ActivityThread.performLaunchActivity(
   ➥ ActivityThread.java:2627)
   ... 11 more

可以看到在错误出现位置的stack trace既没有行号也没有文件名。这是因为相关的信息都被ProGuard优化掉了。如果我们想避免这种情况,就要在proguard.cfg里面加上下面的选项:

-keepattributes SourceFile,LineNumberTable

显然,有了行号和文件名,还是解决不了方法被混淆的问题。我们这个例子程序里面方法很少,而onCreate方法因为是Override的,所以ProGuard不会去动它。如果是正式的工程,最好的办法还是用retrace工具来根据mapping.txt还原整个日志。

$ retrace proguard/mapping.txt stacktrace.txt
运维面试常见问题 对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。优缺点:优点:利用索引可以加速对数据的检索,索引是可以唯一的,创建索引允许指定单个列或者多个列缺点:减慢了数据录入速度,同时也增加了数据库的尺寸大小。 阅读详情

相关推荐

rk3588 Android HDMI IN热插拔解决

1、公司在使用 别的厂商的板卡遇到一个问题,开机我们的app自启就会闪退,后来定位发现是camera 的open出错了,这个问题的出现是因为没有插HDMI IN输入的问题导致的,所以需要对HDMI IN的热插拔进行检测,后面我把这个问题也顺利解决了。下面是我的尝试和使用的解决办法。3、话不多说,我用的是读取系统文件实现的,但是这个方法,需要有status文件的系统读权限,可以修改设备下的/vendor/etc/init/hw/init.rk3588.rc文件修改的权限,这个问题交给自己或者厂家协商解决。

qq_54089476的博客 1918

【Android】使用ProGuard来进行代码混淆

在Android应用中,您可以使用ProGuard来进行代码混淆。代码混淆可以帮助减小APK文件的大小并加强应用的安全性,因为它会对代码进行压缩和混淆,使得反编译和逆向工程变得更加困难。要在Android应用中配置代码混淆,您需要在文件中定义混淆规则。该文件一般位于您的Android项目的/app目录下。

资深全栈开发工程师 957

Ubuntu中交叉编译armadillo库

网上关于交叉编译armdillo库比较少,借鉴了一些但是在前几天编译时总是磕磕绊绊,于是写一个详细的编译过程。交叉编译armdillo库包含两个步骤:交叉编译依赖库和交叉编译armdillo库。

weixin_39813867的博客 1879

Android 项目的代码混淆,Android proguard 使用说明

简介 Java代码是非常容易反编译的。为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理。 ProGuard是一个混淆代码的开源项目。它的主要作用就是混淆,当然它还能对字节码进行缩减体积、优化等,但那些对于我们来说都算是次要的功能。 官网地址:http://proguard.sourceforge.net/ 原理 Jav...

weixin_34295316的博客 417

基于STM32的工业I/O模块硬件电路实现

深入解析基于STM32的工业I/O模块硬件电路实现,涵盖关键电路设计与信号处理,突出硬件电路稳定性和工业级可靠性,适合嵌入式开发者参考。

weixin_35835018的博客 453

lammps后处理:堆垛层错和孪晶的数量统计

python调用ovito包可以免费实现ovito pro版本的功能,不需要安装ovito pro软件,如统计位错线长度、CNA结构、键角分布等,如需深入学习,可考虑报名python ovito后处理课程,或lammps一对一课程。lammps金属变形模拟中,可能会产生堆垛层错或者孪晶等结构,但是ovito免费版本无法统计这些结构的数量。使用python和ovito软件包,则可以方便的统计出这些结构的数量。大家好,我是小马老师。

lammps_jiayou的博客 464

ProGuard 在 Android 上的使用姿势,开发这么久这些问题都不会

ProGuard 是一个压缩、优化、混淆代码的工具。尽管有很多其他工具供开发者们使用,但是 ProGuard 作为 Android Gradle 构建过程的一部分,已经打包在 SDK 中。 当我们构建应用时,使用 ProGuard 有很多好处。有的开发者更关心混淆这块功能,对我而言最大的用处是打包时移除 dex 中的无用代码。 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8PSbPYKs-1630583794712)(https://user-gold-cdn.xitu.i

m0_61417864的博客 560

LabVIEW实现HTTP通信

本节简要介绍HTTP通信的基础知识,并以工业物联网平台TLINK中云端设备的数据发布设计为例,阐述互联网环境下HTTP客户端应用程序设计的基本方法。重点讲解工业物联网平台TLINK中HTTP设备的创建、通信数据帧的构造与测试。

不脱发的程序猿 1544

【Android 安装包优化】开启 ProGuard 混淆 ( 压缩 Shrink | 优化 Optimize | 混淆 Obfuscate | 预检 | 混淆文件编写 | 混淆前后对比 )

一、开启 ProGuard 混淆、 二、混淆文件编写、 三、混淆前后对比、 四、build.gradle 完整配置文件、 五、参考资料

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2067

【FPGA教程案例55】深度学习案例2——基于FPGA的CNN卷积神经网络之ReLu激活层verilog实现

在本课程中,我们将对CNN的ReLu函数模块的FPGA实现做详细的介绍和学习。从仿真结果可知,通过Rule激活函数之后,小于的输入数据输出为0,否则输出是输入本身。,我们对CNN的基本原理有了初步认识。ReLu函数具备如下优缺点。按照课程1相似的操作方式。

FPGA/MATLAB学习教程/源码/项目合作开发 2691

73、结合无人机进行rk3588oak-lite跟踪目标物体进行识别、跟踪

搭建仿真转换模型环境,主要python版本和我下载的rknn2的版本。截取shape节点,输出模型。so库也要对应转模型的whl。其中安装的whl版本。

sxj731533730 1623

Android之ProGuard使用

ProGuard 是一种代码混淆和优化工具,通常用于减小 APK 文件大小并保护源代码不被反编译。

追梦的鱼儿 1877

软件测试高频面试题 2026 最新整理(功能 + 自动化)

本文系统整理了2026年软件测试面试高频题目及参考答案,涵盖功能测试、自动化测试及新兴热点领域。功能测试部分包含测试基础概念、用例设计方法、缺陷管理流程等10个必背题;自动化测试部分详细解析工具选择、元素定位、框架搭建等10个热门考点;新增章节聚焦AI测试、安全测试、性能指标等5个前沿话题。参考答案均采用结构化表述,包含定义、区别、适用场景等关键要素,并强调结合项目经验作答。文末提供2026版面试技巧,建议采用"结论-分点-总结"的回答逻辑,重点展现问题解决能力和技术前瞻性。

SmallBull的博客 1958

Android 开发应该掌握的 Proguard 技巧

1.保留某个特定的类#保留Test类2.保留某个类的子类#保留继承了AbstractClass的子类3.保留接口的实现类#保留实现了Callable接口的类4.保留类的特定部分 保留TaskRepository类的所有构造方法,变量和普通方法。;//匹配所有构造器;//匹配所有域;//匹配所有方法还可以保留的更具体一点,如下所示// 保留该类的修饰符是public且有一个参数(类型是String)的构造方法。

2401_85667460的博客 994

visio安装包

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

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

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

学习。

m0_57077948的博客 1011

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android开发中的Proguard

转自:https://blog.youkuaiyun.com/ccpat/article/details/52059344Proguard是Android开发时经常会用到的一个工具,在Android SDK中已经集成了一个免费的Proguard版本,位于&lt;sdk&gt;/tools/proguard目录中。在Android项目中,通过修改module下面的build.gradle文件来开启使用Progu...

laxian2009的专栏 1143

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

如何为Android库开发者配置ProGuard:android-proguard-snippets中的consumerProguardFiles用法终极指南

在Android应用开发中,ProGuard代码混淆是保护应用安全的关键步骤。对于Android库开发者来说,正确配置ProGuard尤为重要,因为这不仅影响库本身的安全性,还直接影响使用该库的应用程序。本文将为您详细介绍如何使用android-proguard-snippets项目中的consumerProguardFiles功能,为您的Android库提供完整的ProGuard配置解决方案。

gitblog_00294的博客 459

Android开发中如何使用ProGuard

今天被同事问到怎么在release版本里面所有的日志都去掉的时候,竟然只能回忆起用ProGuard做过这个,完全忘记怎么做的了,特立此存照。文章里面使用的例子放在 Android-Maven-ProGuard-Sample-App。 ProGuard简介 在移动设备上面开发应用程序,性能是一个很关键的指标。你的老板走过来要你提高性能的时候,你的第一反应有可能是抓起熟悉的工具花几个小

xiaoli519的博客 568

Android开发之ProGuard技术

ProGuard简介 ProGuard一共包括以下4个功能,其中每个功能都是可选的,我们可以通过配置脚本来决定执行其中的哪几个功能,ProGuard的执行流程如下图。 压缩(Shrink):侦测并移除代码中无用的类、字段、方法和属性。 优化(Optimize):对字节码进行优化,移除无用的指令。 混淆(Obfuscate):使用a、b、c、d这样简短而无意义的名称,对类、字段和方法进行重命名。 ...

qq_36828822的博客 246

Android 开发应该掌握的 Proguard 技巧,flutter瀑布流布局插件

java.lang.Object readResolve(); } #保留我们使用的四大组件,自定义的Application等等这些类不被混淆 #因为这些子类都有可能被外部调用 -keep public class * extends android.app.Activity -keep public class * extends android.app.Appliction -keep public class * extends android.app.Service -keep public cla

wa2231a的博客 948
上一篇: Android不同手机屏幕分辨率自适应
下一篇: android:launchMode的四种加载模式,Activity的四种启动模式
notebook034
博客等级 码龄16年 6粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值