Android proguard 详解

Android 安装包优化开启资源压缩 1,概述 为了尽可能减小应用的大小,您应在发布 build 中启用缩减功能来移除不使用的代码和资源。启用缩减功能后,您还会受益于两项功能,一项是混淆处理功能,该功能会缩短应用的类和成员的名称;另一项是优化功能,该功能会采用更积极的策略来进一步减小应用的大小。本页介绍 R8 如何为项目执行这些编译时任务,以及您如何对这些任务进行自定义。 当您使用 Android Gradle 插件 3.4.0 或更高版本构建项目时,该插件不再使用 ProGuard 执行编译时代码优化,而是与 R8 编译器协同工作,处理以下编 阅读详情
简介

Java代码是非常容易反编译的。为了很好的保护Java源代码,我们往往会对编译好的class文件进行混淆处理。

ProGuard是一个混淆代码的开源项目。它的主要作用就是混淆,当然它还能对字节码进行缩减体积、优化等,但那些对于我们来说都算是次要的功能。官网网址是:

http://proguard.sourceforge.net/。


详解
1、原理
Java 是一种跨平台的、解释型语言,Java 源代码编译成中间”字节码”存储于 class 文件中。由于跨平台的需要,Java 字节码中包括了很多源代码信息,如变量名、方法名,并且通过这些名称来访问变量和方法,这些符号带有许多语义信息,很容易被反编译成 Java 源代码。为了防止这种现象,我们可以使用 Java 混淆器对 Java 字节码进行混淆。

混淆就是对发布出去的程序进行重新组织和处理,使得处理后的代码与处理前代码完成相同的功能,而混淆后的代码很难被反编译,即使反编译成功也很难得出程序的真正语义。被混淆过的程序代码,仍然遵照原来的档案格式和指令集,执行结果也与混淆前一样,只是混淆器将代码中的所有变量、函数、类的名称变为简短的英文字母代号,在缺乏相应的函数名和程序注释的况下,即使被反编译,也将难以阅读。同时混淆是不可逆的,在混淆的过程中一些不影响正常运行的信息将永久丢失,这些信息的丢失使程序变得更加难以理解。

混淆器的作用不仅仅是保护代码,它也有精简编译后程序大小的作用。由于以上介绍的缩短变量和函数名以及丢失部分信息的原因, 编译后 jar 文件体积大约能减少25% ,这对当前费用较贵的无线网络传输是有一定意义的。
2、语法
  1. -include {filename}    从给定的文件中读取配置参数   
  2. -basedirectory {directoryname}    指定基础目录为以后相对的档案名称   
  3. -injars {class_path}    指定要处理的应用程序jar,war,ear和目录   
  4. -outjars {class_path}    指定处理完后要输出的jar,war,ear和目录的名称   
  5. -libraryjars {classpath}    指定要处理的应用程序jar,war,ear和目录所需要的程序库文件   
  6. -dontskipnonpubliclibraryclasses    指定不去忽略非公共的库类。   
  7. -dontskipnonpubliclibraryclassmembers    指定不去忽略包可见的库类的成员。  
  8.   
  9. 保留选项   
  10. -keep {Modifier} {class_specification}    保护指定的类文件和类的成员   
  11. -keepclassmembers {modifier} {class_specification}    保护指定类的成员,如果此类受到保护他们会保护的更好  
  12. -keepclasseswithmembers {class_specification}    保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。   
  13. -keepnames {class_specification}    保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除)   
  14. -keepclassmembernames {class_specification}    保护指定的类的成员的名称(如果他们不会压缩步骤中删除)   
  15. -keepclasseswithmembernames {class_specification}    保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后)   
  16. -printseeds {filename}    列出类和类的成员-keep选项的清单,标准输出到给定的文件   
  17.   
  18. 压缩   
  19. -dontshrink    不压缩输入的类文件   
  20. -printusage {filename}   
  21. -whyareyoukeeping {class_specification}       
  22.   
  23. 优化   
  24. -dontoptimize    不优化输入的类文件   
  25. -assumenosideeffects {class_specification}    优化时假设指定的方法,没有任何副作用   
  26. -allowaccessmodification    优化时允许访问并修改有修饰符的类和类的成员   
  27.   
  28. 混淆   
  29. -dontobfuscate    不混淆输入的类文件   
  30. -printmapping {filename}   
  31. -applymapping {filename}    重用映射增加混淆   
  32. -obfuscationdictionary {filename}    使用给定文件中的关键字作为要混淆方法的名称   
  33. -overloadaggressively    混淆时应用侵入式重载   
  34. -useuniqueclassmembernames    确定统一的混淆类的成员名称来增加混淆   
  35. -flattenpackagehierarchy {package_name}    重新包装所有重命名的包并放在给定的单一包中   
  36. -repackageclass {package_name}    重新包装所有重命名的类文件中放在给定的单一包中   
  37. -dontusemixedcaseclassnames    混淆时不会产生形形色色的类名   
  38. -keepattributes {attribute_name,...}    保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and   
  39.   
  40. InnerClasses.   
  41. -renamesourcefileattribute {string}    设置源文件中给定的字符串常量  

