首页 / 专利库 / 电信 / 节点 / 子节点 / 一种安卓应用的深链接口自动生成方法及深链执行方法

一种安卓应用的深链接口自动生成方法及深链执行方法

阅读:210发布:2024-01-30

专利汇可以提供一种安卓应用的深链接口自动生成方法及深链执行方法专利检索,专利查询,专利分析的服务。并且本 发明 公开了一种安卓应用的深链 接口 自动生成方法及深链执行方法。本发明的深链接口生成方法为:对于目标安卓应用程序的代码中每一设定Activity,获取到达该Activity的Intent序列;针对该目标安卓应用程序的代码中每一 选定 的目标Activity,生成从该选定的Activity的入口到达其内部设定Fragment的操作序列;根据所述Intent序列和所述操作序列构成该目标安卓应用程序中各设定 位置 的深链模板,即得到各设 定位 置对应的深链接口。本发明能自动地为安卓应用生成深链,节省开发者的工作量,可以极大提高现有安卓应用的深链数量,促进深链的应用。,下面是一种安卓应用的深链接口自动生成方法及深链执行方法专利的具体信息内容。

1.一种安卓应用的深链接口自动生成方法,其步骤包括:
1)对于目标安卓应用程序的代码中每一设定Activity,获取到达该Activity的Intent序列;
2)针对该目标安卓应用程序的代码中每一选定的目标Activity,生成从该选定的目标Activity的入口到达其内部设定Fragment的操作序列;
3)根据所述Intent序列和所述操作序列构成该目标安卓应用程序中各设定位置的深链模板,即得到各设定位置对应的深链接口;
其中,获取到达该Activity的Intent序列的方法为:首先构造该目标安卓应用程序的Activity导航关系图;然后根据该Activity导航关系图,获取从应用入口Activity到达该Activity的路径,然后选取最短路径所对应的Intent序列,作为从应用入口Activity到达该Activity的Intent序列。
2.如权利要求1所述的方法,其特征在于,生成所述操作序列的方法为:为所述目标Activity中的每一Fragment生成一标识;生成所述目标Activity的Fragment切换图FTG;其中,P代表一个顶点集合,Activity中每一Fragment的标识对应一顶点;D是有向边的集合,每一条边是一个三元组e,s代表源Fragment,t为目标Fragment,i代表引发切换的控件的标识id;p是起始点,即Activity刚打开时的主页面;然后根据所述目标Activity的Fragment切换图,将从起始点到目标Fragment的边串联起来,得到所述目标Activity的Fragment的操作序列。
3.如权利要求2所述的方法,其特征在于,为所述目标Activity中的每一Fragment生成一标识的方法为:获取安卓系统为该目标安卓应用程序在运行时构造的控件树;计算该控件树的哈希值,然后用该哈希值来标识当前的Fragment。
4.如权利要求3所述的方法,其特征在于,计算所述控件树的哈希值的方法为:对于该控件树中的一个节点q,如果节点q在控件树中没有子节点,则结果为节点q对应控件的标签字符串哈希;如果节点q有子节点,则递归计算出节点q所有子节点的哈希;然后根据节点q的子节点的哈希值对节点q的子节点排序来保证哈希结构的一致性,再将每个子节点的哈希值与控件的标签加起来形成一个新的字符串,最终将该新的字符串的哈希值作为节点q的哈希。
5.如权利要求2所述的方法,其特征在于,获得所述Fragment切换图的方法为:首先点击当前Fragment的每个控件来检查Activity是否改变,如果Activity改变,则调用系统函数doback()直接返回前一个状态,返回之后继续遍历;如果Activity改变,则检查当前Fragment的状态,如果当前Fragment的标识与之前的不同,且当前Fragment是一个新的Fragment,则其加入Fragment切换图中,并且记录边的信息为发生切换的控件;如果没有发生Fragment切换则继续遍历;在完成遍历搜索后,得到所述Fragment切换图以及所有Fragment的列表。
6.一种基于权利要求1所述方法生成的深链接口的深链执行方法,其特征在于,代理Activity根据深链请求查找对应的深链模板并对其实例化,构造一个可跳转到该深链请求对应目标位置的脚本;然后根据脚本,回放引擎控制安卓应用在Activity之间切换,并在控件上进行操作,达到目标位置;所述深链请求中包含深链对应深链模板中的参数所需要的赋值;
其中,获取到达该Activity的Intent序列的方法为:首先构造该目标安卓应用程序的Activity导航关系图;然后根据该Activity导航关系图,获取从应用入口Activity到达该Activity的路径,然后选取最短路径所对应的Intent序列,作为从应用入口Activity到达该Activity的Intent序列。

