1.å¦ä½è¿è¡ODEXåç¼è¯å®ä¾
2.Java异步任务优化CompletionService
3.动态代理(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é项çåæ°ä¼ éè¿å»ï¼
Java异步任务优化CompletionService
在Java异步编程中,源码CompletionService扮演着优化Future和Callable任务的源码角色。传统Future设计的源码缺陷在于通过get方法获取结果时,如果任务未完成则阻塞线程,源码导致资源占用和效率低下。源码尤其在处理一批任务时,源码android cts 源码下载未完成任务的源码后续处理需等待所有任务完成,造成资源浪费和不合理的源码等待时间。
为解决上述问题,源码CompletionService应运而生。源码它允许同时提交多个任务,源码优先处理已完成的源码任务。通过使用ExecutorCompletionService作为CompletionService的源码实现类,开发者只需设置线程池并提交任务,源码CompletionService将自动管理任务的源码执行和结果的获取。
具体而言,ExecutorCompletionService的关键步骤包括设置线程池、提交任务和通过take方法获取已完成任务的Future。借助其内部类QueueingFuture,方维直播源码版本任务完成时会自动调用done方法,将任务结果放入阻塞队列中,进而被后续调用take方法的程序获取。
解析源码可见,ExecutorCompletionService的核心逻辑简明扼要。它通过submit方法将任务封装为FutureTask并作为QueueingFuture的属性保存,提交至线程池执行。执行完毕后,run方法调用done方法将FutureTask添加至阻塞队列。问答社区 开源源码最后,take方法从队列中获取已完成的任务。
总结而言,CompletionService通过优化任务执行和结果获取流程,显著提高了异步任务的执行效率和资源利用。作为Java程序员,理解和掌握CompletionService的使用,对于优化代码性能至关重要。
动态代理(2)-CGLIB核心原理和JDK区别
在先前的安卓自动登录源码文章中,我们探讨了动态代理的应用以及JDK动态代理的核心原理。本文将继续探讨CGLIB的核心原理及其与JDK动态代理的区别。
JDK动态代理存在一个限制,它无法代理那些没有实现接口的对象。这是因为动态代理需要通过实现接口来创建代理类。然而,这种限制在实际应用中可能引起一些不便。例如,当需要代理一个没有接口的静态h5源码第三方类,或者根本不希望编写接口时,这种限制就变得尤为明显。正是在这种背景下,CGLIB应运而生。
CGLIB通过创建一个继承目标类的代理类来实现动态代理。与JDK动态代理不同,CGLIB不通过实现接口来创建代理类,而是通过继承来达到目的。尽管方法的工作逻辑都需要在外部定义,并将其传递给自动生成的代理类,但CGLIB和JDK动态代理在这一方面是相似的。
在代码层面,CGLIB的使用方式与JDK动态代理相似。用户首先提出代理需求,然后Java自动生成代理类。这种模式在CGLIB中同样适用。
CGLIB的核心源码包括创建代理逻辑和生成class对象的方法。在创建代理逻辑时,CGLIB使用缓存机制来提高性能。当需要创建代理类时,如果缓存中不存在对应的类对象,则会将其包装为一个异步任务FutureTask,并将其放置在缓存中。这种设计可以有效地处理多线程环境下类对象的创建。
CGLIB生成的类包括代理对象类和两个FastClass。FastClass是对代理类和目标类方法的签名hash映射,这使得CGLIB可以直接调用这些方法,避免了反射调用。
总结来说,CGLIB和JDK动态代理在实现方式、性能和适用场景上存在一定的差异。JDK动态代理要求目标类实现接口,而CGLIB可以代理没有接口的类。此外,CGLIB采用继承的方式创建代理类,而JDK动态代理通过实现接口。在性能方面,CGLIB采用FastClass机制,避免了反射调用,从而提高了性能。