demo 实例

  1. -ignorewarnings                     # 忽略警告,避免打包时某些警告出现  
  2. -optimizationpasses 5               # 指定代码的压缩级别  
  3. -dontusemixedcaseclassnames         # 是否使用大小写混合  
  4. -dontskipnonpubliclibraryclasses    # 是否混淆第三方jar  
  5. -dontpreverify                      # 混淆时是否做预校验  
  6. -verbose                            # 混淆时是否记录日志  
  7. -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*        # 混淆时所采用的算法  
  8.   
  9. -libraryjars   libs/treecore.jar  
  10.   
  11. -dontwarn android.support.v4.**     #缺省proguard 会检查每一个引用是否正确,但是第三方库里面往往有些不会用到的类,没有正确引用。如果不配置的话,系统就会报错。  
  12. -dontwarn android.os.**  
  13. -keep class android.support.v4.** { *; }        # 保持哪些类不被混淆  
  14. -keep class com.baidu.** { *; }    
  15. -keep class vi.com.gdi.bgl.android.**{*;}  
  16. -keep class android.os.**{*;}  
  17.   
  18. -keep interface android.support.v4.app.** { *; }    
  19. -keep public class * extends android.support.v4.**    
  20. -keep public class * extends android.app.Fragment  
  21.   
  22. -keep public class * extends android.app.Activity  
  23. -keep public class * extends android.app.Application  
  24. -keep public class * extends android.app.Service  
  25. -keep public class * extends android.content.BroadcastReceiver  
  26. -keep public class * extends android.content.ContentProvider  
  27. -keep public class * extends android.support.v4.widget  
  28. -keep public class * extends com.sqlcrypt.database  
  29. -keep public class * extends com.sqlcrypt.database.sqlite  
  30. -keep public class * extends com.treecore.**  
  31. -keep public class * extends de.greenrobot.dao.**  
  32.   
  33.   
  34. -keepclasseswithmembernames class * {       # 保持 native 方法不被混淆  
  35.     native <methods>;  
  36. }  
  37.   
  38. -keepclasseswithmembers class * {            # 保持自定义控件类不被混淆  
  39.     public <init>(android.content.Context, android.util.AttributeSet);  
  40. }  
  41.   
  42. -keepclasseswithmembers class * {            # 保持自定义控件类不被混淆  
  43.     public <init>(android.content.Context, android.util.AttributeSet, int);  
  44. }  
  45.   
  46. -keepclassmembers class * extends android.app.Activity { //保持类成员  
  47.    public void *(android.view.View);  
  48. }  
  49.   
  50. -keepclassmembers enum * {                  # 保持枚举 enum 类不被混淆  
  51.     public static **[] values();  
  52.     public static ** valueOf(java.lang.String);  
  53. }  
  54.   
  55. -keep class * implements android.os.Parcelable {    # 保持 Parcelable 不被混淆  
  56.   public static final android.os.Parcelable$Creator *;  
  57. }  
  58.   
  59. -keep class MyClass;                              # 保持自己定义的类不被混淆  
3、文件

在release模式下打包apk时会自动运行ProGuard,这里的release模式指的是通过ant release命令或eclipse project->android tools->export signed(unsigned) 
application package生成apk。
在debug模式下为了更快调试并不会调用proguard。
 
如果是ant命令打包apk,proguard信息文件会保存于<project_root>/bin/proguard文件夹内;
如果用eclipse export命令打包,会在<project_root>/proguard文件夹内。其中包含以下文件:

mapping.txt
表示混淆前后代码的对照表,这个文件非常重要。如果你的代码混淆后会产生bug的话,log提示中是混淆后的代码,希望定位到源代码的话就可以根据mapping.txt反推。
每次发布都要保留它方便该版本出现问题时调出日志进行排查,它可以根据版本号或是发布时间命名来保存或是放进代码版本控制中。


dump.txt
描述apk内所有class文件的内部结构。

seeds.txt
列出了没有被混淆的类和成员。

usage.txt
列出了源代码中被删除在apk中不存在的代码。

4、不能混淆的代码