说明书全文

一种安卓应用的深链接口自动生成方法及深链执行方法

技术领域

[0001] 本发明涉及一种为安卓应用自动生成深链接口的方法及深链执行方法,属于软件技术领域。

背景技术

[0002] 安卓应用是用Java语言开发的、运行在安卓操作系统上的应用软件。一个安卓应用通常由多个Activity构成,每个Activity提供一个用户与应用进行交互的页面,用户在Activity中使用该安卓应用的各个功能,如打电话、看电影、读新闻、查地图等。一个Activity可以包含多个Fragment,每个Fragment显示一部分用户界面。如果将一个安卓应用比作一个Web网站,那么一个Activity的实例页面就可以类比为一个Web网页,而Fragment则可以类别为Web网页中的Frame。
[0003] 安卓应用与Web网站的一个显著区别在于:在Web网站中,每个Web网页都有一个全局唯一的URL,通过URL可以在浏览器中直接打开其对应的Web网页。与之相比,安卓应用中的每个Activity实例页面只有一个内部地址,要进入安卓应用中的一个页面,用户必须首先打开该应用,然后经过一系列页面跳转才能够到达目标页面。以“大众点评”应用为例,假设用户在其中浏览过一家餐厅的页面,当该用户下一次想要访问该餐厅页面时,他必须打开大众点评,搜索之前浏览过的餐厅,然后才能最终进入餐厅页面。这一系列繁琐操作的根本原因在于安卓应用的内部页面缺少像网页URL一样的全局唯一地址,以及缺少通过这个地址直接打开对应页面的机制。
[0004] 深链(Deep Link)提供了一种基于URI(统一资源标识符)从应用外部直接访问应用内部一个特定页面的机制。Google、Facebook、微软、百度等国内外互联网公司都在大推广深链,希望应用开发者能够在应用中提供更多的深链,以满足搜索和分享的需要。然而,深链目前在安卓应用中并没有被广泛支持。通过分析2万个来自豌豆荚应用商店的热安卓应用,发现其中73%的应用并没有提供任何深链,18%的应用只提供了一种深链(即只能跳转到应用中的一类页面)。
[0005] 深链没有被广泛支持的原因在于为安卓应用开发深链需要大量的手工工作。在原理上,深链可以通过安卓的应用间通信机制Intent来实现。Intent分为两类:(1)显示Intent,给出目标Activity的名字,当Intent被执行时,目标Activity被调起打开;(2)隐式Intent,给出一些筛选条件,包括action、category、data等,当Intent被执行时,符合筛选条件的Activity被调起打开。在构造Intent时,参数和其他需要传递的信息可以放在Intent的extra域中。当Activity P发送一个Intent I的时候,安卓系统将会找到能够处理这个Intent的目标Activity Q,随后加载Q,以此来实现从P到Q的切换。深链一般采用隐式Intent来实现,开发者需要对每一个要支持深链的Activity重构其代码实现处理对应隐式Intent的逻辑,这项工作往往耗时且容易出错。因此,提供一种深链的自动化生成工具具有重要的意义和现实需求。

发明内容

