CN108073406A - 生成主Dex的方法及装置 - Google Patents

生成主Dex的方法及装置 Download PDF

Info

Publication number
CN108073406A
CN108073406A CN201810011448.1A CN201810011448A CN108073406A CN 108073406 A CN108073406 A CN 108073406A CN 201810011448 A CN201810011448 A CN 201810011448A CN 108073406 A CN108073406 A CN 108073406A
Authority
CN
China
Prior art keywords
class
manifest
keep
files
dex
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.)
Pending
Application number
CN201810011448.1A
Other languages
English (en)
Inventor
陈新盛
杨鹏
张颖
潘浩
赵子颖
谢安涛
韩运
王远强
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
CENTURY DRAGON INFORMATION NETWORK Co Ltd
Original Assignee
CENTURY DRAGON INFORMATION NETWORK Co Ltd
Priority date (The priority date 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 date listed.)
Filing date
Publication date
Application filed by CENTURY DRAGON INFORMATION NETWORK Co Ltd filed Critical CENTURY DRAGON INFORMATION NETWORK Co Ltd
Priority to CN201810011448.1A priority Critical patent/CN108073406A/zh
Publication of CN108073406A publication Critical patent/CN108073406A/zh
Pending legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/60Software deployment
    • G06F8/61Installation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44505Configuring for program initiating, e.g. using registry, configuration files
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements 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/44Arrangements for executing specific programs
    • G06F9/445Program loading or initiating
    • G06F9/44521Dynamic linking or loading; Link editing at or after load time, e.g. Java class loading
    • G06F9/44526Plug-ins; Add-ons

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Stored Programmes (AREA)

Abstract

本发明涉及一种生成主Dex的方法及装置,其中,生成主Dex的方法包括以下步骤:根据第三方SDK的自定义任务,修改获取到的manifest_keep.txt文件,得到修改后的manifest_keep.txt文件;压缩修改后的manifest_keep.txt文件中的class文件,生成包含所述第三方SDK代码的压缩包;根据压缩包,生成主Dex。本发明实施例,针对Android的低版本的Android系统的设备运行时,根据第三方SDK的自定义任务,可以基于获取到的manifest_keep.txt文件,对manifest_keep.txt文件进行修改,进而再压缩修改后的文件中得到包含第三方的SDK代码的压缩包,根据压缩包生成主Dex。基于生成的主Dex,能够检测到加载的时候注入的第三方SDK的代码,低版本的Android系统不会抛出java.lang.NoClassDefFoundError异常。

Description

