Android生成Jar包并混淆

xiaoxiao2021-02-28  112

公司下发新任务,需要提供SDK给合作伙伴,需求大概是这个样子的:

Created with Raphaël 2.1.0 APP APP SDK SDK BLE设备 BLE设备 请求数据 处理数据 返回给APP 请求数据 处理数据 返回给SDK

这个SDK需要从我们已有的项目中提出来的,还好该项目再前段时间整改过,使用的是目前比较流行的框架dagger2+Rxjava+retrofit+volley+butterknife,其中关于蓝牙通讯的代码已经整合成模块,这样再打成Jar也不是那么痛苦。废话不多说,进入正题。

一、开始第一行代码(将目标模块独立出来)

1.创建新工程

撸主使用Android studio开始了一个新工程,将上述蓝牙通讯模块移植进来。 这里面需要注意的是要以library的形式存在于主工程下:

2.配置gradle

先上图:

类库中依赖了第三方的maven,这里先Mark下,后面在混淆的时候有使用到。 这里面还有两个生成和删除jar的gradle语法,撸主对gradle也没有深入研究,有兴趣的同学可以自行查阅资料。

3.运行生成jar

在Android studio中使用Gradle Projects管理上述gradle,如图所示:

在mylibrary下的tasks点击other找到我们在gradle中定义的makeJar,双击运行,运行成功,日志如下:

然后我们build目录下找到该Jar文件

撸主这里一直没有找到release的文件夹,所以使用debug(虽然也是一样可以用),这也算是个心结,哪位同学知道,还请留言指点。

4.第一阶段完成

已生成的jar包,导入新工程中验证没问题。算是第一步有惊无险的完成了。


二、开始混淆jar

1.准备工作

使用Android SDK中自带工具proguard来实现混淆,其实这个混淆并不是很彻底,改变了一些变量的名称,以及将一些实例对象独立出类来,已达到混淆视听的目的。这个效果对于你我而言,已足够啦! 找到proguard工具,记得使用proguardgui.jar图形化的:

查看proguard版本:

建议使用5.1以上版本,猛戳地址:http://download.csdn.net/detail/hello_json/9894770下载5.1版本。

2.开始混淆代码

混淆前jar的文件目录如下(这里留图做对比):

执行proguard程序

配置Input/Output选项

配置Shrnking选项

配置Obfuscation选项

配置Optimization选项

配置Information选项

配置Process选项

撸主在运行的过程中出现了以下问题:

以及找不到no.nordicsemi.android.dfu.ota等文件。因为我再配置Input选项中没有添加nordic的依赖,所以才会出现此情况。 因此需要增加代码如下: -dontwarn no.nordicsemi.android.dfu.*,android.support.annotation.Nullable 表示不去理会这个两个错误。 如何增加?先将配置好的pro文件保存到本地,然后使用edit文档编辑器打开进行编辑,然后再打开proguard加载该配置文件。

3.混淆后的效果

老规矩,先上图:

其中增加的很多a b c 的类?比如说在A类中有个监听点击事件的listener,混淆后这个listener就有可能单独出去成为了a类。这样别人阅读起来就有些麻烦了。

三、关于proguard配置

参数: -include {filename} 从给定的文件中读取配置参数 -basedirectory {directoryname} 指定基础目录为以后相对的档案名称 -injars {class_path} 指定要处理的应用程序jar,war,ear和目录 -outjars {class_path} 指定处理完后要输出的jar,war,ear和目录的名称 -libraryjars {classpath} 指定要处理的应用程序jar,war,ear和目录所需要的程序库文件 -dontskipnonpubliclibraryclasses 指定不去忽略非公共的库类。 -dontskipnonpubliclibraryclassmembers 指定不去忽略包可见的库类的成员。

保留选项: -keep {Modifier} {class_specification} 保护指定的类文件和类的成员 -keepclassmembers {modifier} {class_specification} 保护指定类的成员,如果此类受到保护他们会保护的更好 -keepclasseswithmembers {class_specification} 保护指定的类和类的成员,但条件是所有指定的类和类成员是要存在。 -keepnames {class_specification} 保护指定的类和类的成员的名称(如果他们不会压缩步骤中删除) -keepclassmembernames {class_specification} 保护指定的类的成员的名称(如果他们不会压缩步骤中删除) -keepclasseswithmembernames {class_specification} 保护指定的类和类的成员的名称,如果所有指定的类成员出席(在压缩步骤之后) -printseeds {filename} 列出类和类的成员-keep选项的清单,标准输出到给定的文件

压缩 : -dontshrink 不压缩输入的类文件 -printusage {filename} -whyareyoukeeping {class_specification}

优化: -dontoptimize 不优化输入的类文件 -assumenosideeffects {class_specification} 优化时假设指定的方法,没有任何副作用 -allowaccessmodification 优化时允许访问并修改有修饰符的类和类的成员

混淆: -dontobfuscate 不混淆输入的类文件 -printmapping {filename} -applymapping {filename} 重用映射增加混淆 -obfuscationdictionary {filename} 使用给定文件中的关键字作为要混淆方法的名称 -overloadaggressively 混淆时应用侵入式重载 -useuniqueclassmembernames 确定统一的混淆类的成员名称来增加混淆 -flattenpackagehierarchy {package_name} 重新包装所有重命名的包并放在给定的单一包中 -repackageclass {package_name} 重新包装所有重命名的类文件中放在给定的单一包中 -dontusemixedcaseclassnames 混淆时不会产生形形色色的类名 -keepattributes {attribute_name,…} 保护给定的可选属性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and InnerClasses. -renamesourcefileattribute {string} 设置源文件中给定的字符串常量

转载请注明原文地址: https://www.6miu.com/read-39864.html

最新回复(0)