[0006] 针对现有技术中存在的技术问题,本发明的目的在于提供一种安卓应用的深链接口自动生成方法及深链执行方法。
[0007] 本发明采用静态程序分析与动态程序分析结合的方法,在开发者最低程度的参与下,自动为安卓应用生成深链接口。具体流程为:给定安卓应用程序的代码(安装包APK或源代码),首先通过静态分析获得到达每个Activity(专有名词,为Android里面的类)的Intent序列,记录如何从应用的入口Activity通过发送Intent到达每一个Activity的最短路径;进而,针对每个选定的目标Activity,通过动态分析获得如何从一个特定Activity的入口到达Activity内部特定Fragment的操作序列。Intent序列和操作序列构成应用中一个设定位置的深链模板(即对应位置的深链接口),例如,对于Activity m和其中的Fragment f,到达m的Intent序列构成m的深链模板,而到达m的Intent序列和从m的入口到达f的操作序列构成f的深链模板。当开发者指定需要生成深链的Activity及其内部Fragment之后,其对应的深链模板(根据Activity和Fragment的名字即可找到对应的深链模板)和深链执行引擎会自动生成深链,并与原应用代码打包在一起成为一个新的安卓应用程序安装包。当一个深链被请求时,深链执行引擎会被启动,通过深链请求中的URI来对相应模板的参数进行实例化,然后执行引擎会依次执行模版中的Intent跳转到目标Activity,最后通过执行模版中的操作序列控制Activity跳转到指定Fragment,从而打开目标页面。
[0008] 本发明的技术方案为:
[0009] 一种安卓应用的深链接口自动生成方法,其步骤包括:
[0010] 1)对于目标安卓应用程序的代码中每一设定Activity,获取到达该Activity的Intent序列;
[0011] 2)针对该目标安卓应用程序的代码中每一选定的目标Activity,生成从该选定的Activity的入口到达其内部设定Fragment的操作序列;
[0012] 3)根据所述Intent序列和所述操作序列构成该目标安卓应用程序中各设定位置的深链模板,即得到各设定位置对应的深链接口。
[0013] 进一步的,获取到达该Activity的Intent序列的方法为:首先构造该目标安卓应用程序的Activity导航关系图;然后根据该Activity导航关系图,获取从应用入口Activity到达该Activity的路径,然后选取最短路径所对应的Intent序列,作为从应用入口Activity到达该Activity的Intent序列。
[0014] 进一步的,生成所述操作序列的方法为:为所述目标Activity中的每一Fragment生成一标识;生成所述目标Activity的Fragment切换图FTG;其中,P代表一个顶点集合,Activity中每一Fragment的标识对应一顶点;D是有向边的集合,每一条边是一个三元组e,s代表源Fragment,t为目标Fragment,i代表引发切换的控件的标识id;p是起始点,即Activity刚打开时的主页面;然后根据所述目标Activity的Fragment切换图,将从起始点到目标Fragment的边串联起来,得到所述目标Activity的Fragment的操作序列。
[0015] 进一步的,为所述目标Activity中的每一Fragment生成一标识的方法为:获取安卓系统为该目标安卓应用程序在运行时构造的控件树;计算该控件树的哈希值,然后用该哈希值来标识当前的Fragment。
[0016] 进一步的,计算所述控件树的哈希值的方法为:对于该控件树中的一个节点q,如果节点q在控件树中没有子节点,则结果为节点q对应控件的标签字符串哈希;如果节点q有子节点,则递归计算出节点q所有子节点的哈希;然后根据节点q的子节点的哈希值对节点q的子节点排序来保证哈希结构的一致性,再将每个子节点的哈希值与控件的标签加起来形成一个新的字符串,最终将该新的字符串的哈希值作为节点q的哈希。
[0017] 进一步的,获得所述Fragment切换图的方法为:首先点击当前Fragment的每个控件来检查Activity是否改变,如果Activity改变,则调用系统函数doback()直接返回前一个状态,返回之后继续遍历;如果Activity改变,则检查当前Fragment的状态,如果当前Fragment的标识与之前的不同,且当前Fragment是一个新的Fragment,则其加入Fragment切换图中,并且记录边的信息为发生切换的控件;如果没有发生Fragment切换则继续遍历;在完成遍历搜索后,得到所述Fragment切换图以及所有Fragment的列表。
[0018] 一种基于上述深链接口的深链执行方法,其特征在于,代理Activity根据深链请求查找对应的深链模板并对其实例化,构造一个可跳转到该深链请求对应目标位置的脚本;然后根据脚本,回放引擎控制安卓应用在Activity之间切换,并在控件上进行操作,达到目标位置;所述深链请求中包含深链对应深链模板中的参数所需要的赋值。
[0019] 本发明的方法流程如图1所示,其具体步骤包括:
[0020] 1.针对目标安卓应用程序,生成到达所有Activity的Intent序列。
[0021] 1)构造目标安卓应用程序的Activity导航关系图,描述Activity之间的跳转关系。一个Activity导航关系图G为一个有向图,用一个四元组G表示,其中V是顶点集,代表一个应用中的所有Activity;E是有向边集,每一条有向边e(v1,v2)代表两个Activity v1到v2的跳转;r代表应用的入口Activity,假定从起始点r可以到达V中的任意顶点;L是有向边的标记集合,每一条有向边的标记为对应Intent序列的所有参数。Activity导航关系图中的两个点之间可能有多条边,表明两个Activity之间的跳转可能不止一条路径。
[0022] 2)捷径分析。在建立Activity导航关系图后,可以分析从应用入口Activity到达每一个Activity的路径。一条到达Activity的路径P是一个从入口Activity开始的有序Activity跳转序列,{t1,t2,…,tk},k代表路径的长度。在一条路径中,t1代表打开入口Activity的Intent,路径P可以确保所有的内部依赖在到达Activity之前都已经被初始化。到达一个Activity的路径可能有多条,为了以最快的方式到达目标Activity,应选取最短路径所对应的Intent序列。
[0023] 2.针对开发者指定的Activity,生成到达其中Fragment的操作序列。
[0024] 1)为指定的Activity生成其中Fragment的标识。与Activity有唯一标识名不同,Fragment没有明确的标识。为了确保在操作后切换到了指定的Fragment,利用安卓提供的控件树来确定某一个Fragment。在安卓系统中,所有控件被组织成一棵树,即控件树。在运行时获取控件树(每当系统运行不同的Fragment时,对应不同的控件树,即控件树是变化的),通过递归算法来计算这棵控件树的哈希值,然后用该哈希值来标识每一个Fragment。递归算法的具体流程为:对于控件树中的一个控件q,如果q在控件树中没有子节点,则结果仅为q对应控件的标签(tag)字符串哈希。如果q有子节点,该算法则递归计算出q所有子节点的哈希。然后,根据子节点的哈希值对q的子节点排序来保证哈希结构的一致性(因为一个控件的子节点并非每次都保持同样的顺序),再将每个子节点的哈希值与控件的tag拼接,形成一个新的字符串,最终将该字符串的哈希值作为q的哈希。当将一个控件树的根节点对应的控件作为该算法的输入,可以得到该控件树的哈希结构,哈希值即可用作Fragment的标识。
[0025] 2)对开发者选定的Activity生成Fragment切换图。为了获得一个Activity的所有Fragment以及到达每个Fragment的操作流,定义Fragment切换图来表示Fragment在一个Activity中的切换,由三元组FTG表示。P代表一个Activity中所有的Fragment,组成图的所有顶点,由哈希值来唯一标记。D是图中的所有有向边的集合,每一条边是一个三元组e,s和t分别代表源和目标Fragment,i代表引发切换的控件view的标识id。p是起始点,即Activity刚打开时的主页面。为了获得Fragment切换图,工具采用深度优先搜索的方式遍历整个Activity。首先,尝试点击当前Fragment的每个控件view来检查Activity是否改变,如果Activity改变,调用系统函数doback()直接返回前一个状态,返回之后继续遍历。否则,检查Fragment的状态。如果当前Fragment的标识与之前的不同,则表明Fragment发生了切换。因此,如果它是一个新的Fragment就将其加入图中,并且记录边的信息为发生切换的控件view;如果没有发生Fragment切换则继续遍历。动态分析的过程其实类似于遍历每个网页的Web爬虫,只不过安卓仅仅提供doback()函数来返回到之前的Activity,而不是返回到Fragment。所以在Fragment切换后需要通过重启应用来追踪到之前的Fragment。在完成搜索后,可以得到Fragment切换图以及所有Fragment的列表。为了获取到达某一个Fragment的操作序列,只需要将从起始点到目标Fragment的边串联起来即可。
[0026] 3.将深链添加到安卓应用程序中。
[0027] 在计算出Activity的最短导航路径以及Fragment的操作序列后,即可生成支持深链的目标安卓应用程序安装文件。由于开发者可能只希望在应用的部分位置支持深链。因此,工具允许开发者只在需要的Activity或Fragment处添加深链。
[0028] 当开发者选出待支持深链的Activity集合后,本发明会为每个选中的Activity生成一个抽象的URI。URI会遵循“scheme://host/path”的格式以便在安卓系统中被识别。为了确定具体的位置,将“http://host/target?parameter#fragment”作为抽象URI的格式,其中采用与应用包名的逆序串作为host域,用Activity的类名作为target域,“?”后是参数部分。对于链接到Fragment的深链,目标Fragment的名字在“#”后面。
[0029] 附图2描述了目标apk的结构和产生。本发明采用代理架构实现对原应用的最小修改。代理Activity来处理所有请求。代理Activity被配置为遵从URI的Intent filter。当一个Intent传到代理Activity时,如果Intent与其中一个URI格式相匹配,代理Activity将会操控回放引擎重复既定的操作来执行深链。如果不能与其中任何一个URI格式相匹配,则将会直接交给原来的源码处理。
[0030] 4.在运行时通过重复之前的操作来执行深链的跳转
[0031] 当深链被请求时,请求信息中会包含深链对应模板中的参数所需要的赋值,进而可将深链模版进行实例化,从而构造一个可跳转到特定位置的脚本。根据脚本,回放引擎与原来的应用软件代码通信,控制应用软件在Activity之间切换,并在控件上进行操作。如,当深链http://anki.ichi2.com/NoteEditor?CALLER=3#tags被请求时,它表明用户希望到达Anki应用中的NoteEditor Activity的tags Fragment。所以回放引擎首先模板中的参数CALLER赋值为3,然后发送对应的Intent序列到达NoteEditor Activity,接着在能够到达tags Fragment的对应控件上模拟点击,最后用户便可以到达目标位置。
[0032] 与现有技术相比,本发明的积极效果为:
[0033] 本方案借助发明工具可以自动地为安卓应用生成深链,节省开发者的工作量,可以极大提高现有安卓应用的深链数量,促进深链的应用。

