CN107844301A - 一种安卓应用渠道合包方法及装置 - Google Patents

一种安卓应用渠道合包方法及装置 Download PDF

Info

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
Application number
CN201711317520.5A
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.)
Suzhou Snail Digital Technology Co Ltd
Original Assignee
Suzhou Snail Digital Technology 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 Suzhou Snail Digital Technology Co Ltd filed Critical Suzhou Snail Digital Technology Co Ltd
Priority to CN201711317520.5A priority Critical patent/CN107844301A/zh
Publication of CN107844301A publication Critical patent/CN107844301A/zh
Withdrawn legal-status Critical Current

Links

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/53Decompilation; 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到母包的配置文件。
CN201711317520.5A 2017-12-12 2017-12-12 一种安卓应用渠道合包方法及装置 Withdrawn CN107844301A (zh)

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)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
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 广州视源电子科技股份有限公司 应用软件安装包的集成方法、装置、设备及存储介质

Patent Citations (3)

* Cited by examiner, † Cited by third party
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)

* Cited by examiner, † Cited by third party
Title
CHENJIE19891104: "教你快速高效接入SDK--打包工具的实现(反编译资源动态整合打渠道包)", 《HTTPS://BLOG.CSDN.NET/CHENJIE19891104/ARTICLE/DETAILS/44279379》 *

Cited By (28)

* Cited by examiner, † Cited by third party
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