• 【Android】proguard混淆代码


    【doc】http://developer.android.com/tools/help/proguard.html#configuring

    以下是简略的内容,如果需要仔细查看相关手册,请点击上述链接。

    一、步骤

    1、将proguard.cfg文件拷贝到XX工程下;如果新建工程时选择的Android版本是2.3及以上的,创建后工程下就会自带该文件

    2、在project.propertites文件中,加入语句:

        proguard.config=proguard.cfg  

    或者

        proguard.config=/path/to/proguard.cfg

    3、clean工程

    4、签名

    以上步骤即可完成一定保护代码的作用。

    二、例子说明

    测试XX.apk反编译获取相关文件,proguard.cfg脚本没有做任何修改

      使用apktool获取res资源文件 dex2jar获取src文件

    没有proguard

    可以 可以
    有proguard 可以 部分类的类名已混淆(a,b…),代码可读性下降

    三、文件说明

    【参考】http://developer.android.com/tools/help/proguard.html#configuring

    ProGuard运行结束后,输出以下文件:

    dump.txt          描述.apk文件中所有类文件间的内部结构

    mapping.txt     列出了原始的类,方法和字段名与混淆后代码间的映射。这个文件很重要,当你从release版本中收到一个bug报告时,可以用它来翻译被混淆的代码

    seeds.txt     列出了未被混淆的类和成员

    usage.txt     列出了从.apk中删除的代码

    这些文件放在以下文件夹中:

    · Ant:<project_root>/bin/proguard

    · Eclipse: <project_root>/proguard

    注意:每当你在release模式下编译时,这些文件都会被覆盖重写,当然,是被ProGuard工具生成的最新的文件所覆盖。每次你发布你的程序时,都应该保存一份,为了将来能够解码bug报告。

    四、脚本部分说明

    【参考】http://blog.csdn.net/laoyao_moyan/article/details/7353768

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

    五、其他

    1、过滤反射R文件的混淆

    -keep class **.R$* {   *;  }

    2、过滤第三方包的混淆

    -keep class packagename.** {*;}(其中packagename为第三方包的包名)

    作者:风倾清凌
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    Ubuntu 代理及系统信息修改
    名词解释
    第一章 用标准I/O函数将标准输入复制到标准输出 1-3
    Viewpager模仿微信主布局的三种方式 ViewPager,Fragment,ViewPager+FragmentPagerAdapter
    github入门到上传本地项目
    安卓界面篇(一) 自定义一个topbar
    ace布置小作业: 制作一个简单的电话号码归属地查询软件:JSON解析和Volly发送get请求
    android json解析及简单例子
    Volly框架的使用基础版及使用中的一些坑 Ace 网络篇(三)
    Android清单文件详解(三)----应用程序的根节点<application>
  • 原文地址:https://www.cnblogs.com/Amandaliu/p/3042914.html
Copyright © 2020-2023  润新知