1.å¦ä½è¿è¡ODEXåç¼è¯å®ä¾
2.动态代理(2)-CGLIB核心原理和JDK区别
å¦ä½è¿è¡ODEXåç¼è¯å®ä¾
0x åè¨
使ç¨å¼æºå·¥å ·åºç°é®é¢èä¸å¾é¾å¨ç½ä¸æ¥æ¾å°è§£å³æ¹æ¡çæ¶åï¼æ好ç解å³æ¹æ³å°±æ¯ç 究å®çæºç ï¼å 为é£æ ·è½ä¸ºæ们æä¾æ´å¤çä¿¡æ¯ã
0x æ建smali/baksmaliæºç è°è¯ç¯å¢
é¦å æ们å¨githubä¸æåsmali/baksmaliçæºç
git clone /JesusFreke/smali.git
å¯ä»¥çåºè¯¥é¡¹ç®éç¨äºgradeèªå¨åæå»ºå·¥å ·æ¥ç¼è¯æºç çï¼å æ¤æ们å¯ä»¥å¨android studioä¸å¯¼å ¥è¯¥é¡¹ç®ï¼å¦ä¸å¾æ示ï¼
çæçbaksmaliå¨å¦ä¸ç®å½ä¸é¢ï¼
ä¸å¾ä¸çProgram argumentsä¸ï¼-aé项代表api levelï¼å¯ä»¥éè¿å¦ä¸å±æ§è·å¾ï¼
æ¥éå¦ä¸ï¼
Error occurred while disassembling classLandroid.support.v4.util.TimeUtils; - skipping class
java.lang.RuntimeException: Invalid methodindex:
atorg.jf.dexlib2.analysis.InlineMethodResolver$InlineMethodResolver_version.resolveExecuteInline(InlineMethodResolver.java:)
atorg.jf.dexlib2.analysis.MethodAnalyzer.analyzeExecuteInline(MethodAnalyzer.java:)
atorg.jf.dexlib2.analysis.MethodAnalyzer.analyzeInstruction(MethodAnalyzer.java:)
atorg.jf.dexlib2.analysis.MethodAnalyzer.analyze(MethodAnalyzer.java:)
atorg.jf.dexlib2.analysis.MethodAnalyzer.<init>(MethodAnalyzer.java:)
atorg.jf.baksmali.Adaptors.MethodDefinition.addAnalyzedInstructionMethodItems(MethodDefinition.java:)
atorg.jf.baksmali.Adaptors.MethodDefinition.getMethodItems(MethodDefinition.java:)
atorg.jf.baksmali.Adaptors.MethodDefinition.writeTo(MethodDefinition.java:)
atorg.jf.baksmali.Adaptors.ClassDefinition.writeDirectMethods(ClassDefinition.java:)
atorg.jf.baksmali.Adaptors.ClassDefinition.writeTo(ClassDefinition.java:)
atorg.jf.baksmali.baksmali.disassembleClass(baksmali.java:)
atorg.jf.baksmali.baksmali.access$(baksmali.java:)
atorg.jf.baksmali.baksmali$1.call(baksmali.java:)
atorg.jf.baksmali.baksmali$1.call(baksmali.java:)
atjava.util.concurrent.FutureTask.run(FutureTask.java:)
atjava.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:)
atjava.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:)
atjava.lang.Thread.run(Thread.java:)
æ们ç´æ¥éå®åºéçå°æ¹ï¼å¨ä¸é¢åºéä¿¡æ¯æ 红è²çå°æ¹ï¼å¹¶ä¸å¨æåºå¼å¸¸å¤ä¸æç¹ï¼æ们å¯ä»¥å¤æåºéåå æ¯å 为åç¼è¯smaliæ令execute-lineæ¶ä¼ å ¥äºä¸ä¸ªæªç¥çDalvikèææºçå é¨javaæ¹æ³ç´¢å¼inlineIndex=ï¼
ç¶åï¼æ们æinline.txtä½ä¸º-Té项çåæ°ä¼ éè¿å»ï¼
动态代理(2)-CGLIB核心原理和JDK区别
在先前的源码文章中,我们探讨了动态代理的源码应用以及JDK动态代理的核心原理。本文将继续探讨CGLIB的源码核心原理及其与JDK动态代理的区别。
JDK动态代理存在一个限制,源码它无法代理那些没有实现接口的源码对象。这是源码疯狂猜图源码因为动态代理需要通过实现接口来创建代理类。然而,源码这种限制在实际应用中可能引起一些不便。源码例如,源码当需要代理一个没有接口的源码第三方类,或者根本不希望编写接口时,源码这种限制就变得尤为明显。源码正是源码excel函数源码在这种背景下,CGLIB应运而生。源码
CGLIB通过创建一个继承目标类的源码代理类来实现动态代理。与JDK动态代理不同,CGLIB不通过实现接口来创建代理类,而是通过继承来达到目的。尽管方法的shopnc商城源码工作逻辑都需要在外部定义,并将其传递给自动生成的代理类,但CGLIB和JDK动态代理在这一方面是相似的。
在代码层面,CGLIB的使用方式与JDK动态代理相似。用户首先提出代理需求,然后Java自动生成代理类。.net框架源码这种模式在CGLIB中同样适用。
CGLIB的核心源码包括创建代理逻辑和生成class对象的方法。在创建代理逻辑时,CGLIB使用缓存机制来提高性能。当需要创建代理类时,如果缓存中不存在对应的嗍源码燕窝类对象,则会将其包装为一个异步任务FutureTask,并将其放置在缓存中。这种设计可以有效地处理多线程环境下类对象的创建。
CGLIB生成的类包括代理对象类和两个FastClass。FastClass是对代理类和目标类方法的签名hash映射,这使得CGLIB可以直接调用这些方法,避免了反射调用。
总结来说,CGLIB和JDK动态代理在实现方式、性能和适用场景上存在一定的差异。JDK动态代理要求目标类实现接口,而CGLIB可以代理没有接口的类。此外,CGLIB采用继承的方式创建代理类,而JDK动态代理通过实现接口。在性能方面,CGLIB采用FastClass机制,避免了反射调用,从而提高了性能。