android项目对apk进行混淆

android项目对apk进行混淆,第1张

    混淆apk是一个很基础的工作,博客上也有一堆介绍,本文提供一下这类工作的解决思路。在安卓源码下面和android studio里面的做法差异不大,本文以android源码举例。

    首先在对应mk文件里面添加proguard enabled的语句,系统有一个自带的build/core/proguard.flags,默认是使用这个文件,而且一般项目默认是关闭的,这也是有原因的。因为这里的proguard.flags是没有针对app的配置的,使用默认的混淆,app很有可能就不工作了。

    添加了mk文件修改之后,在Android.mk同级根目录创建本app自有的proguard.flags。新增内容如下,这里需要注意,网上很多demo,基本分为三部分,一部是保留app基础功能部分的内容不混淆2是保持app对外接口,例如get、set、isxx、AIDL、public、native层的接口或者类3.是第三方jar包或接口。混淆的基本原理就是将上诉类或接口进行统一简单字母的替换,如果改变了这些对外接口的名字,很有可能被别人使用的时候就找不到对应哦接口

    一些第三方的库如何不进行混淆,这个根据项目特点,可以自行搜索,比如百度的地图包什么的。

    然后是如何验证和解决混淆过程遇到的问题,因为是对接口名进行替换,如果出现混淆问题的话,log里面一定会有类似

这个时候只需要对相关接口进行例外(-keep)即可,然后用android-studio,直接打开或者dex2jar进行反解可以看到相关的接口是否被简单替换。

针对android 选择user版本进行编译的时候,会出现proguard错误,我们需要知道的事情

1.proguard是做什么的,他的作用是将java代码进行混淆的工具

2.因为proguard是混淆工具,所以android的mk文件也对其支持为两种方式:

1.指定不需要混淆的native方法与变量的proguard.flags文件

如:LOCAL_PROGUARD_FLAG_FILES := proguard.flags

2.制定编译的工程,不要使用代码混淆的工具进行代码混淆

如:LOCAL_PROGUARD_ENABLED := disabled

3.不设置,默认使用LOCAL_PROGUARD_ENABLED := full.即将该工程代码全部混淆

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

在Android项目中用到JNI,当用了proguard后,发现native方法找不到很多变量,原来是被produard优化掉了。所以,在JNI应用中该慎用progurad啊。

解决办法:

1、在Android.mk中加入一行:

LOCAL_PROGUARD_FLAGS := -include $(LOCAL_PATH)/proguard.flags

2、创建proguard.flag文件,里面写入不需要proguard优化的类和方法。例如:

-keep class oms.miracle.mobiletv.broadcast.ServiceContext {

*

}

我的这个类是和JNI相关的,不想让proguard去优化而引起错误,向上面写就能实现。

----------下面是网上找到的一些proguard的资料,贴出来分享:

ProGuard是一个免费的java类文件压缩,优化,混淆器.它探测并删除没有使用的类,字段,方法和属性.它删除没有用的说明并使用字节码得到最大优化.它使用无意义的名字来重命名类,字段和方法.

ProGuard的使用是为了:

1.创建紧凑的代码文档是为了更快的网络传输,快速装载和更小的内存占用.

2.创建的程序和程序库很难使用反向工程.

3.所以它能删除来自源文件中的没有调用的代码

4.充分利用java6的快速加载的优点来提前检测和返回java6中存在的类文件.

参数:

-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选项的清单,标准输出到给定的文件


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/bake/11916260.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存