顾名思义,不能混淆代码,否则会出错。

1、放射的地方

2、系统接口

3、Jni接口

4、

android.app.backup.BackupAgentHelper
android.preference.Preference

com.android.vending.licensing.ILicensingService

……

5、bug(常见错误)
1、Proguard returned with error code 1. See console

1、更新proguard版本  
2、android-support-v4 不进行混淆

3、添加缺少相应的库

2、使用gson包解析数据时,出现missing type parameter异常

1、在 proguard.cfg中添加

  1. -dontobfuscate  
  2. -dontoptimize  

2、在 proguard.cfg中添加

  1. # removes such information by default, so configure it to keep all of it.  
  2. -keepattributes Signature  
  3.   
  4.   
  5. # Gson specific classes  
  6. -keep class sun.misc.Unsafe { *; }  
  7. #-keep class com.google.gson.stream.** { *; }  
  8.   
  9.   
  10. # Application classes that will be serialized/deserialized over Gson  
  11. -keep class com.google.gson.examples.android.model.** { *; }  
3、类型转换错误
-keepattributes Signature
4、空指针异常

混淆过滤掉相关类与方法

5、安卓代码混淆与反射冲突,地图无法显示等问题解决及反编译方法,安卓反编译

     此前的代码混淆,因为并没有用到反射,所以常规的代码混淆方式一遍就能通过,而此项目中某些类利用到了反射机制(本人的这个项目中有即时通讯功能,所以有表情类资源,因此需要通过反射由文件名找到表情资源id),当由文件名去寻找资源id时就报空指针异常了,期初我并不知道什么原因,通过反编译已经混淆的apk,一步一步寻找到出错的地方,才恍然大悟,正是反射那一步出现了问题:Field field = R.drawable.class.getDeclaredField(name);走到这一步就挂了,程序直接崩溃。

解决办法:
   1.在proguard.cfg文件中,将反射用到的类中的变量不被混淆:
   如:-keep public class com.byl.bean.Expressions { *; },表示Expressions 这个类及类中的所有变量及方法不被混淆,注意要写全路径;
   2.过滤泛型:-keepattributes Signature
   3.最重要的一点:保持R文件不被混淆,否则,你的反射是获取不到资源id的:-keep class **.R$* {*;}


补充一下:上个问题解决后,接下来又遇到了一个问题就是混淆后,地图无法正常使用了,博主使用的是百度地图,在proguard.cfg也已经写明了:
-keep class com.baidu.**   {*;}
-keep class vi.com.**   {*;}

6、android.provider.Settings$Global

# Project target.
target=android-19

7、java.lang.reflect.UndeclaredThrowableException

-keep interface com.dev.impl.**

8、内存溢出和无法写入堆栈
javaOptions in proguard := Seq(...)
or
javaOptions in (Proguard, proguard) := Seq(...)
9、Error: Unable to access jarfile ..\lib\proguard.jar

路径问题

10、java.lang.NoSuchMethodError
没有相关方法,方法被混淆了,混淆过滤掉相关方法便可。
11、专业网站bug解决方法

http://proguard.sourceforge.net/index.html#manual/troubleshooting.html

总结


有了混淆技术,代码再也不用担心被偷了…

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

相关推荐

Android混淆处理与Proguard配置详解

Proguard配置文件是构建过程中控制混淆行为的核心载体。通过配置文件,开发者可以指定哪些类、方法或字段需要保留、混淆或优化。理解其种类与作用是配置的第一步。当多个配置文件中存在相同规则时,Proguard会进行合并处理。合并机制遵循以下原则:相同规则的叠加:如多个文件中都使用-keep保留某类,最终效果是保留该类;优先级覆盖:若存在冲突规则(如一个保留、一个删除),则优先级高的配置文件中的规则生效;自动去重:重复的指令会被自动合并,避免冗余。例如,假设。

weixin_35756637的博客 1023

混淆配置

本文转自:点击打开链接 Android 混淆配置 一、proguard 原理 Java代码编译成二进制class 文件,这个class 文件也可以反编译成源代码 。除了注释外,原来的code 基本都可以看到。 为了防止重要code 被泄露,我们往往需要混淆(Obfuscation code ), 也就是把方法,字段,包和类这些java 元素的名称改成无意义的名称,这样代码结构没有变化,还可

gaitiangai的专栏 4952

研究生课程笔记:软件包在流行病学中的应用(三)——STATA软件

