CN107844301A - 一种安卓应用渠道合包方法及装置 - Google Patents
一种安卓应用渠道合包方法及装置 Download PDFInfo
- Publication number
- CN107844301A CN107844301A CN201711317520.5A CN201711317520A CN107844301A CN 107844301 A CN107844301 A CN 107844301A CN 201711317520 A CN201711317520 A CN 201711317520A CN 107844301 A CN107844301 A CN 107844301A
- Authority
- CN
- China
- Prior art keywords
- bag
- file
- main bag
- resource
- main
- 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.)
- Withdrawn
Links
Classifications
-
- 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
-
- 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
Landscapes
- Engineering & Computer Science (AREA)
- General Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Software Systems (AREA)
- Physics & Mathematics (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
一种安卓应用渠道合包方法及装置,所述方法包括步骤:获取母包和子包的资源、代码和配置文件;重命名母包的包名,以及母包和子包的包名路径;将子包的资源文件合并到母包中,生成合并资源文件的母包;将子包的代码文件合并到母包中;将子包的配置文件合并到母包中,以及修改母包的配置文件;编译母包目录生成apk,并进行签名、序列化。本发明的安卓应用渠道合包方法及装置,能够简化渠道推广流程并大量节省开发时间且出错率很低。
Description
技术领域
本发明涉及通讯技术领域,特别是涉及一种安卓应用渠道合包方法及装置。
背景技术
游戏公司想要推广自己的手游产品,靠每家公司自己的运营能力去推广作用是有限的,覆盖面不是很广。但是也有一些公司不是做手游的,他们的主核心是做应用的推广、游戏、工具等等,而且在用户群体里面有很高的关注度及访问量,被称为渠道商。一个需要推广,一个是做推广的,问题的重点是怎么接入到别人的渠道平台进行推广。渠道商一般是提供SDK进行对接的,里面有对接的事例、对接接口文档、对接调试、SDK文档信息。对接渠道商的SDK需要专门的程序进行对接、调试、测试,这个流程走下来,可能要花费几天到一周的时间不等,接入的渠道商少的话,还可应付,如果一款手游产品很火爆,在极短的时间内接入几十个、乃至上百个渠道的话,那就不是几个程序员,花费几周的时间能对接完成的。
现有的技术中,常用的一种方法是,公司自己封装渠道商的SDK,写一个公共的JAR库,然后建立一个测试项目,来测试游戏的登录、支付等功能,最后把这个JAR库提供给游戏项目,加入到项目工程里去,然后还需要项目的程序员在代码中加入对接的接口,修改每个对接渠道的ID和KEY再进行测试。另一种方法则是,再写一个脚本,批量的修改渠道的ID和KEY,批量的引入工程代码JAVA,在脚本中进行编译APK、打签名,然后测试。
在上述两种方法中,手游项目进行渠道对接都绕不开游戏的源代码,并需要手游项目的人参与进去进行操作完成对接,从某种程度上来说,确实是提高了不少效率,但是没有从根本上释放手游项目程序员的时间,没有把一键对接和做游戏完全的分离开。
因此需要一个简便的方法优化此过程,即有专门的人去做渠道的对接,然后把手游的APK和渠道商的SDK进行动态的合并,SDK的功能测试交给专人去测试,把渠道和游戏分离开来,做游戏不需要关心渠道的对接,做渠道对接的也不要去关心游戏。因此,如何实现APK和SDK的合并就成为了需要解决的重点核心技术问题。
发明内容
为了解决现有技术存在的不足,本发明的目的在于提供一种安卓应用渠道合包方法及装置,对APK和SDK进行一键合包,把渠道和应用分离开来,使做应用的不需要关心渠道的对接,做渠道对接的也不要去关心应用。
为实现上述目的,本发明提供的安卓应用渠道合包方法,包括以下步骤:
获取母包和子包的资源、代码和配置文件;
重命名母包的包名,以及母包和子包的包名路径;
将子包的资源文件合并到母包中,生成合并资源文件的母包;
将子包的代码文件合并到母包中;
将子包的配置文件合并到母包中,以及修改母包的配置文件;
编译母包目录生成apk,并进行签名、序列化。
进一步地,所述将子包的资源文件合并到母包中,生成合并资源文件的母包的步骤之前,执行步骤:生成母包和子包各自的资源文件的索引文件。
进一步地,所述将子包的资源文件合并到母包中,生成合并资源文件的母包的步骤之后,执行步骤:生成合并资源文件的母包的资源文件的索引文件,并序列化资源ID。
进一步地,所述将子包的代码文件合并到母包中的步骤之前,执行步骤:修改母包、子包的代码文件的属性信息。
进一步地,所述编译母包目录生成apk,并进行签名、序列化的步骤之前,执行步骤:添加广告商ID到母包的配置文件。
进一步地,若一个渠道有多个广告商ID,则循环执行所述添加广告商ID到母包的配置文件的步骤,以及所述编译母包目录生成apk,并进行签名、序列化的步骤。
进一步地,若一次合并多个渠道,则循环执行所述安卓应用渠道合包方法中所述的步骤。
为实现上述目的,本发明提供的安卓应用渠道合包装置,包括:apk反编译模块、包名修改模块、资源文件合并模块、代码文件合并模块、配置文件修改模块和apk编译模块,其中,
所述apk反编译模块,用于获取母包和子包的资源、代码和配置文件;
所述包名修改模块,用于重命名母包的包名,以及母包和子包的包名路径;
所述资源文件合并模块,用于将子包的资源文件合并到母包中,生成合并资源文件的母包;
所述代码文件合并模块,用于将子包的代码文件合并到母包中;
所述配置文件修改模块,用于将子包的配置文件合并到母包中,以及修改母包的配置文件;
所述apk编译模块,用于编译母包目录生成apk,并进行签名、序列化。
进一步地,所述资源文件合并模块,还用于生成母包和子包各自的资源文件的索引文件,以及生成合并资源文件的母包的资源文件的索引文件,并序列化资源ID。
进一步地,所述配置文件修改模块,还用于添加广告商ID到母包的配置文件。
本发明的安卓应用渠道合包方法及装置,能够简化渠道推广流程并大量节省开发时间且出错率很低。
本发明的其它特征和优点将在随后的说明书中阐述,并且,部分地从说明书中变得显而易见,或者通过实施本发明而了解。
附图说明
附图用来提供对本发明的进一步理解,并且构成说明书的一部分,并与本发明的实施例一起,用于解释本发明,并不构成对本发明的限制。在附图中:
图1为根据本发明的安卓应用渠道合包方法流程图;
图2为根据本发明的安卓应用渠道合包装置结构图。
具体实施方式
以下结合附图对本发明的优选实施例进行说明,应当理解,此处所描述的优选实施例仅用于说明和解释本发明,并不用于限定本发明。
在以下实施例中,各个应用项目开发的客户端apk称为母包,封装了渠道SDK的apk称为子包。
图1为根据本发明的安卓应用渠道合包方法流程图,下面将参考图1,对本发明的安卓应用渠道合包方法进行详细描述。
在步骤110,反编译母包和子包,获取母包和子包的资源、代码和配置文件。
该步骤中,将母包和子包分别反编译到各自指定的目录下,例如,分别为[game_dir]、[channel_dir]。如果目录为空则先用Windows的rd命令清空,如果没有目录则用Windows的SHCreateDirectoryEx新建目录。并且可以使用apktool.jar的apktool.jar d -f package -o [game_dir]/[channel_dir]命令分别反编译母包和子包到不同的文件夹下。
在步骤120,重命名母包的包名,以及母包和子包的包名路径。
该步骤中,替换母包AndroidManifest.xml中的应用包名称以及母包和子包的smali文件(代码文件)中的包名路径。此步骤的一种实现方式是:
用xml读取方法打开反编译后母包中的AndroidManifest.xml,获取xml根节点的package属性得到原始的应用包名;和配置的新包名比较,相同则不做任何操作,不同则先替换AndroidManifest.xml中的包名;然后使用CFileFind类轮询遍历母包和子包中的smali目录列出所有的smali文件,二进制方式逐一打开smali文件,用包名对应的路径替换所有smali文件中的包名路径(比如新包名为com.snailgame.panda.yy则用com/snailgame/panda/yy替换),并创建新包名对应的目录[game_dir/com/snailgame/panda/yy],用xcopy [dir] [new_dir] /s/e/y/c命令将原包名对应目录下的文件拷贝到新包名对应目录下,然后rd /s /q命令删除原包名对应的目录。
在步骤130,将子包的资源文件合并到母包中,生成合并资源文件的母包。
在合并资源文件之前,使用aapt.exe工具命令分别生成母包和子包各自的R.java文件。例如,使用aapt.exe package -f -m -J [game_Rjava_Dir]/ [channel_Rjava_Dir]-S [game_dir\res]/ [channel_dir\res] -I [android.jar] -M [game_dir\AndroidManifest.xml]/ [channel_dir\AndroidManifest.xml]命令分别生成R.java文件到[game_Rjava_Dir]/[channel_Rjava_Dir]下。其中,R.java文件为母包、子包的资源文件的索引文件。
该步骤中,合并资源文件时,首先,使用xcopy命令将子包中的assets目录合并到母包的assets目录。例如,使用xcopy命令将[channel_dir\assets]拷贝到[game_dir\assets]目录下:使用CFileFind类循环列出[channel_dir\assets]和[game_dir\assets]目录下的所有文件到vector中,使用xcopy命令逐一拷贝。xcopy命令注意带上/s/e/y/c参数。如果有配置额外需要添加的母包和子包资源,需要先将这些资源分别拷贝到[channel_dir\assets]和[game_dir\assets]中。
然后,使用xcopy命令将子包的lib目录合并到母包lib目录。例如,使用xcopy命令将[channel_dir\lib]拷贝到[game_dir\lib]目录下:使用CFileFind类循环列出[channel_dir\lib]和[game_dir\lib]目录下的所有文件到vector中,使用xcopy命令逐一拷贝。如果[game_dir\lib]只有armeabi目录,[channel_dir\lib]只有armeabi-v7a目录,则只将[game_dir\lib]的armeabi目录拷贝到[game_dir\lib]的armeabi-v7a目录,并删除armeabi目录;[game_dir\lib]的armeabi目录、 [channel_dir\lib]中的armeabi目录,需要合并到[game_dir\lib]的armeabi 目录、[game_dir\lib]的armeabi-v7a目录,[channel_dir\lib]中的armeabi-v7a目录和armeabi目录,需要拷贝到[game_dir\lib]的armeabi-v7a目录。对于x86目录的特殊处理:当[game_dir\lib]有x86目录,而[channel_dir\lib]没有x86目录,则合并后的包就没有x86目录,需要删除[game_dir\lib]的x86目录。对于[game_dir\lib]中的其他目录:只有[game_dir\lib]和[channel_dir\lib]都有的其他目录,才需要拷贝。
最后,使用copy命令将子包中的res目录文件逐个合并到母包的res目录,有同名文件合并文件内容。例如,使用xcopy命令将[channel_dir\res]拷贝到[game_dir\res]目录下:使用CFileFind类循环列出[channel_dir\res]和[game_dir\res]目录下的所有文件到vector中,使用copy命令逐一拷贝。如果拷贝出现同名的xml文件,则用二进制文件读取方式合并文件内容。
在合并资源文件之后,首先,使用aapt.exe工具命令用合并资源文件的母包生成R.java文件。然后,再使用读取xml文件方法分别解析原母包、子包的R.java文件以及合并资源文件的母包的R.java文件,将文件的资源名称对应的资源ID分别存入不同的map中,序列化资源ID 。
例如,使用aapt.exe package -f -m -J [game_Rjava_Dir] -S [game_dir\res]-I [android.jar] -M [game_dir\AndroidManifest.xml]命令生成R.java文件到[unite_Rjava_Dir]下;然后,二进制读取原母包、子包以及合并资源文件的母包的R.java文件(三个),并分别将资源名称和资源ID存储到三个map中,序列化资源ID。
在步骤140,将子包的代码文件合并到母包中。
该步骤中,首先,使用二进制文件读写方法将合并资源文件的母包的R.java文件,按照规律写入R.smali和R$*.smali文件中,生成新的R.smali和R$*.smali文件。
具体而言,用合并资源文件的母包的R.java中的资源ID替换[game_dir/res/value/public.xml]中的资源ID,并且轮询[game_dir/smali]和[channel_dir/smali]下的所有.smali文件,用合并资源文件的母包的R.java中的资源ID替换原有的资源ID。
查找资源ID的方法是,查找smali文件中的const v和const/high16 v字符串,出现此字符串说明后面的是资源ID,需要用新的资源ID替换之。
替换资源ID的方法是:
1)根据母包的R.java解析出资源名称和资源ID,按照模板生成R.smali文件,反编译原有的R.smali,在原有的R.smali的基础上修改如下三行内容:
".class public final L";//替换包名称和文件名;
" L";这大括号中按照格式填上R.java中的资源名称和资源ID//注意最后一个资源类名后只有分号没有逗号;
" .line ";//修改行号
2)根据母包的R.java解析出资源类数组,按照模板生成R$*.smali文件,轮询资源类数组创建文件,有多少个资源类创建多少个文件,类名替换R$*.smali的*作为文件名。每个文件中包含类中的资源和资源ID,格式如下:
".class public final L";//修改包名和资源类名(文件名)
" value = L";//修改包名
" name = ";//修改资源类名
".field public static final ";//添加资源信息,每个资源都按照这个字符串+资源名称+":I="+资源ID
" .line ";//修改行号
然后,使用xml读写方法,修改母包的AndroidManifest.xml中application的android:name属性:
1)如果母包中有这项属性,则需要取出来修改对应的smali文件。查找对应的smali文件方法为:
如果application android:name=".SnailApp",则smali在包名目录下:com.snailgame.panda.snail.SnailApp;否则,则在com.snail.SnailApp路径下[game_dir/smali/com/snail/SnailApp.smali]。找到smali文件后,读取smali文件的.super路径,如果.super路径是Landroid/app/Application,则继续对此文件操作;如果.super路径不是Landroid/app/Application,则继续查找.super路径对应的smali文件,直到.super路径是Landroid/app/Application为止。
2)如果母包中没有这项属性,则读取子包的中AndroidManifest.xml的application的android:name,有则替换没有则不操作。
最后,通过上述步骤修改母包、子包的代码文件的属性信息之后,使用xcopy命令将子包的smali目录文件合并到母包的smali目录,如果方法数超过65535会有smali_classes2目录,也需要同理合并。例如,使用xcopy命令将[channel_dir\smali]拷贝到[game_dir\smali]目录下,如果母包或者子包中方法数超过65535会有smali_classes2生成,也同理合并。并且将新生成的R.smali和R$*.smali文件,也用xcopy命令拷贝到[game_dir/smali]下面的包名对应的目录下。
在步骤150,将子包的配置文件合并到母包中,以及修改母包的配置文件。
该步骤中,使用xcopy命令将子包的unknown目录文件合并到母包的unknown目录。例如,使用xcopy命令将[channel_dir\unknown]拷贝到[game_dir\unknown]目录下。
使用读取xml文件的方法将子包中的AndroidManifest.xml内容合并到母包。例如,使用读取xml文件的方法将 [channel_dir\ AndroidManifest.xml]内容合并到[game_dir\ AndroidManifest.xml]。如果有配置额外的需要添加的属性也在此时添加到[game_dir\ AndroidManifest.xml]。
使用xml读写方法修改母包的AndroidManifest.xml中的版本号及调试模式。例如,使用xml读写方法修改[game_dir\ AndroidManifest.xml]中的版本号("android:versionCode")及调试模式("android:debuggable")。
修改应用icon图标,使用xcopy命令将需要修改的icon文件拷贝到图标目录下例如[game_dir/res]。
使用二进制文件读写方法读取步骤110中生成的apktool.yml文件[game_dir/apktool.yml]和[channel_dir/apktool.ylm]中minSdkVersion和targetSdkVersion,取母包和子包中的较大值写入母包的apktool.yml文件中。
使用二进制文件读写方法读取步骤110中生成的apktool.yml文件[game_dir/apktool.yml] 和[channel_dir/apktool.ylm]中unknownFiles字符串大括号下的内容,将子包中的写入母包apktool.yml文件中。
在步骤160,添加广告商ID到母包的配置文件。
该步骤中,可以使用xml写文件方法将广告商ID添加到母包的AndroidManifest.xml中。例如,使用xml写文件方法将广告商ID添加到[game_dir/AndroidManifest.xml]中。如果有MediaID配置,则修改mediaid,如果没有则添加到Activity级节点下。例如,meta-data android:name="广告商名称" android:value="广告商ID"。
在步骤170,编译母包目录生成apk,并进行签名、序列化。
该步骤中,首先,使用apktool.jar命令编译母包目录,生成apk。命令为:apktool.jar b -f [game_dir] -o unsigned.apk。
其次,使用SignApk.jar命令对生成的apk进行签名。命令为:java –jarSignApk.jar file.keystore storepassword aliasname aliaspassword unsigned.apkSigned.apk.
然后,使用zipalign命令对签名后的apk进行序列化。命令为:zipalign -v 4Signed.apk 正式发布.apk。
最后,将此正式发布的apk用copy命令拷贝到最终的产品目录下,可以按照时间+媒体ID重命名文件,因为可能会一次生成多个同渠道的apk。
在步骤180,若一个渠道有多个广告商ID,则循环执行步骤160-170;若一次合并多个渠道,则循环执行步骤110-170。
图2为根据本发明的安卓应用渠道合包装置结构图,如图2所示,本发明的安卓应用渠道合包装置200,包括:apk反编译模块210、包名修改模块220、资源文件合并模块230、代码文件合并模块240、配置文件修改模块250和apk编译模块260,其中,
apk反编译模块210,用于反编译母包和子包,获取母包和子包的资源、代码和配置文件。
具体而言,将母包和子包分别反编译到各自指定的目录下,例如,分别为[game_dir]、[channel_dir]。如果目录为空则先用Windows的rd命令清空,如果没有目录则用Windows的SHCreateDirectoryEx新建目录。并且可以使用apktool.jar的apktool.jar d -f package -o [game_dir]/[channel_dir]命令分别反编译母包和子包到不同的文件夹下。
包名修改模块220,用于重命名母包的包名,以及母包和子包的包名路径。
具体而言,替换母包AndroidManifest.xml中的应用包名称,以及母包和子包的smali文件(代码文件)中的包名路径。一种实现方式是:
用xml读取方法打开反编译后母包中的AndroidManifest.xml,获取xml根节点的package属性得到原始的应用包名;和配置的新包名比较,相同则不做任何操作,不同则先替换AndroidManifest.xml中的包名;然后使用CFileFind类轮询遍历母包和子包中的smali目录列出所有的smali文件,二进制方式逐一打开smali文件,用包名对应的路径替换所有smali文件中的包名路径(比如新包名为com.snailgame.panda.yy则用com/snailgame/panda/yy替换),并创建新包名对应的目录[game_dir/com/snailgame/panda/yy],用xcopy [dir] [new_dir] /s/e/y/c命令将原包名对应目录下的文件拷贝到新包名对应目录下,然后rd /s /q命令删除原包名对应的目录。
资源文件合并模块230,用于将子包的资源文件合并到母包中,生成合并资源文件的母包。
具体而言,在合并资源文件之前,使用aapt.exe工具命令分别生成母包和子包各自的R.java文件。例如,使用aapt.exe package -f -m -J [game_Rjava_Dir]/ [channel_Rjava_Dir] -S [game_dir\res]/ [channel_dir\res] -I [android.jar] -M [game_dir\AndroidManifest.xml]/ [channel_dir\AndroidManifest.xml]命令分别生成R.java文件到[game_Rjava_Dir]/[channel_Rjava_Dir]下。其中,R.java文件为母包、子包的资源文件的索引文件。
合并资源文件时,首先,使用xcopy命令将子包中的assets目录合并到母包的assets目录。例如,使用xcopy命令将[channel_dir\assets]拷贝到[game_dir\assets]目录下:使用CFileFind类循环列出[channel_dir\assets]和[game_dir\assets]目录下的所有文件到vector中,使用xcopy命令逐一拷贝。xcopy命令注意带上/s/e/y/c参数。如果有配置额外需要添加的母包和子包资源,需要先将这些资源分别拷贝到[channel_dir\assets]和[game_dir\assets]中。
然后,使用xcopy命令将子包的lib目录合并到母包lib目录。例如,使用xcopy命令将[channel_dir\lib]拷贝到[game_dir\lib]目录下:使用CFileFind类循环列出[channel_dir\lib]和[game_dir\lib]目录下的所有文件到vector中,使用xcopy命令逐一拷贝。如果[game_dir\lib]只有armeabi目录,[channel_dir\lib]只有armeabi-v7a目录,则只将[game_dir\lib]的armeabi目录拷贝到[game_dir\lib]的armeabi-v7a目录,并删除armeabi目录;[game_dir\lib]的armeabi目录、 [channel_dir\lib]中的armeabi目录,需要合并到[game_dir\lib]的armeabi 目录、[game_dir\lib]的armeabi-v7a目录,[channel_dir\lib]中的armeabi-v7a目录和armeabi目录,需要拷贝到[game_dir\lib]的armeabi-v7a目录。对于x86目录的特殊处理:当[game_dir\lib]有x86目录,而[channel_dir\lib]没有x86目录,则合并后的包就没有x86目录,需要删除[game_dir\lib]的x86目录。对于[game_dir\lib]中的其他目录:只有[game_dir\lib]和[channel_dir\lib]都有的其他目录,才需要拷贝。
最后,使用copy命令将子包中的res目录文件逐个合并到母包的res目录,有同名文件合并文件内容。例如,使用xcopy命令将[channel_dir\res]拷贝到[game_dir\res]目录下:使用CFileFind类循环列出[channel_dir\res]和[game_dir\res]目录下的所有文件到vector中,使用copy命令逐一拷贝。如果拷贝出现同名的xml文件,则用二进制文件读取方式合并文件内容。
在合并资源文件之后,首先,使用aapt.exe工具命令用合并资源文件的母包生成R.java文件。然后,再使用读取xml文件方法分别解析原母包、子包的R.java文件以及合并资源文件的母包的R.java文件,将文件的资源名称对应的资源ID分别存入不同的map中,序列化资源ID 。
例如,使用aapt.exe package -f -m -J [game_Rjava_Dir] -S [game_dir\res]-I [android.jar] -M [game_dir\AndroidManifest.xml]命令生成R.java文件到[unite_Rjava_Dir]下;然后,二进制读取原母包、子包以及合并资源文件的母包的R.java文件(三个),并分别将资源名称和资源ID存储到三个map中,序列化资源ID。
代码文件合并模块240,用于将子包的代码文件合并到母包中。
具体而言,首先,使用二进制文件读写方法将合并资源文件的母包的R.java文件,按照规律写入R.smali和R$*.smali文件中,生成新的R.smali和R$*.smali文件。
例如,用合并资源文件的母包的R.java中的资源ID替换[game_dir/res/value/public.xml]中的资源ID,并且轮询[game_dir/smali]和[channel_dir/smali]下的所有.smali文件,用合并资源文件的母包的R.java中的资源ID替换原有的资源ID。
查找资源ID的方法是,查找smali文件中的const v和const/high16 v字符串,出现此字符串说明后面的是资源ID,需要用新的资源ID替换之。
替换资源ID的方法是:
1)根据母包的R.java解析出资源名称和资源ID,按照模板生成R.smali文件,反编译原有的R.smali,在原有的R.smali的基础上修改如下三行内容:
".class public final L";//替换包名称和文件名;
" L";这大括号中按照格式填上R.java中的资源名称和资源ID//注意最后一个资源类名后只有分号没有逗号;
" .line ";//修改行号
2)根据母包的R.java解析出资源类数组,按照模板生成R$*.smali文件,轮询资源类数组创建文件,有多少个资源类创建多少个文件,类名替换R$*.smali的*作为文件名。每个文件中包含类中的资源和资源ID,格式如下:
".class public final L";//修改包名和资源类名(文件名)
" value = L";//修改包名
" name = ";//修改资源类名
".field public static final ";//添加资源信息,每个资源都按照这个字符串+资源名称+":I="+资源ID
" .line ";//修改行号
然后,使用xml读写方法,修改母包的AndroidManifest.xml中application的android:name属性:
1)如果母包中有这项属性,则需要取出来修改对应的smali文件。查找对应的smali文件方法为:
如果application android:name=".SnailApp",则smali在包名目录下:com.snailgame.panda.snail.SnailApp;否则,则在com.snail.SnailApp路径下[game_dir/smali/com/snail/SnailApp.smali]。找到smali文件后,读取smali文件的.super路径,如果.super路径是Landroid/app/Application,则继续对此文件操作;如果.super路径不是Landroid/app/Application,则继续查找.super路径对应的smali文件,直到.super路径是Landroid/app/Application为止。
2)如果母包中没有这项属性,则读取子包的中AndroidManifest.xml的application的android:name,有则替换没有则不操作。
最后,通过上述步骤修改母包、子包的代码文件的属性信息之后,使用xcopy命令将子包的smali目录文件合并到母包的smali目录,如果方法数超过65535会有smali_classes2目录,也需要同理合并。例如,使用xcopy命令将[channel_dir\smali]拷贝到[game_dir\smali]目录下,如果母包或者子包中方法数超过65535会有smali_classes2生成,也同理合并。并且将新生成的R.smali和R$*.smali文件,也用xcopy命令拷贝到[game_dir/smali]下面的包名对应的目录下。
配置文件修改模块250,将子包的配置文件合并到母包中,以及修改母包的配置文件。
具体而言,使用xcopy命令将子包的unknown目录文件合并到母包的unknown目录。例如,使用xcopy命令将[channel_dir\unknown]拷贝到[game_dir\unknown]目录下。
使用读取xml文件的方法将子包中的AndroidManifest.xml内容合并到母包。例如,使用读取xml文件的方法将 [channel_dir\ AndroidManifest.xml]内容合并到[game_dir\ AndroidManifest.xml]。如果有配置额外的需要添加的属性也在此时添加到[game_dir\ AndroidManifest.xml]。
使用xml读写方法修改母包的AndroidManifest.xml中的版本号及调试模式。例如,使用xml读写方法修改[game_dir\ AndroidManifest.xml]中的版本号("android:versionCode")及调试模式("android:debuggable")。
修改应用icon图标,使用xcopy命令将需要修改的icon文件拷贝到图标目录下例如[game_dir/res]。
使用二进制文件读写方法读取apk反编译模块210生成的apktool.yml文件[game_dir/apktool.yml]和[channel_dir/apktool.ylm]中minSdkVersion和targetSdkVersion,取母包和子包中的较大值写入母包的apktool.yml文件中。
使用二进制文件读写方法读取apk反编译模块210生成的apktool.yml文件[game_dir/apktool.yml] 和[channel_dir/apktool.ylm]中unknownFiles字符串大括号下的内容,将子包中的写入母包apktool.yml文件中。
apk编译模块260,用于编译母包目录生成apk,并进行签名、序列化。
具体而言,首先,使用apktool.jar命令编译母包目录,生成apk。命令为:apktool.jar b -f [game_dir] -o unsigned.apk。
其次,使用SignApk.jar命令对生成的apk进行签名。命令为:java –jarSignApk.jar file.keystore storepassword aliasname aliaspassword unsigned.apkSigned.apk.
然后,使用zipalign命令对签名后的apk进行序列化。命令为:zipalign -v 4Signed.apk 正式发布.apk。
最后,将此正式发布的apk用copy命令拷贝到最终的产品目录下,可以按照时间+媒体ID重命名文件,因为可能会一次生成多个同渠道的apk。
进一步地,配置文件修改模块250,还用于添加广告商ID到母包的配置文件中。
具体而言,可以使用xml写文件方法将广告商ID添加到母包的AndroidManifest.xml中。例如,使用xml写文件方法将广告商ID添加到[game_dir/AndroidManifest.xml]中。如果有MediaID配置,则修改mediaid,如果没有则添加到Activity级节点下。例如,meta-data android:name="广告商名称" android:value="广告商ID"。
进一步地,安卓应用渠道合包装置200还包括:渠道设置与控制模块270,其按照前述安卓应用渠道合包方法,控制apk反编译模块210、包名修改模块220、资源文件合并模块230、代码文件合并模块240、配置文件修改模块250和apk编译模块260的执行顺序以及次数。
在上述实施例中,每一步用到的命令或者方法均为现有开源工具或库。执行命令用Windows的CreateProcess方法执行,这样可以设置隐藏cmd窗口执行命令,并且可以将命令执行输出结果重定向到日志文件。至于其过程中需要的参数和目录路径可以用QT或者MFC写个界面让用户配置更直观方便。
本发明的安卓应用渠道合包方法和装置,能够简化渠道推广流程并大量节省开发时间且出错率很低。
本领域普通技术人员可以理解:以上所述仅为本发明的优选实施例而已,并不用于限制本发明,尽管参照前述实施例对本发明进行了详细的说明,对于本领域的技术人员来说,其依然可以对前述各实施例记载的技术方案进行修改,或者对其中部分技术特征进行等同替换。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
Claims (9)
1.一种安卓应用渠道合包方法,其特征在于,包括以下步骤:
获取母包和子包的资源、代码和配置文件;
重命名母包的包名,以及母包和子包的包名路径;
将子包的资源文件合并到母包中,生成合并资源文件的母包;
将子包的代码文件合并到母包中;
将子包的配置文件合并到母包中,以及修改母包的配置文件;
编译母包目录生成apk,并进行签名、序列化
重复以上步骤,完成多渠道的合并。
2.根据权利要求1所述的安卓应用渠道合包方法,其特征在于,所述将子包的资源文件合并到母包中,生成合并资源文件的母包的步骤之前,执行步骤:生成母包和子包各自的资源文件的索引文件。
3.根据权利要求1所述的安卓应用渠道合包方法,其特征在于,所述将子包的资源文件合并到母包中,生成合并资源文件的母包的步骤之后,执行步骤:生成合并资源文件的母包的资源文件的索引文件,并序列化资源ID。
4.根据权利要求1所述的安卓应用渠道合包方法,其特征在于,所述将子包的代码文件合并到母包中的步骤之前,执行步骤:修改母包、子包的代码文件的属性信息。
5.根据权利要求1所述的安卓应用渠道合包方法,其特征在于,所述编译母包目录生成apk,并进行签名、序列化的步骤之前,执行步骤:添加广告商ID到母包的配置文件。
6.根据权利要求5所述的安卓应用渠道合包方法,其特征在于,若一个渠道有多个广告商ID,则循环执行所述添加广告商ID到母包的配置文件的步骤,以及所述编译母包目录生成apk,并进行签名、序列化的步骤。
7.一种安卓应用渠道合包装置,其特征在于,包括:apk反编译模块、包名修改模块、资源文件合并模块、代码文件合并模块、配置文件修改模块和apk编译模块,其中,
所述apk反编译模块,用于获取母包和子包的资源、代码和配置文件;
所述包名修改模块,用于重命名母包的包名,以及母包和子包的包名路径;
所述资源文件合并模块,用于将子包的资源文件合并到母包中,生成合并资源文件的母包;
所述代码文件合并模块,用于将子包的代码文件合并到母包中;
所述配置文件修改模块,用于将子包的配置文件合并到母包中,以及修改母包的配置文件;
所述apk编译模块,用于编译母包目录生成apk,并进行签名、序列化。
8.根据权利要求7所述的安卓应用渠道合包装置,其特征在于,所述资源文件合并模块,还用于生成母包和子包各自的资源文件的索引文件,以及生成合并资源文件的母包的资源文件的索引文件,并序列化资源ID。
9.根据权利要求7所述的安卓应用渠道合包装置,其特征在于,所述配置文件修改模块,还用于添加广告商ID到母包的配置文件。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711317520.5A CN107844301A (zh) | 2017-12-12 | 2017-12-12 | 一种安卓应用渠道合包方法及装置 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201711317520.5A CN107844301A (zh) | 2017-12-12 | 2017-12-12 | 一种安卓应用渠道合包方法及装置 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN107844301A true CN107844301A (zh) | 2018-03-27 |
Family
ID=61664858
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201711317520.5A Withdrawn CN107844301A (zh) | 2017-12-12 | 2017-12-12 | 一种安卓应用渠道合包方法及装置 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN107844301A (zh) |
Cited By (18)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108595187A (zh) * | 2018-03-27 | 2018-09-28 | 北京美好人生伙伴信息技术有限公司 | 安卓安装包集成软件开发工具包的法、装置及存储介质 |
CN108829400A (zh) * | 2018-05-15 | 2018-11-16 | 苏州玩友时代科技股份有限公司 | 一种iOS无须反复编译的渠道打包方法 |
CN108829405A (zh) * | 2018-06-04 | 2018-11-16 | 网易(杭州)网络有限公司 | 渠道包的生成方法及装置、存储介质、电子装置 |
CN109522295A (zh) * | 2018-11-16 | 2019-03-26 | 中国银行股份有限公司 | 一种数据库对象自动构建、部署方法及装置 |
CN109542415A (zh) * | 2018-11-13 | 2019-03-29 | 五八同城信息技术有限公司 | 支持应用程序并行研发的代码合并方法及相关设备 |
CN109857405A (zh) * | 2019-02-02 | 2019-06-07 | Oppo广东移动通信有限公司 | 应用程序安装包的编译方法、装置、存储介质及终端 |
CN110201397A (zh) * | 2019-06-28 | 2019-09-06 | 北京金山安全软件有限公司 | 一种游戏资源配置方法、装置及电子设备 |
CN110457045A (zh) * | 2019-08-16 | 2019-11-15 | 百度在线网络技术(北京)有限公司 | 组件化合并编译方法、装置、设备和存储介质 |
CN110941443A (zh) * | 2019-12-12 | 2020-03-31 | 支付宝(杭州)信息技术有限公司 | 修改sdk中文件名的方法、装置及电子设备 |
CN111090425A (zh) * | 2019-12-12 | 2020-05-01 | 支付宝(杭州)信息技术有限公司 | 一种程序封装方法、装置及电子设备 |
CN111381865A (zh) * | 2020-04-01 | 2020-07-07 | 深圳传趣网络技术有限公司 | 游戏应用的打包方法、装置、设备及存储介质 |
CN111596931A (zh) * | 2020-05-27 | 2020-08-28 | 北京学之途网络科技有限公司 | 应用程序封装方法、装置、电子设备及可读存储介质 |
CN111611007A (zh) * | 2020-05-21 | 2020-09-01 | 掌阅科技股份有限公司 | 基于脚本实现的应用程序安装包的打包方法及设备 |
CN112052013A (zh) * | 2020-08-03 | 2020-12-08 | 完美世界(北京)软件科技发展有限公司 | 软件包的生成方法及装置、存储介质、电子装置 |
CN112732644A (zh) * | 2020-12-31 | 2021-04-30 | 广州三七网络科技有限公司 | 应用程序的资源索引处理方法、计算机设备和存储介质 |
CN112905170A (zh) * | 2021-03-09 | 2021-06-04 | 百果园技术(新加坡)有限公司 | 渠道包的生成方法、装置、设备及存储介质 |
CN113190263A (zh) * | 2021-04-21 | 2021-07-30 | 宝宝巴士股份有限公司 | 一种集成第三方sdk的方法及装置 |
CN113721929A (zh) * | 2021-08-11 | 2021-11-30 | 安徽帕觅智能科技有限公司 | 一种自动化植入公用代码到Android App的方法 |
Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20160205124A1 (en) * | 2015-01-14 | 2016-07-14 | Korea Internet & Security Agency | System and method for detecting mobile cyber incident |
CN106445509A (zh) * | 2016-09-09 | 2017-02-22 | 厦门雅基软件有限公司 | 一种sdk批量快速接入工具 |
CN107402792A (zh) * | 2017-08-01 | 2017-11-28 | 广州视源电子科技股份有限公司 | 应用软件安装包的集成方法、装置、设备及存储介质 |
-
2017
- 2017-12-12 CN CN201711317520.5A patent/CN107844301A/zh not_active Withdrawn
Patent Citations (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US20160205124A1 (en) * | 2015-01-14 | 2016-07-14 | Korea Internet & Security Agency | System and method for detecting mobile cyber incident |
CN106445509A (zh) * | 2016-09-09 | 2017-02-22 | 厦门雅基软件有限公司 | 一种sdk批量快速接入工具 |
CN107402792A (zh) * | 2017-08-01 | 2017-11-28 | 广州视源电子科技股份有限公司 | 应用软件安装包的集成方法、装置、设备及存储介质 |
Non-Patent Citations (1)
Title |
---|
CHENJIE19891104: "教你快速高效接入SDK--打包工具的实现(反编译资源动态整合打渠道包)", 《HTTPS://BLOG.CSDN.NET/CHENJIE19891104/ARTICLE/DETAILS/44279379》 * |
Cited By (28)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN108595187A (zh) * | 2018-03-27 | 2018-09-28 | 北京美好人生伙伴信息技术有限公司 | 安卓安装包集成软件开发工具包的法、装置及存储介质 |
CN108829400A (zh) * | 2018-05-15 | 2018-11-16 | 苏州玩友时代科技股份有限公司 | 一种iOS无须反复编译的渠道打包方法 |
CN108829400B (zh) * | 2018-05-15 | 2019-04-26 | 苏州玩友时代科技股份有限公司 | 一种iOS无须反复编译的渠道打包方法 |
CN108829405A (zh) * | 2018-06-04 | 2018-11-16 | 网易(杭州)网络有限公司 | 渠道包的生成方法及装置、存储介质、电子装置 |
CN108829405B (zh) * | 2018-06-04 | 2021-12-21 | 网易(杭州)网络有限公司 | 渠道包的生成方法及装置、存储介质、电子装置 |
CN109542415A (zh) * | 2018-11-13 | 2019-03-29 | 五八同城信息技术有限公司 | 支持应用程序并行研发的代码合并方法及相关设备 |
CN109542415B (zh) * | 2018-11-13 | 2022-05-10 | 五八同城信息技术有限公司 | 支持应用程序并行研发的代码合并方法及相关设备 |
CN109522295B (zh) * | 2018-11-16 | 2021-07-20 | 中国银行股份有限公司 | 一种数据库对象自动构建、部署方法及装置 |
CN109522295A (zh) * | 2018-11-16 | 2019-03-26 | 中国银行股份有限公司 | 一种数据库对象自动构建、部署方法及装置 |
CN109857405A (zh) * | 2019-02-02 | 2019-06-07 | Oppo广东移动通信有限公司 | 应用程序安装包的编译方法、装置、存储介质及终端 |
CN110201397A (zh) * | 2019-06-28 | 2019-09-06 | 北京金山安全软件有限公司 | 一种游戏资源配置方法、装置及电子设备 |
CN110201397B (zh) * | 2019-06-28 | 2022-07-22 | 北京金山安全软件有限公司 | 一种游戏资源配置方法、装置及电子设备 |
CN110457045A (zh) * | 2019-08-16 | 2019-11-15 | 百度在线网络技术(北京)有限公司 | 组件化合并编译方法、装置、设备和存储介质 |
CN111090425A (zh) * | 2019-12-12 | 2020-05-01 | 支付宝(杭州)信息技术有限公司 | 一种程序封装方法、装置及电子设备 |
CN110941443A (zh) * | 2019-12-12 | 2020-03-31 | 支付宝(杭州)信息技术有限公司 | 修改sdk中文件名的方法、装置及电子设备 |
CN111381865A (zh) * | 2020-04-01 | 2020-07-07 | 深圳传趣网络技术有限公司 | 游戏应用的打包方法、装置、设备及存储介质 |
CN111611007A (zh) * | 2020-05-21 | 2020-09-01 | 掌阅科技股份有限公司 | 基于脚本实现的应用程序安装包的打包方法及设备 |
CN111611007B (zh) * | 2020-05-21 | 2023-08-29 | 掌阅科技股份有限公司 | 基于脚本实现的应用程序安装包的打包方法及设备 |
CN111596931A (zh) * | 2020-05-27 | 2020-08-28 | 北京学之途网络科技有限公司 | 应用程序封装方法、装置、电子设备及可读存储介质 |
CN112052013A (zh) * | 2020-08-03 | 2020-12-08 | 完美世界(北京)软件科技发展有限公司 | 软件包的生成方法及装置、存储介质、电子装置 |
CN112052013B (zh) * | 2020-08-03 | 2024-06-14 | 完美世界(北京)软件科技发展有限公司 | 软件包的生成方法及装置、存储介质、电子装置 |
CN112732644A (zh) * | 2020-12-31 | 2021-04-30 | 广州三七网络科技有限公司 | 应用程序的资源索引处理方法、计算机设备和存储介质 |
CN112732644B (zh) * | 2020-12-31 | 2024-06-07 | 广州三七网络科技有限公司 | 应用程序的资源索引处理方法、计算机设备和存储介质 |
CN112905170B (zh) * | 2021-03-09 | 2024-04-19 | 百果园技术(新加坡)有限公司 | 渠道包的生成方法、装置、设备及存储介质 |
CN112905170A (zh) * | 2021-03-09 | 2021-06-04 | 百果园技术(新加坡)有限公司 | 渠道包的生成方法、装置、设备及存储介质 |
CN113190263B (zh) * | 2021-04-21 | 2022-05-17 | 宝宝巴士股份有限公司 | 一种集成第三方sdk的方法及装置 |
CN113190263A (zh) * | 2021-04-21 | 2021-07-30 | 宝宝巴士股份有限公司 | 一种集成第三方sdk的方法及装置 |
CN113721929A (zh) * | 2021-08-11 | 2021-11-30 | 安徽帕觅智能科技有限公司 | 一种自动化植入公用代码到Android App的方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN107844301A (zh) | 一种安卓应用渠道合包方法及装置 | |
Holmes | Hadoop in practice | |
Satheesh et al. | Web development with MongoDB and NodeJs | |
Price | C# 8.0 and. NET Core 3.0–Modern Cross-Platform Development: Build applications with C#,. NET Core, Entity Framework Core, ASP. NET Core, and ML. NET using Visual Studio Code | |
Karau | Fastdata Processing with Spark | |
Samuel et al. | Programming kotlin | |
Rossant | Learning IPython for interactive computing and data visualization | |
Solorio et al. | Hands-on smart contract development with Solidity and Ethereum: From fundamentals to deployment | |
Maksimović et al. | Gillian, part II: real-world verification for javascript and C | |
Knight et al. | Professional Microsoft SQL Server 2012 Integration Services | |
Price | C# 9 and. NET 5–Modern Cross-Platform Development: Build intelligent apps, websites, and services with Blazor, ASP. NET Core, and Entity Framework Core using Visual Studio Code | |
Raj | Neo4j high performance | |
Lano et al. | Synthesis of mobile applications using AgileUML | |
Galowicz | C++ 17 STL Cookbook | |
Roldán | React Design Patterns and Best Practices: Design, build and deploy production-ready web applications using standard industry practices | |
Miller et al. | Learning Python for Forensics: Leverage the power of Python in forensic investigations | |
Price | C# 7.1 and. NET Core 2.0–Modern Cross-Platform Development: Create powerful applications with. NET Standard 2.0, ASP. NET Core 2.0, and Entity Framework Core 2.0, using Visual Studio 2017 or Visual Studio Code | |
Siddaway | PowerShell and WMI | |
Marchioni | MongoDB for Java developers | |
Chalkiopoulos | Programming mapreduce with scalding | |
WO2017063323A1 (zh) | 基于重构技术实现敏感数据云端锁定的方法 | |
Azar et al. | Swift data structure and algorithms | |
Sarka et al. | SQL Server 2016 Developer's Guide | |
Salceanu | Julia Programming Projects: Learn Julia 1. x by building apps for data analysis, visualization, machine learning, and the web | |
Hoffman | Building Microservices with ASP. NET Core: Develop, Test, and Deploy Cross-platform Services in the Cloud |
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 | ||
WW01 | Invention patent application withdrawn after publication |
Application publication date: 20180327 |
|
WW01 | Invention patent application withdrawn after publication |