现在需要做插件供第三方公司使用,做插件就不多做介绍,这里做插件的思路就是提供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就可以使用了