生成主Dex的方法及装置
技术领域
本发明涉及安卓系统插件领域,特别是涉及一种生成主Dex的方法及装置。
背景技术
在安卓(Android)系统进行应用安装时,会生成虚拟机可执行二进制文件即Dex文件,安装过程中需要对Dex进行优化,这个过程是通过DexOpt工具来处理。DexOpt在Android系统第一次加载Dex文件的时候执行优化程序,生成ODex(optimize dalvik package)文件。Odex是从Android安装包(APK:Android Package)中提取的可运行文件,是通过Android安装包的中的Dex优化过的,再把Android安装包里的dex文件删除。执行ODex的效率会比直接执行Dex文件的效率要高很多。DexOpt在执行过程中会检索每一个类的方法id,存在一个链表结构里。由于链表的长度是用一个short类型来保存的,导致了方法id的数目不能够超过65536个。当一个项目足够大的时候,显然这个方法数的上限是不够的。
在传统技术中,发明人发现至少存在如下问题:尽管在新版本的Android系统中,DexOpt修复了这个问题,但是对低版本的Android系统仍然需要做兼容;在接入第三方软件开发工具包(SDK:Software Development Kit)的时候,SDK代码依赖注入的任务transformClasses With Dex For${variant.name.capitalize()},不会检测依赖和控制主Dex上的class,只会实现代码注入。在启动App时默认只能加载主Dex,如果在App的Application或者主Activity当中注入了代码,而在加载的时候注入的代码在主Dex上检测不到,系统就会抛出java.lang.NoClassDefFoundError异常。
发明内容
基于此,有必要针对低版本的Android系统,在接入第三方SDK的时候,如果APK文件存在多个Dex,并且在Android系统的设备上运行抛出异常的问题,提供一种生成主Dex的方法及装置。
为了实现上述目的,一方面,本发明实施例提供了一种生成主Dex的方法,包括以下步骤:
根据第三方SDK的自定义任务,修改获取到的manifest_keep.txt文件,得到修改后的manifest_keep.txt文件;
压缩修改后的manifest_keep.txt文件中的class文件,生成压缩包;
根据压缩包,生成主Dex。
在其中一个实施例中,修改获取到的manifest_keep.txt文件的步骤包括:
根据自定义任务,在manifest_keep.txt文件的文本末尾增加第三方SDK的入口类或第三方SDK的包名。
在其中一个实施例中,自定义任务为自定义UxMainDexTask任务。
在其中一个实施例中,压缩包为jar格式压缩包;
压缩所述修改后的manifest_keep.txt文件的class,生成压缩包的步骤包括:
调用压缩工具,压缩修改后的manifest_keep.txt文件的class,生成jar格式压缩包;
将第三方SDK的代码加入jar格式压缩包。
在其中一个实施例中,压缩工具为ProGuard。
在其中一个实施例中,根据所述压缩包,生成主Dex的具体步骤包括:
提取压缩包的class文件得到maindexlist.txt文件;class文件包括压缩包中各class文字以及各class文字依赖的class文件;
根据maindexlist.txt文件,生成主Dex。
在其中一个实施例中,生成主Dex步骤还包括:
更改maindexlist.txt文件,控制主Dex。
另一方面,本发明还提供了一种生成主Dex的装置,包括:
修改单元,用于根据第三方SDK的自定义任务,修改获取到的manifest_keep.txt文件,得到修改后的manifest_keep.txt文件;
压缩单元,用于压缩修改后的manifest_keep.txt文件中的class,生成压缩包;
生成单元,用于根据压缩包,生成主Dex。
另一方面本发明还提供了一种计算机设备,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,处理器执行计算机程序时实现上述任意一项实施例中的生成Dex的方法。
另一方面本发明还提供了一种计算机存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述任意一项实施例中的生成Dex的方法。
上述技术方案中的一个技术方案具有如下优点和有益效果:
针对在低版本的Android系统的设备运行时,Android系统依赖接入第三方SDK,当APK存在多个Dex时,根据第三方SDK的自定义任务,可以基于获取到的manifest_keep.txt文件,对manifest_keep.txt文件进行修改,进而再压缩修改后的文件中得到包含第三方的SDK代码的压缩包,根据压缩包生成主Dex。基于生成的主Dex,能够检测到加载的时候注入的第三方SDK的代码,低版本的Android系统不会抛出java.lang.NoClassDefFoundError异常。
附图说明
图1为传统技术获取主的Dex的流程图;
图2为本发明生成主Dex的方法的实施例1的步骤流程图;
图3是本发明一个具体实施例生成主Dex的步骤流程图;
图4为本发明一个具体实施例获取主Dex的流程图
图5为本发明生成主Dex装置实施例1的结构示意图。
具体实施方式
为了便于理解本发明,下面将参照相关附图对本发明进行更全面的描述。附图中给出了本发明的首选实施例。但是,本发明可以以许多不同的形式来实现,并不限于本文所描述的实施例。相反地,提供这些实施例的目的是使对本发明的公开内容更加透彻全面。
除非另有定义,本文所使用的所有的技术和科学术语与属于本发明的技术领域的技术人员通常理解的含义相同。本文中在本发明的说明书中所使用的术语只是为了描述具体的实施例的目的,不是旨在于限制本发明。本文所使用的术语“及/或”包括一个或多个相关的所列项目的任意的和所有的组合。
为了解决方法数超限的问题,需要将该dex文件拆成两个或多个,multidex兼容包配合AndroidStudio实现了一个APK中包含多个dex的功能。其中,主Dex能够在gradle里生成,过程如下所述:
采用multidex兼容包,Multidex可以通过将class编译进不同的classes.dex文件中来实现。将只包含了一个classes.dex文件APK进行分包,分包之后将会存在一个主的classes.dex,多个副的classes2.dex,classes3.dex,以此类推。
图1为传统技术获取主的dex的流程图,如图1所示:
步骤S110:Android studio开发工具开始加载MultiDex文件,运行collect{variant}MultiDexComponents task任务;
步骤S120:基于collect{variant}MultiDexComponents task,读取项目的程序全局配置文件(AndroidManifest.xml文件)中注册的application相关类、Activity相关类、service相关类、receiver相关类、provider相关类和instrumentation相关类,并将上述所有相关类的class文件路径写到文件buidl/intermediates/multi-dex/${variant.dirName}/manifest_keep.txt中;
步骤S130:运行shrink{variant}MultiDexComponents task,调用压缩工具ProGuard,压缩上一步生成的manifest_keep.txt文件内容中的class文件,生成一个精简的jar包buidl/intermediates/multi-dex/${variant.dirName}/componentClasses.jar;
步骤S140:运行creat{variant}MultiDexComponents task,根据上一步生成的componentClasses.jar,提取componentClasses.jar中的各个class文字中依赖的class文件,得到maindexlist.txt文件;
具体的,比如一个class文件中有一成员变量X,该class文件就是变量X依赖的class文件。componentClasses.jar中各class文字以及各class文字中依赖的class文件路径都会被写入文件buidl/intermediates/multi-dex/${variant.dirName}/maindexlist.txt中,进而得到maindexlist.txt文件。
步骤S150:基于上一步得到的maindexlist.txt文件,将maindexlist.txt文件中的类编译进主的classes.dex中得到主Dex。
上述主Dex获取流程中,在低版本Android系统的设备上,如果APK文件存在多个Dex时,当Application或主Activity启动时在主Dex上找不到Class,系统将会抛出java.lang.NoClassDefFoundError异常。
这种情况在接入第三方APK的时候尤其容易发生,第三方APK代码依赖注入的任务transformClassesWithDexFor${variant.name.capitalize()},进而不会检测依赖和控制主Dex上的class,只会实现代码注入。在启动应用程序时默认只能加载主Dex,如果在应用程序的Application或者主Activity当中注入了代码,但是在加载的时候,从主Dex上检测不到注入的代码,系统就会抛出java.lang.NoClassDefFoundError异常。
进一步的,传统的处理方法是应用程序开发者通过在module的gradle.build文件里面配置afterEvaluate,然后实现对主Dex的控制;但是Android系统的应用程序与第三方SDK的兼容性是基于处理逻辑,如果处理不当,将会抛出java.lang.NoClassDefFoundError异常。
本发明生成主Dex的方法的实施例1:
为此,本发明实施例针对低版本的Android系统,在接入第三方SDK的时候,如果APK文件存在多个Dex,并且在Android系统的设备上运行抛出异常的问题,提供一种生成主Dex的方法,图2为本发明生成主Dex的方法的实施例1的步骤流程图,如图1所示,包括以下步骤:
步骤S210:根据第三方SDK的自定义任务,修改获取到的manifest_keep.txt文件,得到修改后的manifest_keep.txt文件;
步骤S220:压缩修改后的manifest_keep.txt文件中的class文件,生成压缩包;
步骤S230:根据压缩包,生成主Dex。
具体而言,本发明实施例可以利用gradle task依赖运行机制,Android系统能够根据第三方SDK中自定义任务,对获取manifest_keep.txt文件的运行任务进行拦截和处理,即实现对获取到的manifest_keep.txt文件的修改,得到修改后的manifest_keep.txt文件。
其中,获取manifest_keep.txt文件的运行任务可以是collect{variant}MultiDexComponents task,运行collect{variant}MultiDexComponents task读取项目的程序全局配置文件(AndroidManifest.xml文件)中注册的application相关类、Activity相关类、service相关类、receiver相关类、provider相关类和instrumentation相关类,并将上述所有相关类的class文件路径写到文件buidl/intermediates/multi-dex/${variant.dirName}/manifest_keep.txt中;得到的manifest_keep.txt文件包含项目的根目录中AndroidManifest.xml文件中注册的相关类的class文件。
通过压缩修改后的manifest_keep.txt文件的class文件,可以得到一个精简的压缩包,同时将第三方SDK的代码加入这个压缩包,即生成一个包含第三方SDK代码的压缩包。可以运行creat{variant}MultiDexComponents task,根据生成的压缩包,提取压缩包中的class文件,可以将压缩包中的class文件路径写入文件buidl/intermediates/multi-dex/${variant.dirName}/maindexlist.txt中,再将maindexlist.txt文件中的类编译进主classes.dex中得到主Dex,即生成主Dex。
本发明实施例在低版本的Android系统中,通过利用第三方SDK插件自定义任务处理第三方SDK在Dex文件的class的分配情况,既不影响应用程序主Dex的class的分配,也不影响第三方SDK的逻辑和代码注入情况,系统在加载Dex的时候,可以从主Dex上检测到注入的第三方SDK的代码,使得系统不会抛出java.lang.NoClassDefFoundError异常。
在一个具体实施例中,修改获取到的manifest_keep.txt文件的步骤包括:
根据自定义任务,在manifest_keep.txt文件的文本末尾增加第三方SDK的入口类或第三方SDK的包名。
具体而言,本发明实施例可以通过运行collect{variant}MultiDexComponentstask读取项目的程序全局配置文件(AndroidManifest.xml文件)中注册的application相关类、Activity相关类、service相关类、receiver相关类、provider相关类和instrumentation相关类,并将上述所有相关类的class文件路径写到文件buidl/intermediates/multi-dex/${variant.dirName}/manifest_keep.txt中,得到manifest_keep.txt文件;得到的manifest_keep.txt文件包含项目的根目录中AndroidManifest.xml文件中注册的相关类的class文件。
Android系统对获取到的manifest_keep.txt文件的修改,可以根据第三方SDK中自定义任务,对获取manifest_keep.txt文件的运行任务进行拦截和处理来实现。在运行collect{variant}MultiDexComponents task任务结束后,开始运行第三方SDK中自定义任务,执行在manifest_keep.txt文件的文本末尾增加第三方SDK的入口类或第三方SDK的包名。
本发明实施例将第三方SDK的入口类或者整个SDK的包名以文件的形式通过软件开发工具包自定义的主Dex任务,在不影响应用程序逻辑的情况下以Android系统能够识别的格式写到manifest_keep.txt文件内容的末尾处。
在APP的主Dex本身方法数很少的情况下,在manifest_keep.txt文件的文本末尾增加第三方SDK的入口类或第三方SDK的包名,能够避免主Dex内存溢出而导致无法运行;在App的主Dex自身的方法数很多的情况下,优选地,由于SDK的入口类一般是一个类,代码量少,增加SDK的入口类可以避免主Dex内存溢出。
在一个具体实施例中,自定义任务为自定义UxMainDexTask任务。
具体而言,自定义UxMainDexTask可以封装在SDK插件里,SDK插件能够判断是否运行。本发明实施例中Android系统能够根据第三方SDK插件中的自定义UxMainDexTask任务,对获取manifest_keep.txt文件的运行任务进行拦截和处理,实现对获取到的manifest_keep.txt文件的修改。
在一个具体实施例中,压缩包为jar格式压缩包;
压缩所述修改后的manifest_keep.txt文件的class,生成压缩包的步骤包括:
调用压缩工具,压缩修改后的manifest_keep.txt文件的class,生成jar格式压缩包;压缩工具为ProGuard。
具体而言,本发明实施例中的manifest_keep.txt文件可以通过运行collect{variant}MultiDexComponents task读取项目的程序全局配置文件(AndroidManifest.xml文件)中注册的application相关类、Activity相关类、service相关类、receiver相关类、provider相关类和instrumentation相关类,并将上述所有相关类的class文件路径写到文件buidl/intermediates/multi-dex/${variant.dirName}/manifest_keep.txt中的方式得到。
本发明实施例可以通过运行shrink{variant}MultiDexComponents task,调用压缩工具ProGuard,并基于获取的manifest_keep.txt文件内容去压缩整个App项目中的class文件,保留manifest_keep.txt文件当中的class,剔除其他没有用到的class。在压缩的过程中,第三方SDK的class已经在manifest_keep.txt文件中,基于此,SDK的代码将会得以保存,进而生成一个精简的压缩包,压缩包可以为jar包,第三方SDK的代码将会被加入到jar包中,即该精简的压缩包为包含第三方SDK代码的jar包。
ProGuard是一个压缩、优化和混淆计算机编程语言(Java)字节码文件的免费的工具,它可以删除无用的类、字段、方法和属性。可以删除没用的注释,最大限度地优化字节码文件,它还可以使用简短的无意义的名称来重命名已经存在的类、字段、方法和属性。
在一个具体实施例中,根据所述压缩包,生成主Dex的具体步骤包括:
提取压缩包的class文件得到maindexlist.txt文件;class文件包括压缩包中各class文字以及各class文字依赖的class文件;
根据maindexlist.txt文件,生成主Dex。
具体而言,本发明实施例压缩包可以通过调用压缩工具ProGuard,并基于获取的manifest_keep.txt文件内容去压缩整个App项目中的class文件,保留manifest_keep.txt文件当中的class和第三方SDK的class,使得SDK的代码得以保存而得到。基于这个压缩过程,进而生成一个精简的压缩包,压缩包可以为jar包,第三方SDK的代码将会被加入到jar包中,即该精简的压缩包为包含第三方SDK代码的jar包。
优选地,本发明实施例中的包含第三方SDK代码的jar包可以是omponentClasses.jar包。根据生成的componentClasses.jar去寻找其中的各个class文字中依赖的class文件,componentClasses.jar中的各class文字以及各class文字依赖的class路径都会被写入到文件maindexlist.txt中,根据maindexlist.txt生成主Dex。
在低版本的Android系统下,当接入第三方SDK的时候,如果遇到依赖注入的方法,同时APK文件中的存在多个Dex,本发明实施例提供的生成主Dex的方法,可以避免在程序启动时在主Dex上找不到class而导致系统出错的情况。
在一个具体实施例中,生成主Dex步骤还包括:更改maindexlist.txt文件,控制主Dex。
具体而言,本发明实施例中,maindexlist.txt文件可以根据生成的压缩包componentClasses.jar包,提取componentClasses.jar包中所有的class文字和class文字依赖的class文件而得到。根据maindexlist.txt文件,生成主Dex,在不影响APP的情况下,可以通过改变maindexlist.txt文件达到实现控制主Dex的目的。能够避免在低版本的Android系统下,当接入第三方SDK的时候,如果遇到依赖注入的方法,同时APK文件中的存在多个Dex时系统出错。
在一个具体实施例中,针对低版本的Android系统,以Android5.0以下系统设备为例,图3是本发明一个具体实施例生成主Dex的步骤流程图,如图3所示:
步骤S310:Android studio开发工具开始加载MultiDex文件,运行collect{variant}MultiDexComponents task任务;
步骤S320:基于collect{variant}MultiDexComponents task,读取项目的程序全局配置文件(AndroidManifest.xml文件)中注册的application相关类、Activity相关类、service相关类、receiver相关类、provider相关类和instrumentation相关类,并将上述所有相关类的class文件路径写到文件buidl/intermediates/multi-dex/${variant.dirName}/manifest_keep.txt中;
具体的,相关类是Android官方明确声明需要在AndroidManifest.xml文件中注册的,是必须打包到App的主Dex上,否则系统会出现报错。
步骤S330:在collect{variant}MultiDexComponents task结束之后,运行第三方SDK插件自定义UxMainDexTask任务,执行在manifest_keep.txt文件的文本末尾增加第三方SDK的入口类或第三方SDK的包名;
步骤S340:运行shrink{variant}MultiDexComponents task,调用压缩工具ProGuard,基于获取的manifest_keep.txt文件内容去压缩整个App项目中的class文件,保留manifest_keep.txt文件当中的class,剔除其他没有用到的class,生成一个精简的压缩包componentClasses.jar;
具体的,在压缩的过程中,第三方SDK的class已经在manifest_keep.txt文件中,基于此,SDK的代码将会得以保存,进而生成一个精简的压缩包,压缩包可以为jar包,第三方SDK的代码将会被加入到jar包中,该精简的压缩包为包含第三方SDK代码的jar包,即buidl/intermediates/multi-dex/${variant.dirName}/componentClasses.jar。
步骤S340:运行creat{variant}MultiDexComponents task,根据上一步生成的componentClasses.jar,提取componentClasses.jar中的各个class文字中依赖的class文件,得到maindexlist.txt文件;
具体的,比如一个class文件中有一成员变量X,该class文件就是变量X依赖的class文件。componentClasses.jar中各class文字以及各class文字中依赖的class文件路径都会被写入文件buidl/intermediates/multi-dex/${variant.dirName}/maindexlist.txt中,即得到maindexlist.txt文件。
步骤S350:基于上一步得到的maindexlist.txt文件,将maindexlist.txt文件中的类编译进主的classes.dex中得到主Dex。
具体而言,图4为本发明一个具体实施例获取主Dex的流程图,参考图4,本发明实施例可以利用gradle task依赖运行机制,Android系统能够根据第三方SDK插件中自定义UxMainDexTask任务,当collect{variant}MultiDexComponents的运行结束后,会在当前module的build/intermediates/multi-dex/${variant.dirName}/目录下生成manifest_keep.txt文件,第三方SDK插件的自定义UxMainDextask检测到collect{variant}MultiDexComponents任务运行结束时,对manifest_keep.txt文件进行修改,修改的步骤不会影响App的逻辑,以系统能够识别的格式将第三方SDK的入口类或者整个SDK的包名添加到manifest_keep.txt文件内容的末尾;完成对manifest_keep.txt文件的修改。componentClasses.jar可以通过压缩manifest_keep.txt文件而得到,修改manifest_keep.txt文件进而影响componentClasses.jar。主Dex可以根据manifest_keep.txt文件二生成,在不影响App的情况下,最终可以通过改变maindexlist.txt文件而实现控制主Dex的目的。
在低版本Android系统设备中,如Android5.0以下系统设备,传统的主Dex生成逻辑,在接入第三方SDK的时候,如果遇到依赖注入的方法,同时APK文件存在多个dex,并且在Android5.0以下系统的设备上运行;当Application或Activity启动时在主Dex上找不到Class,系统抛出java.lang.NoClassDefFoundError异常。本发明实施例通过SDK的插件自定义任务启动对collect{variant}MultiDexComponents task任务进行拦截和处理,实现控制主Dex的目的,防止抛出java.lang.NoClassDefFoundError异常。基于分包后的APK,当程序启动时,Android系统首先加载主的classes.dex,在程序启动后,Android系统加载其它副的dex,解决Android5.0以下系统设备的一大隐患,意味可以解决设备上存在的隐患。
本发明实施例还提供了一种生成主Dex的装置,图4为本发明生成主Dex装置实施例1的结构示意图,如图4所示:
本发明实施例包括:
修改单元510,用于根据第三方SDK的自定义任务,修改获取到的manifest_keep.txt文件,得到修改后的manifest_keep.txt文件;
压缩单元520,用于压缩修改后的manifest_keep.txt文件中的class,生成压缩包;
生成单元530,用于根据压缩包,生成主Dex。
本发明实施例还提供了一种计算机设备,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,处理器执行计算机程序时实现上述任意一项实施例中的生成Dex的方法。
本发明实施例还提供了一种计算机存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述任意一项实施例中的生成Dex的方法。
上述技术方案具有如下有益效果:
本发明提供的生成主Dex的方法及装置,是针对Android的低版本的Android系统的设备运行时,根据第三方SDK的自定义任务,可以基于获取到的manifest_keep.txt文件,对manifest_keep.txt文件进行修改,进而再压缩修改后的文件中得到包含第三方的SDK代码的压缩包,根据压缩包生成主Dex。基于生成的主Dex,能够检测到加载的时候注入的第三方SDK的代码,低版本的Android系统不会抛出java.lang.NoClassDefFoundError异常。
以上所述实施例的各技术特征可以进行任意的组合,为使描述简洁,未对上述实施例中的各个技术特征所有可能的组合都进行描述,然而,只要这些技术特征的组合不存在矛盾,都应当认为是本说明书记载的范围。本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,所述的程序可以存储于一计算机可读取存储介质中,该程序在执行时,包括以上方法所述的步骤,所述的存储介质,如:ROM/RAM、磁碟、光盘等。
以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。