关键词:STATA软件基本操作、STATA对于流行病学研究的实现、STATA对复杂抽样设计样本量计算的实现 一、STATA软件基本操作 这部分网上教程有很多,也可以直接根据stata自带的help功能进行自学,在此只记录课程中提及的功能项。 1. 变量编辑 1.1 赋值:label type(按精度区分) 1) 整型:int(32), short(16), long(32) 2) 实型:flo...

weixin_45463530的博客 2432

Android Proguard工具使用和配置详解

介绍Android Proguard工具的使用和配置方法

ccpat的专栏 2万+

Comsol单层焊缝焊接数值模拟:温度场与应力场全流程解析

在工程制造领域,有限元模拟是研究焊接热-力行为、优化工艺参数的重要工具。焊接过程涉及强烈的局部加热和快速冷却,材料经历复杂的非线性和相变,必须通过瞬态分析和热-力顺序耦合,才能准确捕捉移动热源作用下的温度演化与应力塑性积累。这一技术广泛应用于压力容器、船舶结构、车辆制造等场景,用以预测残余应力与变形、评估冷裂纹风险,并为工艺设计提供定量支撑。焊接数值模拟能否真正指导实践,关键在于热源校核、随温度变化的材料参数、合理的边界条件与网格策略。单层焊缝作为焊接模拟的基础模型,涵盖了移动热源加载、熔池形成、高温软化与

weixin_30444111的博客 220

保姆级教程:用北醒TFmini-i-CAN雷达给PixHawk飞控加装‘眼睛’,实现自动避障与定高

经过多次测试,前向雷达的最佳安装位置是机架前部下方5-10cm处,倾斜角度20-30度。电源方面,建议为CAN设备单独供电,避免电机启动时的电压骤降导致数据异常。北醒TFmini-i-CAN雷达与PixHawk飞控的组合,为DIY爱好者打开了低成本实现智能避障的大门。实际部署时,需确保整个CAN网络的波特率一致(TFmini-i默认为250kbps),每个设备具有唯一ID。雷达的安装角度也直接影响检测效果,建议通过3D打印支架将雷达向前下方倾斜15-30度。当使用多个雷达时,需为每个设备创建独立的参数组。

weixin_30892889的博客 337

ProGuard使用简介

ProGuard使用简介 背景简介: ProGuard是一个压缩、优化和混淆Java字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件。它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性,增加项目被反编译的难度。...

626

【Unity】入门教程第一期-下载安装Unity编辑器(下)

讲解如何在Unity Hub中下载Unity编辑器以及IED环境

Xiaoxin的博客 2040

Android ProGuard技术详解

目录 目录 ProGuard概述 ProGuard规则 语法 常用规则 ProGuard概述 ProGuard工具通过移除无用的代码以及使用语义隐晦的名称来重命名类、字段和方法,从而达到压缩、优化和混淆代码的目的。由于ProGuard会使应用更难于进行反向工程,因此当应用使用对安全性要求极高的功能时,必须使用此工具。 ProGuard规则 ProGuard之所

小一的专栏 4814

单细胞数据pseudobulks差异分析实战:从聚合到DESeq2

本文详细介绍了单细胞转录组数据分析中pseudobulks(伪散装)方法的实战流程。通过将同一样本的同类型细胞表达值聚合,模拟Bulk RNA-seq数据,再利用DESeq2进行稳健的差异基因分析。该方法有效降低了单细胞数据的技术噪音,特别适用于样本量有限但追求结果稳定性的研究场景,并提供了完整的R代码实现与结果解读指南。

sea99的博客 759

ECU-TEST 快速入门

ECU-TEST 是由位于德国德累斯顿的TraceTronic公司开发的一款用于嵌入式系统测试验证软件工具。自从2003年首次发布ECU-TEST ,该软件成为了汽车ECU开发的标准工具 ,同时也逐步成为了重型机械和工业自动化开发的标准工具 。该软件是起源自于一个控制单元的系统化测试的项目研究,从而为从德累斯顿工业大学脱离出来的TraceTronic公司奠定了基础。ECU-TEST旨在完成测试案例的规范化、评估、求解和归档。得益于该软件包含大量的自动化测试方法使得测试案例的所有必要功能如创建、求解和评估

wangying202的博客 1万+

Android Proguard混淆

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

fumeidonga的博客 2942

单细胞RNA测序数据分析与可视化:从基础原理到高级应用

单细胞RNA测序(scRNA-seq)技术通过解析单个细胞的基因表达谱,显著提升了我们对细胞异质性的理解。本文详细介绍了scRNA-seq数据分析的完整流程,包括数据预处理、质量控制、降维、聚类、差异表达分析、细胞类型注释、细胞周期分析、轨迹分析、RNA速率分析、基因集富集分析、细胞通讯分析、批次效应校正以及空间转录组学整合。文章还展示了scrna_toolkit包在简化分析流程和增强数据可视化方面的应用。通过这一工具,研究者可以更高效地处理单细胞数据,揭示复杂的生物学信息。未来,该工具将进一步整合多组学分

