android 项目生成jar混淆

现在需要做插件供第三方公司使用,做插件就不多做介绍,这里做插件的思路就是提供jar包代码,res-drawable,res-layout文件,libs相关jar就可以,使用的写法是反射res写法。

贴一段反射获取res的代码,

public  int getResourseIdByName(String packageName, String className,
            String name)
    {
        Class r = null;
        int id = 0;
        try
        {
        	//Open Declaration com.example.plugeinproject.R
            r = Class.forName(packageName + ".R");

            Class[] classes = r.getClasses();
            Class desireClass = null;

            for (int i = 0; i < classes.length; i++)
            {
                if (classes[i].getName().split("\\$")[1].equals(className))
                {
                    desireClass = classes[i];
                    break;
                }
            }

            if (desireClass != null)
                id = desireClass.getField(name).getInt(desireClass);
        } catch (ClassNotFoundException e)
        {
            e.printStackTrace();
        } catch (IllegalArgumentException e)
        {
            e.printStackTrace();
        } catch (SecurityException e)
        {
            e.printStackTrace();
        } catch (IllegalAccessException e)
        {
            e.printStackTrace();
        } catch (NoSuchFieldException e)
        {
            e.printStackTrace();
        }

        return id;

    }

这样就可以写出一个jar来,接下来需要做的就是混淆这个jar代码,就和android工程混淆类似

android工程打包jar包的思路可以参考链接:

http://www.tanglei.name/how-to-publish-anroid-sdk-to-developers/

http://blog.csdn.net/huangyic1986/article/details/7452177

http://blog.csdn.net/zp522123428/article/details/7437027


说明:导出jar文件为:右键src包-》export jar file -》选择第二项:export all output folder for checked projects,下面options选第一个:compress the content of the jar file

->点击next ,界面为几个勾选都为灰色不用管,第一二,四个选项都为选择状态,继续next,generate manifest下面不用勾选,sealed some package :nothing sealed,继续finish,然后export成功。


接下来需要一个工具,在android\sdk\tools\proguard\bin下面找proguardgui.jar,android\sdk\tools\proguard\bin\proguardgui.bat , 打开这个bat文件,

然后依次填入input jar,output jar,依赖libs(依赖libs包括项目需要的所有jar,包括android.jar),然后点击process,查看生成的xxx.pro是否正确,然后进行修改,

第二次,还是上述的导入input jar,output jar,依赖libs,然后在proguard中导入刚才生成的xxx.pro,然后再次点击process,就可以看到混淆后的jar了

这里的步骤没有图示不好理解的话可以参考这篇文章:

http://blog.csdn.net/android_panda/article/details/18604121


中间可能遇到问题,需要自己检查错误,这里贴一句话:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table,*Annotation*,Synthetic,EnclosingMethod,JavascriptInterface

其中最后一句比较关键,多修改修改就可以生成混淆后的jar,
然后使用jd-gui(android反编译的工具ApkDecompiler之一的小工具)打开这个混淆后的jar查看效果,看是否达到了效果

然后拿着这个jar放进第三方工程进行测试检验:

可能遇到很多问题,打包不成功,无法在bin下生成apk,

比如:类似:

 local variable type mismatch: attempt to set or access a value of type java.lang.Object using a local variable of type int. This is symptomatic of .class transformation tools that ignore local variable information. 

这种的,有人说是本应该暴露出来的参数或者类名被你混淆了,或者你把原来的变量类型改变了 造成变量类型不匹配,

Conversion to Dalvik format failed with error 1
这种的,要仔细看了看错误,其实说的也比较明确,对于错误,尽可能的还是分析错误本身,自己慢慢理解然后去解决,不然查来查去很费时间

所以还是请仔细检查xxx.pro混淆配置文件,看看到底哪些属性,方法在经过混淆后被改变了,我这里的办法是把上述贴出来的那一段的最后一句改为:

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,Synthetic,EnclosingMethod,JavascriptInterface

即去掉了
LocalVariable*Table,
这个,然后再次生成output.jar就可以使用了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值