5分钟了解打包工具原理

整套SDK的核心思想,就是让我们的SDK接入成本,能够控制在1,而不是N。啥意思呢?就是,我们接入第一款游戏的时候,我接了这些SDK,当我接入第二款,第三款游戏的时候,这套SDK可以尽可能的复用,而不是每开发一款游戏,又从头去接各个渠道sdk。所有的游戏都能够使用同一套SDK接入框架,来快速完成SDK的接入工作。那么,我们怎么做到呢?请看总体的思路:

打包工具原理图


 

游戏A,游戏B,游戏C是三款不同的游戏,对于他们来说,他们只需要调用SDK抽象层提供的接口,就完成了所有SDK的接入工作。这个时间,也就是几个小时的时间吧。

但是,我们知道,各个渠道SDK针对不同的游戏,都有不同的APPID,APPKEY等配置信息。所以,我们需要将这些配置信息也放在配置文件中。打包的时候,不同的游戏根据不同的配置,通过打包工具得到各个SDK的渠道包。

那么,像UC,当乐这些SDK是怎么接入的呢?

其实很简单,每个SDK接入,都是单独建立一个工程,引入SDK抽象层的jar包,然后,实现SDK抽象层中的插件接口。然后接好之后,会将SDK需要的资源,classes.dex,以及libs等需要的资源和代码,放在打包工具对应的SDK配置目录中。比如,UC的SDK,会在打包工具config/uc目录下,放置接好之后的SDK资源和代码。

同时,我们还需要两个配置文件。一个是channel.properties。我们用他来配置,该渠道的参数配置信息。比如APPID,APPKEY等。同时也配置下,需要将哪些目录拷贝到apk里面的哪些目录中。同时,各个SDK接入都需要在AndroidManifest.xml中配置一些activity,service,permission等。我们把这些信息,放在SDK_Manifest.xml中。然后打包的时候,将这个文件的信息合并到母包的AndroidManifest.xml中。

我们再来看打包工具。你可能会奇怪,打包工具是怎么将只接入了抽象层的游戏母包输出为各个SDK的渠道包。这里,我们就要来看看打包工具所做的工作:

打包工具流程图


1、打包工具的输入,就是需要打包的apk包,也叫母包。游戏里面引入sdk抽象层的jar包,调用抽象层的接口。完成接入,然后打成apk。

2、打包工具会首先用apktool d 对母包进行反编译。反编译到该渠道对应的临时工作目录中

3、重命名包名。我们知道在AndroidManifet.xml中的package就是包名,为了防止后面我们重新生成R文件导致冲突,我们对每个渠道都设置一个后缀。比如UC,后缀叫.uc。当乐,后缀.dl 等等。如果渠道SDK有明确要求,使用他们提供的后缀,那就使用他们提供的后缀。如果没有,就自己设置一个。

4、拷贝SDK资源。将该渠道对应的SDK资源,从对应的SDK配置目录中,拷贝到反编译后的临时工作目录中。

  1)拷贝SDK的assets目录,libs目录,res目录等
     2)将classes.dex也反编译成smali格式,拷贝到反编译临时工作目录中
     3)和SDK_Manifest.xml中的内容合并到游戏目录的AndroidManifest.xml中。

5、生成游戏中需要使用的配置。

     1)对于之前SDK目录中配置的APPID,APPKEY等信息,根据需要,对于需要添加到AndroidManifest.xml中的,我们就将他添加到AndroidManifest.xml中的meta-data中。
     2)对于SDK目录下配置的插件信息,我们会在assets目录下,生成一个channel.properties文件。这样SDK抽象层会读取这个配置来实例化对应的插件。

6、重新打包,采用apktool b重新将合并之后的资源和代码,进行打包

7、签名和优化。部分渠道要求使用他们提供的签名文件,所以,我们对签名文件也采用了配置。可以根据不同的渠道来配置不同的签名文件。

8、经过以上步骤,一个渠道包就生成了。

通过上面这个打包流程,我们已经知道单个渠道包是如何生成的了。那么,像第一张图片中所表示的那样,我们打包工具是同时打出各个不同渠道SDK的渠道包。我们是如何来实现的呢?请看下图:

每个游戏,都有一个全局配置,里面配置了当前需要打包的渠道。这样,打包工具首先会读取该配置,然后按照上面的打包流程,对各个渠道进行打包。最终在输出目录下生成各个渠道对应的渠道包。

至此,我们对SDK里的打包工具有了一个比较全面的了解。但是,这还不够完善。比如,我们可以将参数从配置中脱离出来,采用界面化的管理方法。这样,你就可以将这套工具给运营或者策划去使用,程序开发人员,就不再需要负责打包的工作了。

打包的效率和速度上,也可以继续不断地进行优化。删除不必要的文件操作,减少不必要的流程等。

Linux平台命令

1.Apk反编译命令:apktool d test.apk

(命令中test.apk指的是要反编译的APK文件全名,out为反编译后资源文件存放的目录名称)

 

2.重新打包: apktool b test

编译之后在之前的out文件下便可以发现多了2个文件夹:

build

dist(里面存放着打包出来的APK文件)

 

3.jar转为dexdx --dex --output=classes.dex test.jar

class.dex:生成dex文件的名称

test.jar:目标jar文件

dxaapt都需要使用决定路径

4.dex转为smailjava -jar baksmali.jar-o out/ class.dex

class.dex:jar转成的dex文件

out:将dex转为smail的文件夹

 

5.重签名:jarsigner-verbose -keystore demo.jks  -signedjar signtest.apk test.apk demo 

1)jarsigner是工具名称,-verbose表示将签名过程中的详细信息打印出来,显示在dos窗口中;
      2)-keystore demo.jks表示签名所使用的数字证书所在位置,这里没有写路径,表示在当前目录下;

      3)-signedjar signtest.apk test.apk表示给test.apk文件签名,签名后的文件名称为signtest.apk;

      4)最后面的demo 表示证书的别名,对应于生成数字证书时-alias参数后面的

Windows jar命令

1.Apk反编译命令:java -jar apktool.jar d test.apk -o out 

(命令中test.apk指的是要反编译的APK文件全名,out为反编译后资源文件存放的目录名称)

 

2.重新打包:java -jar apktool.jar b out

编译之后在之前的out文件下便可以发现多了2个文件夹:

build

dist(里面存放着打包出来的APK文件)

 

3.jar转为dexdx --dex --output=class.dex test.jar

class.dex:生成dex文件的名称

test.jar:目标jar文件

4.dex转为smailjava -jar baksmali.jar-o out/ class.dex

class.dex:jar转成的dex文件

out:将dex转为smail的文件夹

 

5.重签名:jarsigner -verbose -keystore demo.jks  -signedjarsigntest.apk test.apk demo

1)jarsigner是工具名称,-verbose表示将签名过程中的详细信息打印出来,显示在dos窗口中;
      2)-keystore demo.jks 表示签名所使用的数字证书所在位置,这里没有写路径,表示在当前目录下;

      3)-signedjar signtest.apk test.apk表示给test.apk文件签名,签名后的文件名称为signtest.apk;
      4)最后面的demo表示证书的别名,对应于生成数字证书时-alias参数后面的名称

6.优化apk

zipalign -v 4 signtest.apk test1.apk

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值