2301_80338712的博客 4128

安卓基础(ProGuard vs R8)

​​ProGuard​​ 通过多次遍历优化(如删除日志时连带清除字符串操作)和模式匹配(替换指令序列),使逆向工程更难还原原始逻辑。​​R8​​ 对Kotlin的优化(如内联函数处理)是ProGuard不具备的,适合现代Android开发。​​R8​​ 更侧重基础混淆(重命名、删除未使用代码),对深层逻辑的保护弱于ProGuard。​​ProGuard​​ 对Java反射库(如GSON)的优化更彻底,适合传统Java项目。

hongsegeming的博客 786

[AI] 嵌入模型选择:bge / text-embedding-3 / Jina Embeddings 对比与选型指南

摘要: 本文对比了BGE-M3、OpenAI和Jina三种主流嵌入模型在语言覆盖、性能、延迟、维度和成本等维度的差异。BGE-M3适合中文场景,本地部署成本低;OpenAI API多语能力强但依赖网络;Jina在多语表现突出但需关注商用许可。测试显示BGE-M3本地延迟3-6ms,OpenAI API延迟200-600ms。选型建议:隐私场景选BGE本地部署,多语低维护选OpenAI,高精度选Jina。部署时需注意批处理优化、向量库压缩和商用许可等问题,建议建立评测指标并监控关键指标。

每日出拳老爷子的博客 428

WINCC7.3破解文件

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

android picasso混淆,让你彻底会安卓Proguard混淆

代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。Proguard是什么Proguard是一个集文件压缩,优化,混淆和校验等功能的工具它检测并删除无用的类,变量,方法和属性它优化字节码并删除无用的指令.它通过将类名,变量名和方法名重命名为无意义的名称实现混淆效果.最后它还校验处理后的代码混淆的常见配置Proguard关...

weixin_42389770的博客 480

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Android中Proguard和JNI的相关问题

在Android项目中用到JNI,当用了proguard后,发现native方法找不到很多变量,原来是被produard优化掉了。所以,在JNI应用中该慎用progurad啊。 解决办法: 1、在Android.mk中加入一行: LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags 2、创建proguard

860

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

android+proguard目录,Android Proguard 详解

一般的商业项目都需要对代码进行加密,Android提供了一种代码混淆方法,介绍如下:一、简介1、简介混淆器通过删除从未用过的代码和使用晦涩名字重命名类、字段和方法,对代码进行压缩,优化和混淆。结果是一个比较小的.apk文件,该文件比较难进行逆向工程。因此,当你的应用程序对安全敏感(要求高),例如当你授权应用程序的时候,混淆器是一种重要的保护手段。混淆器被集成在android 构建系统中,所以你不必...

weixin_39650745的博客 480

android proguard

在Android项目中用到JNI,当用了proguard后,发现native方法找不到很多变量,原来是被produard优化掉了。所以,在JNI应用中该慎用progurad啊。 解决办法: (这个办法不靠谱,呵呵) 1、在Android.mk中加入一行:  LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags  2、创建

EvoShark的专栏 1603

Android Studio:ProGuard 混淆配置

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

doris_d的专栏 1万+

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

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

七月的南方博客 7765

Android 代码混淆Proguard

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

DeMonnnnnn 4468

Android Studio代码混淆,开启Proguard,稍微总结一下

一.首先看一下大佬的博客 https://blog.youkuaiyun.com/willba/article/details/79278092 https://www.jianshu.com/p/b5b2a5dfaaf4 https://blog.youkuaiyun.com/ccpat/article/details/52059344 做个纪念 https://blog.youkuaiyun.com/hnlgzb/ar...

hnlgzb的专栏 1985

Android中关于Proguard的一些记录

Proguard 是Android tools包中提供用来对代码进行压缩,优化和进行混淆的工具,它能够移除无用的代码,对类名,方法名,字段名进行重命名,但不改变代码的结构,从而达到对代码混淆的作用。而这样做的好处是我们可以得到一个更小的apk文件和一份更难以被反编译的代码。 在项目中使用Proguard,必须在project.properties修改如下: # This file is aut

持剑 2908
上一篇: ORMLite完全解析(二)官方文档第二章、如何使用ORMLite
下一篇: 字符编码ASCII, Unicode和UTF-8概念扫盲
ycwang_csdn
博客等级 码龄12年 17粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值