Claims (10)

1.一种生成主Dex的方法,其特征在于,包括以下步骤:
根据第三方软件开发工具包的自定义任务,修改获取到的manifest_keep.txt文件,得到修改后的manifest_keep.txt文件;
压缩所述修改后的manifest_keep.txt文件中的class文件,生成压缩包;
根据所述压缩包,生成主Dex。
2.根据权利要求1所述的生成主Dex的方法,其特征在于,修改获取到的manifest_keep.txt文件的步骤包括:
根据所述自定义任务,在所述manifest_keep.txt文件的文本末尾增加第三方软件开发工具包的入口类或第三方软件开发工具包的包名。
3.根据权利要求2所述的生成主Dex的方法,其特征在于,所述自定义任务为自定义UxMainDexTask任务。
4.根据权利要求1所述的生成主Dex的方法,其特征在于,所述压缩包为jar格式压缩包;
压缩所述修改后的manifest_keep.txt文件的class,生成压缩包的步骤包括:
调用压缩工具,压缩所述修改后的manifest_keep.txt文件的class,生成jar格式压缩包;
将第三方软件开发工具包的代码加入所述jar格式压缩包。
5.根据权利要求4所述的生成主Dex的方法,其特征在于,所述压缩工具为ProGuard。
6.根据权利要求1至5任意一项所述的生成主Dex的方法,其特征在于,根据所述压缩包,生成主Dex的步骤包括:
提取所述压缩包的class文件,得到maindexlist.txt文件;所述class文件包括所述压缩包中各class文字以及各所述class文字依赖的class文件;
根据所述maindexlist.txt文件,生成所述主Dex。
7.根据权利要求6所述的生成主Dex的方法,其特征在于,根据所述压缩包,生成主Dex的步骤之后还包括步骤:
更改所述maindexlist.txt文件,控制所述主Dex。
8.一种生成主Dex的装置,其特征在于,包括:
修改单元,用于根据第三方软件开发工具包的自定义任务,修改获取到的manifest_keep.txt文件,得到修改后的manifest_keep.txt文件;
压缩单元,用于压缩所述修改后的manifest_keep.txt文件中的class,生成压缩包;
生成单元,用于根据所述压缩包,生成主Dex。
9.一种计算机设备,包括存储器、处理器以及存储在所述存储器上并可在所述处理器上运行的计算机程序,其特征在于,所述处理器执行所述计算机程序时实现如权利要求1至6任意一项所述的生成主Dex的方法。
10.一种计算机存储介质,其上存储有计算机程序,其特征在于,该程序被处理器执行时实现如权利要求1至6任意一项所述的生成主Dex的方法。
CN201810011448.1A 2018-01-05 2018-01-05 生成主Dex的方法及装置 Pending CN108073406A (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201810011448.1A CN108073406A (zh) 2018-01-05 2018-01-05 生成主Dex的方法及装置

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201810011448.1A CN108073406A (zh) 2018-01-05 2018-01-05 生成主Dex的方法及装置

Publications (1)

Publication Number Publication Date
CN108073406A true CN108073406A (zh) 2018-05-25

Family

ID=62156363

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201810011448.1A Pending CN108073406A (zh) 2018-01-05 2018-01-05 生成主Dex的方法及装置

Country Status (1)

Country Link
CN (1) CN108073406A (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111752548A (zh) * 2020-05-22 2020-10-09 网宿科技股份有限公司 一种sdk嵌入方法及装置、计算机可读存储介质

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104866293A (zh) * 2014-02-25 2015-08-26 北京娜迦信息科技发展有限公司 一种对Android应用程序扩展功能的方法及装置
US20160132547A1 (en) * 2014-11-11 2016-05-12 SEWORKS, Inc. Apparatus and method for managing apk file in an android platform
CN106569868A (zh) * 2016-11-09 2017-04-19 腾讯音乐娱乐(深圳)有限公司 一种基于Gradle的编译优化方法及装置

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN104866293A (zh) * 2014-02-25 2015-08-26 北京娜迦信息科技发展有限公司 一种对Android应用程序扩展功能的方法及装置
US20160132547A1 (en) * 2014-11-11 2016-05-12 SEWORKS, Inc. Apparatus and method for managing apk file in an android platform
CN106569868A (zh) * 2016-11-09 2017-04-19 腾讯音乐娱乐(深圳)有限公司 一种基于Gradle的编译优化方法及装置

Non-Patent Citations (1)

* Cited by examiner, † Cited by third party
Title
MXN: "Android分包原理", 《HTTP://SOULY.CN/技术博文/2016/02/25/ANDROID分包原理/》 *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN111752548A (zh) * 2020-05-22 2020-10-09 网宿科技股份有限公司 一种sdk嵌入方法及装置、计算机可读存储介质

Similar Documents

Publication Publication Date Title
CN109491695B (zh) 一种集成安卓应用的增量更新方法
US6298353B1 (en) Checking serialization compatibility between versions of java classes
US11797692B2 (en) Tool for generating security policies for containers
CN104899016B (zh) 调用堆栈关系获取方法及装置
US20090249311A1 (en) Sharing a native module of compiled code using an abstraction module of interpreted code in a virtual machine environment
US9582418B2 (en) Confirming the sensitivity of a data object in a managed object heap
CN108121563A (zh) 应用功能定制方法、装置、计算设备以及存储介质
US20090254575A1 (en) Apparatus and method for manipulating nested archive files and folders
CN107678938A (zh) 一种应用程序的调试方法及设备
CN104714812A (zh) 在云环境中快速部署和加载Java应用的方法和系统
CN105138333A (zh) 基于安卓系统的apk文件压缩的方法及系统
KR101316902B1 (ko) 멀티테넌시를 지원하기 위한 확장된 자바가상머신 및 이를 이용한 멀티테넌시 처리 방법
CN110321134A (zh) 一种生成应用安装包的方法、存储介质以应用服务器
CN107832059A (zh) 一种基于Makefile的代码静态分析方法和装置
CN106648564A (zh) 一种用于采集业务数据的方法和装置
CN110232051A (zh) 应用程序重复资源处理方法及装置
CN108279940A (zh) 一种web容器中的模块加载方法和装置
CN108279941A (zh) 一种应用程序的压缩方法和装置
US20150113506A1 (en) Method and system for adaptive loading of application
CN106406923A (zh) 动态库文件的处理方法及装置
CN108073406A (zh) 生成主Dex的方法及装置
CN106874060A (zh) 一种判断jar包是否被引用的方法及设备
KR102141749B1 (ko) App 프로그램 실행 방법 및 장치
CN105446759A (zh) 一种rpm包更新方法与设备
CN111880800A (zh) 应用下载方法与应用下载系统

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
RJ01 Rejection of invention patent application after publication
RJ01 Rejection of invention patent application after publication

Application publication date: 20180525