CN108897588B - 一种用于模块间通信的路由方法和路由装置 - Google Patents
一种用于模块间通信的路由方法和路由装置 Download PDFInfo
- Publication number
- CN108897588B CN108897588B CN201810744060.2A CN201810744060A CN108897588B CN 108897588 B CN108897588 B CN 108897588B CN 201810744060 A CN201810744060 A CN 201810744060A CN 108897588 B CN108897588 B CN 108897588B
- Authority
- CN
- China
- Prior art keywords
- file
- class
- unit
- java
- jar
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Active
Links
Images
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F9/00—Arrangements for program control, e.g. control units
- G06F9/06—Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
- G06F9/44—Arrangements for executing specific programs
- G06F9/448—Execution paradigms, e.g. implementations of programming paradigms
- G06F9/4488—Object-oriented
- G06F9/449—Object-oriented method invocation or resolution
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/41—Compilation
- G06F8/44—Encoding
- G06F8/447—Target code generation
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/40—Transformation of program code
- G06F8/53—Decompilation; Disassembly
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F8/00—Arrangements for software engineering
- G06F8/70—Software maintenance or management
- G06F8/75—Structural analysis for program understanding
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- General Engineering & Computer Science (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本申请提供一种用于模块间通信的路由方法和路由装置,包括扫描并解压APP的APK文件,获取APK文件中的AndroidManifest文件;从AndroidManifest文件中获取Activity的完整类名或Servic的完整类名;遍历dex文件,根据Activity或Service的完整类名反编译得到类的信息;遍历获得的所有类,提取出public static或public static final的方法;将所有方法创建成java文件;将java文件编译成class文件;将class文件编译成jar文件;将jar文件存储至业务模块中,使得业务模块使用provided的引用方式引用jar文件。
Description
技术领域
本申请涉及通信技术领域,尤其涉及一种用于模块间通信的路由方法和路由装置。
背景技术
一款APP(Application,应用程序)达到一定体量的时候,业务就会膨胀得比较严重,开发团队的规模也会越来越大,这时一般都会提出组件化的概念。组件化是指将APP按照一定的功能和业务拆分成多个业务模块,不同的业务模块由不同的开发小组来负责,这样就可以解决大型APP开发过程中的开发与协作的问题。
进行组件化开发后,各业务模块间相互独立,无法进行通信,但在实际应用时,各业务模块间一般都是存在信息交互的,比如直播间模块需要调用登录模块,由此进一步提出了,采用路由工具实现业务模块间的通信。
现有的路由工具包括阿里巴巴的ARouter,但是ARouter存在以下缺点:学习和使用成本高;侵入性比较强,完全破坏了Android原有的开发习惯;运行时消耗了设备性能,如手机性能。
发明内容
有鉴于此,本申请提供一种用于模块间通信的路由方法和路由装置。技术方案如下:
基于本申请的一方面,本申请提供一种用于模块间通信的路由方法,包括:
扫描并解压应用程序APP的安卓安装包APK文件,获取所述APK文件中的AndroidManifest文件;
从所述AndroidManifest文件中获取Activity的完整类名或Servic的完整类名;
遍历dex文件,根据所述Activity的完整类名或Service的完整类名反编译得到类的信息;
遍历获得的所有类,提取出public static或public static final的方法;
将提取出的所有方法创建成java文件;
将所述java文件编译成class文件;
将所述class文件编译成jar文件;
将所述jar文件存储至业务模块中,以使得所述业务模块使用provided的引用方式引用所述jar文件。
可选地,所述路由方法还包括:
在所述业务模块生成aar文件的过程中,比较编译后的路径分别与所述jar文件中各个类的类名是否一致;
将所述jar文件中类名与编译后的路径一致的类,确定为发生冲突的索引类;
删除所述jar文件中发生冲突的索引类。
可选地,所述路由方法还包括:
在所述业务模块生成aar文件的过程中,生成索引jar的jar格式的映射文件jarMapping;
获取存在映射关系的java文件的md5值,判断所述md5值是否存在于java格式的映射文件javaMapping中;
如果存在,则继续获取下一存在映射关系的java文件的md5值,并继续判断该md5值是否存在于所述javaMapping中;
如果不存在,则获取所述存在映射关系的java文件的所有外部导入的报名import,判断获取的所有import是否存在于所述jarMapping中;
如果存在,将所述存在映射关系的java文件的md5值以及所获取的所有import存储至配置区;
将所述配置区生成的配置文件和所述业务模块生成的aar文件输出至默认目录下。
可选地,所述路由方法还包括:
在主工程编译时,从所述默认目录下获取配置文件;
在编辑后的目录中查找所述主工程的索引清单中的类,结合所获取到的配置文件,判断所述主工程的索引清单中的类的方法是否存在;
如果不存在,发出提示消息。
可选地,所述路由方法还包括:
预先在AndroidManifest文件中注册一个Activity类用来占坑,以及预先在gradle中配置好初始化参数;
在Application中进行初始化后,通过钩子技术钩住系统关键类android.app.IActivityManager;
当启动索引Activity时,自动跳转至用来模拟的Activity中。
基于本申请的另一方面,本申请提供一种用于模块间通信的路由装置,包括:
扫描解压处理单元,用于扫描并解压应用程序APP的安卓安装包APK文件;
AndroidManifest文件获取单元,用于获取所述APK文件中的AndroidManifest文件;
完整类名获取单元,用于从所述AndroidManifest文件中获取Activity的完整类名或Servic的完整类名;
反编译单元,用于遍历dex文件,根据所述Activity的完整类名或Service的完整类名反编译得到类的信息;
方法提取单元,用于遍历获得的所有类,提取出public static或public staticfinal的方法;
java文件建成单元,用于将提取出的所有方法创建成java文件;
第一编译单元,用于将所述java文件编译成class文件;
第二编译单元,用于将所述class文件编译成jar文件;
第一存储单元,用于将所述jar文件存储至业务模块中,以使得所述业务模块使用provided的引用方式引用所述jar文件。
可选地,所述路由装置还包括:
比较单元,用于在所述业务模块生成aar文件的过程中,比较编译后的路径分别与所述jar文件中各个类的类名是否一致;
冲突索引类确定单元,用于将所述jar文件中类名与编译后的路径一致的类,确定为冲突的索引类;
冲突索引类删除单元,用于删除所述jar文件中冲突的索引类。
可选地,所述路由装置还包括:
jarMapping生成单元,用于在所述业务模块生成aar文件的过程中,生成索引jar的jar格式的映射文件jarMapping;
md5值获取单元,用于获取存在映射关系的java文件的md5值;
第一判断单元,用于判断所述md5值是否存在于java格式的映射文件javaMapping中;
所述md5值获取单元还用于,在所述第一判断单元判断所述md5值存在于所述javaMapping中时,继续获取下一存在映射关系的java文件的md5值,并继续触发所述第一判断单元;
import获取单元,用于在所述第一判断单元判断所述md5值不存在于所述javaMapping中时,获取所述存在映射关系的java文件的所有外部导入的报名import;
第二判断单元,用于判断获取的所有import是否存在于所述jarMapping中;
第二存储单元,用于在所述第二判断单元判断获取的所有import存在于所述jarMapping中时,将所述存在映射关系的java文件的md5值以及所获取的所有import存储至配置区;
输出单元,用于将所述配置区生成的配置文件和所述业务模块生成的aar文件输出至默认目录下。
可选地,所述路由装置还包括:
配置文件获取单元,用于在主工程编译时,从所述默认目录下获取配置文件;
查找单元,用于在编辑后的目录中查找所述主工程的索引清单中的类;
第三判断单元,用于结合所获取到的配置文件,判断所述主工程的索引清单中的类的方法是否存在;
提示单元,用于在所述第三判断单元判断所述主工程的索引清单中的类的方法不存在时,发出提示消息。
可选地,所述路由装置还包括:
预处理单元,用于预先在AndroidManifest文件中注册一个Activity类用来占坑,以及预先在gradle中配置好初始化参数;
系统关键类获取单元,用于在Application中进行初始化后,通过钩子技术钩住系统关键类android.app.IActivityManager;
跳转单元,用于当启动索引Activity时,自动跳转至用来模拟的Activity中。
本申请提供的用于模块间通信的路由方法和路由装置中,通过扫描并解压APP的APK文件,获取所述APK文件中的AndroidManifest文件;进而从AndroidManifest文件中获取Activity的完整类名或Servic的完整类名,遍历dex文件,根据所述Activity的完整类名或Service的完整类名反编译得到类的信息,即反编译得到Android四大组件的类,最后遍历获得的所有类,提取出public static或public static final的方法,依次创建、编译得到jar文件,即得到一个索引文件。将jar文件存储至各业务模块中,能够实现在不同业务模块间创建交集,本申请称之为交集档,该创建的交集档有着各个业务模块的通讯桥梁,即类,但是这些类并不需要是真正的类,本申请实际提供的是一个索引类。一个业务模块需要调用另一个业务模块,比如直播间模块需要调用登录模块时,直播间模块直接在该交集档中调用登录模块的jar文件,即可使用该登陆模块的方法。本申请提供的用于模块间通信的路由方法,学习和使用成本低、无侵入性操作,完全保留原有的开发习惯,且运行时不消耗设备性能。
附图说明
为了更清楚地说明本申请实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本申请的实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据提供的附图获得其他的附图。
图1为本申请实施例提供的一种用于模块间通信的路由方法的流程图;
图2为本申请实施例提供的另一种用于模块间通信的路由方法的流程图;
图3为本申请实施例提供的再一种用于模块间通信的路由方法的流程图;
图4为本申请实施例提供的再一种用于模块间通信的路由方法的流程图;
图5为本申请实施例提供的再一种用于模块间通信的路由方法的流程图;
图6为本申请实施例提供的一种用于模块间通信的路由装置的结构示意图。
具体实施方式
下面将结合本申请实施例中的附图,对本申请实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本申请一部分实施例,而不是全部的实施例。基于本申请中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本申请保护的范围。
本申请提供的用于模块间通信的路由方法中,主要涉及四个路由工具,分别为创建业务模块间交集,负责生成整个项目的映射关系的工具一、解决映射关系和业务模块本身的代码冲突的工具二(即模块端gradle插件)、在主工程运行时,用于检查工具二输出的调用关系是否存在错误的工具三(即宿主端gradle插件)、以及在一个业务模块(如业务模块A)调用另一个业务模块(如业务模块B)的方法时,提供假数据进行调试的模拟跳转工具(即工具四)。
下面,申请人将对本申请提供的用于模块间通信的路由方法,分别从上述四个路由工具的角度进行描述。
首先对于利用工具一实现创建业务模块间交集,生成整个项目的映射关系的方法可参阅图1所示,方法具体包括:
步骤101,扫描并解压APP的APK(AndroidPackage,安卓安装包)文件,获取所述APK文件中的AndroidManifest文件。
AndroidManifest文件是Android应用的入口文件,描述了package中暴露的组件(如Activities、Services等)各自的实现类、以及各种能被处理的数据和启动位置。AndroidManifest文件除了能声明应用程序中的Activities、ContentProviders、Services和Intent Receivers,还能指定permissions和instrumentation(安全控制和测试)。
步骤102,从所述AndroidManifest文件中获取Activity的完整类名或Service的完整类名。
其中Activity是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务;Service是Android后台服务,用于执行一些跟UI无关的操作,比如下载文件,播放音乐等。
本申请中,AndroidManifest文件是整个应用程序的信息描述文件,定义了应用程序中包含的Activity、Service、Content provider和BroadcastReceiver组件信息。每个应用程序在根目录下必须包含一个AndroidManifest文件,且其文件名不能修改。
在实际应用过程中,AndroidManifest文件主要提供了如下的信息描述:
命名应用程序的java包,该java包的包名用于唯一标识应用程序;
描述了应用程序中包含的Activity、Service、ContentProvider和BroadcastReceiver组件;
定义了应用程序运行的进程;
声明了应用程序需要访问受限API所需的权限;
声明其他程序如果希望访问本程序组件所需要的权限;
声明应用程序能够正常运行所需要的最小级别的OphoneAPI;
列出应用程序运行所需要连接的库等。
具体在本申请中,从AndroidManifest文件中获取Activity的完整类名或Service的完整类名,以用于在反编译时,通过Activity的完整类名或Service的完整类名,寻找到正确的要反编译的文件。
步骤103,遍历dex文件,根据所述Activity的完整类名或Service的完整类名反编译得到类的信息。
具体地,本申请遍历所有的dex文件,根据Activity的完整类名或Service的完整类名,使用dexlib2工具反编译获取得到所有类的信息。
步骤104,遍历获得的所有类,提取出public static或public static final的方法。
其中public static用于表达公共的静态方法或公共的静态变量,public staticfinal用于表达公共的常量。
本申请在获取到所有类的信息后,将获得的所有类进行遍历,从中提取出publicstatic或public static final的方法。
步骤105,将提取出的所有方法创建成java文件。
Java为编程语言Java的源代码文件格式。
步骤106,将所述java文件编译成class文件。
class为编程语言Java编译后的字节码文件。
步骤107,将所述class文件编译成jar文件。
jar为编程语言Java编译后的字节码文件集合。
步骤108,将所述jar文件存储至业务模块中,以使得所述业务模块使用provided的引用方式引用所述jar文件。
本申请中,通过扫描并解压APP的APK文件,获取所述APK文件中的AndroidManifest文件;进而从AndroidManifest文件中获取Activity的完整类名或Servic的完整类名,遍历dex文件,根据所述Activity的完整类名或Service的完整类名反编译得到类的信息,即反编译得到Android四大组件的类,最后遍历获得的所有类,提取出publicstatic或public static final的方法,依次创建、编译得到jar文件,即得到一个索引文件。将jar文件存储至各业务模块中,能够实现在不同业务模块间创建交集,本申请称之为交集档,该创建的交集档有着各个业务模块的通讯桥梁,即类,但是这些类并不需要是真正的类,本申请实际提供的是一个索引类。一个业务模块需要调用另一个业务模块,比如直播间模块需要调用登录模块时,直播间模块直接在该交集档中调用登录模块的jar文件,即可使用该登陆模块的方法。本申请提供的用于模块间通信的路由方法,学习和使用成本低、无侵入性操作,完全保留原有的开发习惯,且通过索引文件的使用来解决不同业务模块间的通讯问题,相比与现有的ARouter,本申请在代码运行过程中的消耗是零,运行时不消耗设备性能。
上述实施例提供了利用工具一实现业务模块间创建交集,实现在不同业务模块间建立映射关系(即索引文件),从而实现不同业务模块间通过调用映射关系使用不同业务模块的方法。然而在实际应用过程中,有些业务模块本身的代码可能与调用的业务模块的方法存在冲突,因此,在上述实施例的基础上,结合图2所示,本申请利用模块端gradle插件实现映射关系和业务模块本身的代码冲突的检测,方法包括:
步骤201,在业务模块生成aar文件的过程中,比较编译后的路径分别与所述jar文件中各个类的类名是否一致。
具体地,在业务模块将源代码生成aar文件的过程中,比较源代码编译后的路径分别和jar文件中的各个类的类名是否一致,如果一致,说明发生一致情况的业务模块本身的代码和jar文件中的类之间发生冲突。
步骤202,将所述jar文件中类名与编译后的路径一致的类,确定为发生冲突的索引类。
步骤203,删除所述jar文件中发生冲突的索引类。
对于jar文件中类名与源代码编译后的路径一致的类,本申请将其确定为发生冲突的索引类,进而将jar文件中确定的所有发生冲突的索引类删除,此时jar文件中余下的类作为业务模块的类。本申请实现了类冲突的检测处理,降低了类冲突的发生概率。
作为本申请的一个可选实施例,如图3所示,本申请还可以包括:
步骤301,在业务模块生成aar文件的过程中,生成索引jar的jarMapping(jar格式的映射文件)。
这里生成的索引jar的jarMapping指的是源代码java文件的jarMapping。
步骤302,获取存在映射关系的java文件的md5值。
步骤303,判断所述md5值是否存在于javaMapping(java格式的映射文件)中。如果存在,执行步骤304,如果不存在,执行步骤305。
javaMapping是一个java文件的md5集合,本申请依据获取的存在映射关系的java文件的md5值先去javaMapping中查找,如果javaMapping中已有该md5,则跳过本次获取的存在映射关系的java文件,并继续获取下一存在映射关系的java文件。
步骤304,获取下一存在映射关系的java文件的md5值,并返回执行步骤303。
步骤305,获取所述存在映射关系的java文件的所有import(外部导入的报名)。
步骤306,判断获取的所有import是否存在于所述jarMapping中。如果存在,执行步骤307。
jarMapping是jar文件的类名集合,本申请将获取的所有import分别与jarMapping中的类名进行比较,判断所获取的import是否存在于所述jarMapping中。
步骤307,将所述存在映射关系的java文件的md5值以及所获取的所有import存储至配置区。
本申请中,配置区用于放置临时生成的java文件的md5集合以及所有java文件的所有import的类集合。
步骤308,将所述配置区生成的配置文件和所述业务模块生成的aar文件输出至默认目录下。
具体地,本申请将配置文件和aar文件输出至开发工程目录下的build/aar目录下。
本申请实施例通过利用模块端gradle插件实现业务模块间映射关系和业务模块本身的代码冲突的检测。
本申请中,宿主端gradle插件在主工程运行时,检查模块端gradle插件输出的调用关系是否存在错误的实现方法如图4所示,方法包括:
步骤401,在主工程编译时,从所述默认目录下获取配置文件。
具体地,在主工程编译时,宿主端gradle插件从开发工程目录下的build/aar目录下获取配置文件。
步骤402,在编辑后的目录中查找所述主工程的索引清单中的类,结合所获取到的配置文件,判断所述主工程的索引清单中的类的方法是否存在。如果不存在,执行步骤403,如果存在,结束流程。
在java中,一个类中可以包含多个方法。本申请在编辑后的目录中查找到主工程的索引清单中的类的方法后,将其与配置文件进行比较,判断主工程的索引清单中的类的方法是否存在。如果不存在,及时发出提示消息。
步骤403,发出提示消息。
其中发出提示消息例如为输出方法不存在的提示框等。
本申请实施例中,宿主端gradle插件实现了静态代码的安全检测,避免了修改方法导致模块端无法正确引用而出现方法找不到的异常情况的发生。
本申请中,模拟跳转工具在一个业务模块(如业务模块A)调用另一个业务模块(如业务模块B)的方法时,提供假数据进行调试的实现方法如图5所示,方法包括:
步骤501,预先在AndroidManifest文件中注册一个Activity类用来占坑,以及预先在gradle中配置好初始化参数。
步骤502,在Application中进行初始化后,通过钩子技术钩住系统关键类android.app.IActivityManager。
步骤503,当启动索引Activity时,自动跳转至用来模拟的Activity中。
本申请实施例中,模拟跳转工具可以通过模拟跳转来模拟参数,更好的对模块端开发提供调试数据,解决了模块端在使用索引类进行跳转没反应的问题。
基于前文本申请提供的一种用于模块间通信的路由方法,本申请还提供一种用于模块间通信的路由装置,如图6所示,包括:
扫描解压处理单元10,用于扫描并解压APP的APK文件;
AndroidManifest文件获取单元20,用于获取所述APK文件中的AndroidManifest文件;
完整类名获取单元30,用于从所述AndroidManifest文件中获取Activity的完整类名或Servic的完整类名;
反编译单元40,用于遍历dex文件,根据所述Activity的完整类名或Service的完整类名反编译得到类的信息;
方法提取单元50,用于遍历获得的所有类,提取出public static或publicstatic final的方法;
java文件建成单元60,用于将提取出的所有方法创建成java文件;
第一编译单元70,用于将所述java文件编译成class文件;
第二编译单元80,用于将所述class文件编译成jar文件;
第一存储单元90,用于将所述jar文件存储至业务模块中,以使得所述业务模块使用provided的引用方式引用所述jar文件。
可选地,本申请提供的路由装置还可以包括:
比较单元,用于在所述业务模块生成aar文件的过程中,比较编译后的路径分别与所述jar文件中各个类的类名是否一致;
冲突索引类确定单元,用于将所述jar文件中类名与编译后的路径一致的类,确定为冲突的索引类;
冲突索引类删除单元,用于删除所述jar文件中冲突的索引类。
可选地,本申请提供的路由装置还可以包括:
jarMapping生成单元,用于在所述业务模块生成aar文件的过程中,生成索引jar的jar格式的映射文件jarMapping;
md5值获取单元,用于获取存在映射关系的java文件的md5值;
第一判断单元,用于判断所述md5值是否存在于java格式的映射文件javaMapping中;
所述md5值获取单元还用于,在所述第一判断单元判断所述md5值存在于所述javaMapping中时,继续获取下一存在映射关系的java文件的md5值,并继续触发所述第一判断单元;
import获取单元,用于在所述第一判断单元判断所述md5值不存在于所述javaMapping中时,获取所述存在映射关系的java文件的所有外部导入的报名import;
第二判断单元,用于判断获取的所有import是否存在于所述jarMapping中;
第二存储单元,用于在所述第二判断单元判断获取的所有import存在于所述jarMapping中时,将所述存在映射关系的java文件的md5值以及所获取的所有import存储至配置区;
输出单元,用于将所述配置区生成的配置文件和所述业务模块生成的aar文件输出至默认目录下。
可选地,本申请提供的路由装置还可以包括:
配置文件获取单元,用于在主工程编译时,从所述默认目录下获取配置文件;
查找单元,用于在编辑后的目录中查找所述主工程的索引清单中的类;
第三判断单元,用于结合所获取到的配置文件,判断所述主工程的索引清单中的类的方法是否存在;
提示单元,用于在所述第三判断单元判断所述主工程的索引清单中的类的方法不存在时,发出提示消息。
可选地,本申请提供的路由装置还可以包括:
预处理单元,用于预先在AndroidManifest文件中注册一个Activity类用来占坑,以及预先在gradle中配置好初始化参数;
系统关键类获取单元,用于在Application中进行初始化后,通过钩子技术钩住系统关键类android.app.IActivityManager;
跳转单元,用于当启动索引Activity时,自动跳转至用来模拟的Activity中。
需要说明的是,本说明书中的各个实施例均采用递进的方式描述,每个实施例重点说明的都是与其他实施例的不同之处,各个实施例之间相同相似的部分互相参见即可。对于装置类实施例而言,由于其与方法实施例基本相似,所以描述的比较简单,相关之处参见方法实施例的部分说明即可。
最后,还需要说明的是,在本文中,诸如第一和第二等之类的关系术语仅仅用来将一个实体或者操作与另一个实体或操作区分开来,而不一定要求或者暗示这些实体或操作之间存在任何这种实际的关系或者顺序。而且,术语“包括”、“包含”或者其任何其他变体意在涵盖非排他性的包含,从而使得包括一系列要素的过程、方法、物品或者设备不仅包括那些要素,而且还包括没有明确列出的其他要素,或者是还包括为这种过程、方法、物品或者设备所固有的要素。在没有更多限制的情况下,由语句“包括一个……”限定的要素,并不排除在包括所述要素的过程、方法、物品或者设备中还存在另外的相同要素。
以上对本申请所提供的一种用于模块间通信的路由方法和路由装置进行了详细介绍,本文中应用了具体个例对本申请的原理及实施方式进行了阐述,以上实施例的说明只是用于帮助理解本申请的方法及其核心思想;同时,对于本领域的一般技术人员,依据本申请的思想,在具体实施方式及应用范围上均会有改变之处,综上所述,本说明书内容不应理解为对本申请的限制。
Claims (10)
1.一种用于模块间通信的路由方法,其特征在于,包括:
扫描并解压应用程序APP的安卓安装包APK文件,获取所述APK文件中的AndroidManifest文件;
从所述AndroidManifest文件中获取Activity的完整类名或Servic的完整类名;
遍历dex文件,根据所述Activity的完整类名或Service的完整类名反编译得到类的信息;
遍历获得的所有类,提取出public static或public static final的方法;
将提取出的所有方法创建成java文件;
将所述java文件编译成class文件;
将所述class文件编译成jar文件;
将所述jar文件存储至业务模块中,以使得所述业务模块使用provided的引用方式引用所述jar文件。
2.根据权利要求1所述的路由方法,其特征在于,所述路由方法还包括:
在所述业务模块生成aar文件的过程中,比较编译后的路径分别与所述jar文件中各个类的类名是否一致;
将所述jar文件中类名与编译后的路径一致的类,确定为发生冲突的索引类;
删除所述jar文件中发生冲突的索引类。
3.根据权利要求2所述的路由方法,其特征在于,所述路由方法还包括:
在所述业务模块生成aar文件的过程中,生成索引jar的jar格式的映射文件jarMapping;
获取存在映射关系的java文件的md5值,判断所述md5值是否存在于java格式的映射文件javaMapping中;
如果存在,则继续获取下一存在映射关系的java文件的md5值,并继续判断该md5值是否存在于所述javaMapping中;
如果不存在,则获取所述存在映射关系的java文件的所有外部导入的报名import,判断获取的所有import是否存在于所述jarMapping中;
如果存在,将所述存在映射关系的java文件的md5值以及所获取的所有import存储至配置区;
将所述配置区生成的配置文件和所述业务模块生成的aar文件输出至默认目录下。
4.根据权利要求3所述的路由方法,其特征在于,所述路由方法还包括:
在主工程编译时,从所述默认目录下获取配置文件;
在编辑后的目录中查找所述主工程的索引清单中的类,结合所获取到的配置文件,判断所述主工程的索引清单中的类的方法是否存在;
如果不存在,发出提示消息。
5.根据权利要求1-4任一项所述的路由方法,其特征在于,所述路由方法还包括:
预先在AndroidManifest文件中注册一个Activity类用来占坑,以及预先在gradle中配置好初始化参数;
在Application中进行初始化后,通过钩子技术钩住系统关键类android.app.IActivityManager;
当启动索引Activity时,自动跳转至用来模拟的Activity中。
6.一种用于模块间通信的路由装置,其特征在于,包括:
扫描解压处理单元,用于扫描并解压应用程序APP的安卓安装包APK文件;
AndroidManifest文件获取单元,用于获取所述APK文件中的AndroidManifest文件;
完整类名获取单元,用于从所述AndroidManifest文件中获取Activity的完整类名或Servic的完整类名;
反编译单元,用于遍历dex文件,根据所述Activity的完整类名或Service的完整类名反编译得到类的信息;
方法提取单元,用于遍历获得的所有类,提取出public static或public staticfinal的方法;
java文件建成单元,用于将提取出的所有方法创建成java文件;
第一编译单元,用于将所述java文件编译成class文件;
第二编译单元,用于将所述class文件编译成jar文件;
第一存储单元,用于将所述jar文件存储至业务模块中,以使得所述业务模块使用provided的引用方式引用所述jar文件。
7.根据权利要求6所述的路由装置,其特征在于,所述路由装置还包括:
比较单元,用于在所述业务模块生成aar文件的过程中,比较编译后的路径分别与所述jar文件中各个类的类名是否一致;
冲突索引类确定单元,用于将所述jar文件中类名与编译后的路径一致的类,确定为冲突的索引类;
冲突索引类删除单元,用于删除所述jar文件中冲突的索引类。
8.根据权利要求7所述的路由装置,其特征在于,所述路由装置还包括:
jarMapping生成单元,用于在所述业务模块生成aar文件的过程中,生成索引jar的jar格式的映射文件jarMapping;
md5值获取单元,用于获取存在映射关系的java文件的md5值;
第一判断单元,用于判断所述md5值是否存在于java格式的映射文件javaMapping中;
所述md5值获取单元还用于,在所述第一判断单元判断所述md5值存在于所述javaMapping中时,继续获取下一存在映射关系的java文件的md5值,并继续触发所述第一判断单元;
import获取单元,用于在所述第一判断单元判断所述md5值不存在于所述javaMapping中时,获取所述存在映射关系的java文件的所有外部导入的报名import;
第二判断单元,用于判断获取的所有import是否存在于所述jarMapping中;
第二存储单元,用于在所述第二判断单元判断获取的所有import存在于所述jarMapping中时,将所述存在映射关系的java文件的md5值以及所获取的所有import存储至配置区;
输出单元,用于将所述配置区生成的配置文件和所述业务模块生成的aar文件输出至默认目录下。
9.根据权利要求8所述的路由装置,其特征在于,所述路由装置还包括:
配置文件获取单元,用于在主工程编译时,从所述默认目录下获取配置文件;
查找单元,用于在编辑后的目录中查找所述主工程的索引清单中的类;
第三判断单元,用于结合所获取到的配置文件,判断所述主工程的索引清单中的类的方法是否存在;
提示单元,用于在所述第三判断单元判断所述主工程的索引清单中的类的方法不存在时,发出提示消息。
10.根据权利要求6-9任一项所述的路由装置,其特征在于,所述路由装置还包括:
预处理单元,用于预先在AndroidManifest文件中注册一个Activity类用来占坑,以及预先在gradle中配置好初始化参数;
系统关键类获取单元,用于在Application中进行初始化后,通过钩子技术钩住系统关键类android.app.IActivityManager;
跳转单元,用于当启动索引Activity时,自动跳转至用来模拟的Activity中。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810744060.2A CN108897588B (zh) | 2018-07-09 | 2018-07-09 | 一种用于模块间通信的路由方法和路由装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201810744060.2A CN108897588B (zh) | 2018-07-09 | 2018-07-09 | 一种用于模块间通信的路由方法和路由装置 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN108897588A CN108897588A (zh) | 2018-11-27 |
CN108897588B true CN108897588B (zh) | 2021-08-13 |
Family
ID=64348170
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201810744060.2A Active CN108897588B (zh) | 2018-07-09 | 2018-07-09 | 一种用于模块间通信的路由方法和路由装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN108897588B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN111352631B (zh) * | 2020-02-21 | 2024-03-19 | 腾讯音乐娱乐科技(深圳)有限公司 | 一种接口兼容性检测方法及装置 |
CN111459822B (zh) * | 2020-04-01 | 2023-10-03 | 抖音视界有限公司 | 系统组件数据的提取方法、装置、设备及可读介质 |
CN111488144B (zh) * | 2020-04-17 | 2024-03-19 | 腾讯音乐娱乐科技(深圳)有限公司 | 一种数据处理方法以及设备 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20150169302A1 (en) * | 2011-06-02 | 2015-06-18 | Recursion Software, Inc. | System and method for pervasive software platform-based model driven architecture transaction aware application generator |
US20150309789A1 (en) * | 2014-04-28 | 2015-10-29 | Ca, Inc. | Modifying mobile application binaries to call external libraries |
CN105278989A (zh) * | 2015-10-12 | 2016-01-27 | 邱寅峰 | Apk文件的快速加载方法 |
CN105511902A (zh) * | 2015-11-09 | 2016-04-20 | Tcl集团股份有限公司 | 一种安卓平台模块动态加载的方法及系统 |
-
2018
- 2018-07-09 CN CN201810744060.2A patent/CN108897588B/zh active Active
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20150169302A1 (en) * | 2011-06-02 | 2015-06-18 | Recursion Software, Inc. | System and method for pervasive software platform-based model driven architecture transaction aware application generator |
US20150309789A1 (en) * | 2014-04-28 | 2015-10-29 | Ca, Inc. | Modifying mobile application binaries to call external libraries |
CN105278989A (zh) * | 2015-10-12 | 2016-01-27 | 邱寅峰 | Apk文件的快速加载方法 |
CN105511902A (zh) * | 2015-11-09 | 2016-04-20 | Tcl集团股份有限公司 | 一种安卓平台模块动态加载的方法及系统 |
Also Published As
Publication number | Publication date |
---|---|
CN108897588A (zh) | 2018-11-27 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Sen et al. | Jalangi: A selective record-replay and dynamic analysis framework for JavaScript | |
CN103577324B (zh) | 移动应用中隐私信息泄露的静态检测方法 | |
CN110990020A (zh) | 一种软件编译方法、装置及电子设备和存储介质 | |
CN108897588B (zh) | 一种用于模块间通信的路由方法和路由装置 | |
CN110221968A (zh) | 软件测试方法及相关产品 | |
CN107643893B (zh) | 一种程序检测方法及装置 | |
CN111045717B (zh) | 获取项目依赖包的方法、装置、计算机设备及存储介质 | |
CN111078481A (zh) | 获取配置检查清单的方法、装置、电子设备及存储介质 | |
CN106776266B (zh) | 测试工具的配置方法及终端设备 | |
CN108108169B (zh) | 一种基于Jenkins的多分支的构建方法及系统 | |
CN111679852A (zh) | 一种冲突依赖库的检测方法及装置 | |
CN117112060A (zh) | 组件库构建方法、装置、电子设备及存储介质 | |
CN108694049B (zh) | 一种更新软件的方法和设备 | |
CN113515303B (zh) | 一种项目转型方法、装置和设备 | |
CN112631894B (zh) | 代码检测方法、装置、存储介质及计算机设备 | |
CN113721921A (zh) | 一种联盟链多语言外部链码离线编译方法与系统 | |
CN115794214B (zh) | 应用模块元数据管理方法、设备、存储介质及装置 | |
CN117493169A (zh) | 一种Java依赖库版本间API行为不兼容性检测方法、装置、设备及介质 | |
CN109933976B (zh) | 一种安卓应用相似性检测方法、移动终端及存储装置 | |
CN115344268A (zh) | 一种多平台嵌入式开发环境编译方法及装置 | |
CN114417347A (zh) | 应用程序的漏洞检测方法、装置、设备、存储介质和程序 | |
CN110321130B (zh) | 基于系统调用日志的不可重复编译定位方法 | |
CN114489653A (zh) | 基于编译器的数据处理方法、装置以及可读存储介质 | |
CN113326046A (zh) | 获取编译时长的方法和装置 | |
Liu et al. | Reunify: A step towards whole program analysis for react native android apps |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
GR01 | Patent grant | ||
GR01 | Patent grant |