【技术实现步骤摘要】
加载和运行应用程序的方法、装置及相关产品
[0001]本申请涉及计算机
,尤其涉及一种加载和运行应用程序的方法、装置及相关产品。
技术介绍
[0002]面向对象软件的二进制兼容问题,也称脆弱基类(Fragile Base Class)问题,是困扰软件维护的重要问题。在面向对象软件发布后,面向对象软件依赖的库或第三方代码中部分父类(基类)发生了改变,而导致已发布的面向对象软件需要重新进行编译、调试、测试和部署。
技术实现思路
[0003]本申请提出了一种加载和运行应用程序的方法及装置、生成字节码文件的方法、字节码文件、终端设备以及存储介质。
[0004]第一方面,本申请的实施例提供了一种加载和运行应用程序的方法,应用于终端设备,所述方法包括:
[0005]加载所述应用程序的类时,根据所述类及所述类的祖先类的实例成员的信息计算得到所述类对应的对象大小,其中,所述实例成员的信息包括实例成员的存量布局信息和增量布局信息;
[0006]根据所述对象大小创建所述类对应的对象。
[00 ...
【技术保护点】
【技术特征摘要】
1.一种加载和运行应用程序的方法,应用于终端设备,其特征在于,所述方法包括:加载所述应用程序的类时,根据所述类及所述类的祖先类的实例成员的信息计算得到所述类对应的对象大小,其中,所述实例成员的信息包括实例成员的存量布局信息和增量布局信息;根据所述对象大小创建所述类对应的对象。2.根据权利要求1所述的方法,其特征在于,在所述对象的对象布局中,从所述对象的基地址开始按照如下顺序连续排布:先是按照继承链从祖先类依次到所述类的存量布局,然后是按照继承链从所述类依次到所述祖先类的增量布局。3.根据权利要求1或2所述的方法,其特征在于,加载所述应用程序的类还包括:根据所述增量布局信息计算得到所述对象的增量布局中每个类的反向偏移量,所述类的反向偏移量用于表示在所述增量布局中每个类的起始地址相对于所述对象的结束地址的偏移量。4.根据权利要求3所述的方法,其特征在于,所述方法还包括:根据所述对象的基地址、所述对象大小、所述增量成员所属的类的反向偏移量以及所述增量成员的第一偏移量计算所述增量成员的地址,以访问所述增量成员;其中,所述增量成员的第一偏移量是指所述增量成员的地址相对于所述增量成员所属类的增量布局的起始地址的偏移量。5.根据权利要求4所述的方法,其特征在于,所述对象的基地址为低地址端,在所述类的增量布局内部,增量成员按照增加的时间顺序从高地址到低地排布,所述根据所述对象的基地址、所述对象大小、所述增量成员所属的类的反向偏移量以及所述增量成员的第一偏移量计算所述增量成员的地址,包括:根据以下公式计算增量成员的地址,add=obj+OBs-offset1-offset2;其中,add表示增量成员的地址,obj表示所述基地址,OBs表示所述对象大小,offset1表示所述第一偏移量,offset2表示所述增量成员所属的类的反向偏移量。6.根据权利要求4所述的方法,其特征在于,所述对象的基地址为低地址端,在所述类的增量布局内部,增量成员按照增加的时间顺序从低地址到高地排布,所述根据所述对象的基地址、所述对象大小、所述增量成员所属的类的反向偏移量以及所述增量成员的第一偏移量计算所述增量成员的地址,包括:根据以下公式计算增量成员的地址,add=obj+OBs-offset2+offset1;其中,add表示增量成员的起始地址,obj表示所述基地址,OBs表示所述对象大小,offset1表示所述第一偏移量,offset2表示所述增量成员所属类的反向偏移量。7.根据权利要求1-4任意一项所述的方法,其特征在于,所述加载应用程序的类还包括:根据增量成员的第一偏移量和所述增量成员所属类的反向偏移量计算所述增量成员的第二偏移量,并将所述增量成员的第二偏移量保存至偏移量表,其中,所述增量成员的第一偏移量是指所述增量成员的地址相对于所述增量成员所属类的增量布局的起始地址的偏移量。
8.根据权利要求7所述的方法,其特征在于,根据所述对象的基地址、所述对象大小、所述增量成员所属类的反向偏移量以及所述增量成员的第一偏移量计算所述增量成员的地址,包括:从所述偏移量表中获取所述增量成员的第二偏移量;根据以下公式计算所述增量成员的地址:add=obj+OBs-offset3;其中,add表示增量成员的起始地址,obj表示对象的基地址,OBs表示所述对象大小,offset3表示所述增量成员的第二偏移量。9.根据权利要求2所述的方法,其特征在于,所述存量布局中包括每个类的主版本的存量成员,所述增量布局中包括每个类的子版本相对于所述每个类的主版本增加的增量成员,其中,所述主版本发布后不再兼容根据主版本之前的版本类代码编译的应用程序,子版本发布后兼容根据所述主版本或者所述主版本的任一子版本的类代码编译的应用程序。10.一种生成字节码文件的方法,其特征在于,所述方法应用于编译器,所述方法包括:若发布了类库中类代码的新版本,则对所述类代码的新版本进行编译生成所述新版本的字节码文件;所述字节码文件中包括所述类代码的新版本的实例成员的信息,若所述新版本是类库中类代码的主版本的子版本,则所述实例成员的信息包括实例成员的存量布局信息和增量布局信息。11.根据权利要求10所述的方法,其特征在于,若发布了类库中类代码的新版本,则对所述类代码的新版本进行编译生成所述新版本的字节码文件,包括:若所述新版本是类库中类代码的主版本的子版本,则根据所述子版本的前一版本的实例成员的信息对所述子版本进行编译生成所述子版本的字节码文件,其中,所述类代码的子版本和所述前一版本都是基于类代码的同一个主版本发布的。12.根据权利要求11所述的方法,其特征在于,所述实例成员的增量布局信息中包括子版本相对于主版本增加的增量成员的第一偏移量,所述第一偏移量是指所述增量成员的地址相对于所述增量成员所属类的增量布局的起始地址的偏移量。13.根据权利要求12所述的方法,其特征在于,根据所述子版本的前一版本的实例成员的信息对所述子版本进行编译生成子版本的字节码文件,包括:加载所述前一版本的实例成员的信息;比较所述类代码的子版本和前一版本的实例成员的信息以判断所述子版本相对于前一版本是否存在实例成员为增量成员;若所述子版本相对于前一版本存在增量成员,则计算所述子版本相对于前一版本的增量成员的第一偏移量,并将前一版本的实例成员的信息和所述第一偏移量保存到所述子版本的实例成员的信息。14.根据权利要求13所述的方法,其特征在于,根据所述子版本的前一版本的实例成员的信息对所述子版本进行编译生成子版本的字节码文件,还包括:若所述子版本相对于前一版本删除了实例成员,则在所述子版本的实例成员的信息中
保留被删除了的实例成员的信息。15.根据权利要求11-14任意一项所述的方法,其特征在于,对所述子版本进行编译生成子版本的字节码文件,包括:生成用于访问增量成员的第一访问指令,所述第一访问指令用于根据应用程序的类对应的对象的基地址、对象大小、增量成员所属的类的反向偏移量以及增量成员的第一偏移量访问增量成员,其中,所述类对应的对象大小、增量成员所属的类的反向偏移量是在所述字节码文件被终端设备加载时由终端设备根据所述类以及所述类的祖先类的实例成员的信息确定的,所述类的反向偏移量用于表示在所述对象的增量布局中所述类的起始地址相对于所述对象的结束地址的偏移量,所述对象的基地址在终端设备创建所述对象时由终端设备确定的。16.根据权利要求15所述的方法,其特征在于,所述第一访问指令中包括用于访问偏移量表的第二访问指令,所述第一访问指令用于根据所述基地址、所述对象大小和基于第二访问指令访问偏移量表...
【专利技术属性】
技术研发人员:何忠政,黄海涛,程帅,史晓华,胡健,
申请(专利权)人:华为技术有限公司,
类型:发明
国别省市:
还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。