附图说明

[0034] 图1为本发明的方法流程图
[0035] 图2为支持深链的目标APK结构。

具体实施方式

[0036] 下面结合附图对本发明进行进一步详细描述。
[0037] 开发者可以选择被分析应用的源码。然后工具的静态分析会找出所有Activity以及相关的Activity最短导航路径。当一个Activity被选中,Activity最短导航路径信息会在界面中呈现。如果要为Activity中的Fragment生成深链,则工具允许开发者启动模拟器,然后在模拟器中进行操作,切换到一个Activity的入口位置。接下来,如果开发者选择启动动态分析,执行结果则会显示出来。开发者可以查看所有的Fragment是否正确,也可利用工具提供的控件信息来手动添加一个Fragment。当Activity的深链已经生成好后,开发者可以选择生成目标文件作为输出。
[0038] 下面的代码展示了工具为Anki应用添加的两个深链模版。其中的代码即为CardTemplateEditor和NoteEditor Activity的深链模版。在到达CardTemplateEditor前,必需先传入CALLER和modeId两个参数,因此跳转到CardTemplateEditor的深链必需对这两个参数进行赋值。然后Aladdin会找到合适的Intent来切换到目标Activity。NoteEditor有Fragment名“tags”,到具体Fragment的行动需要点击源id为CardEditorTagButton的view。因此,为了到达目标Fragment,Intents的值(CALLER=3)和fragment的值(#tags)都需要具体赋值。
[0039] (1)CardTemplateEditor深链:
[0040]
[0041] 调用示例:http://anki.ichi2.com/CardTemplateEditor?CALLER=3&modelId=1472031370433
[0042] (2)NoteEditor深链:
[0043]
[0044] 调用示例:http://anki.ichi2.com/NoteEditor?CALLER=3#tags。
[0045] 以上实施仅用以说明本发明的技术方案而非对其进行限制,本领域的普通技术人员可以对本发明的技术方案进行修改或者等同替换,而不脱离本发明的精神和范围,本发明的保护范围应以权利要求书所述为准。
高效检索全球专利

专利汇是专利免费检索,专利查询,专利分析-国家发明专利查询检索分析平台,是提供专利分析,专利查询,专利检索等数据服务功能的知识产权数据服务商。

我们的产品包含105个国家的1.26亿组数据,免费查、免费专利分析。

申请试用

分析报告

专利汇分析报告产品可以对行业情报数据进行梳理分析,涉及维度包括行业专利基本状况分析、地域分析、技术分析、发明人分析、申请人分析、专利权人分析、失效分析、核心专利分析、法律分析、研发重点分析、企业专利处境分析、技术处境分析、专利寿命分析、企业定位分析、引证分析等超过60个分析角度,系统通过AI智能系统对图表进行解读,只需1分钟,一键生成行业专利分析报告。

申请试用

QQ群二维码
意见反馈