码迷,mamicode.com
首页 > 其他好文 > 详细

U8SDK——快速批量修改渠道号

时间:2015-04-24 21:08:02      阅读:1169      评论:0      收藏:0      [点我收藏+]

标签:u8sdk   unity sdk接入   sdk接入   批量修改渠道号   

在游戏快上线的时候,我们除了接入多家联运的渠道SDK之外,还有另一些情况存在。就是常说的CPS,CPA,CPD等情况。这些都无需接入SDK,仅仅是一些广告推广手段。通常我们会基于官方SDK的游戏包,生成多个用逻辑渠道号标识的一些包。用这些逻辑渠道号来标示这个游戏包属于哪个广告渠道。

通常就是这样的需求,比如:基于官方SDK的包生成以下逻辑渠道包:
google渠道包
友盟渠道包
百度推广渠道包
……
这些渠道包,我们需要的唯一区别就是标识其属于哪个渠道即刻。所以,通常我们只需要在游戏里面增加一个渠道号的标识。那么,现在需求就来了。在u8sdk中,我们怎么快速的生成这样的渠道包呢?
当然,按照目前的u8sdk打包脚本已经可以实现这样的工作了。但是,一般这样的逻辑渠道包动不动就是上百个,如果严格按照拆包,修改渠道号,重新打包,签名这样的步骤,那么几百个渠道包生成下来,估计至少得好几个小时的时间。
现在的问题就是可不可以在不拆包的情况下,直接修改原包,把里面的渠道号给改变一下。答案是可以的。apk包本质上还是一个zip压缩包,只是这个压缩包是经过严格签名的。那么,我们是否可以解压这个压缩包,然后改里面的某个文件呢?话说这样的文件真不好找。因为你改变了某个文件之后,这个包就得重新签名。
好在,方法还是有的,那就是“在apk的签名目录下也就是META-INF/目录下建立新的空文件,不需要对apk重新签名”
有了这个方法,就不再需要对APK进行重新签名,速度还是相当快的。几百个包,一两分钟即可处理完毕!!!
那么现在的思路就简单清晰了,我们只需要通过zip在META-INF/目录下建立一个以渠道号为名称的空文件,然后在u8sdk抽象层的代码里面通过读取该空文件的文件名就可以得到当前的逻辑渠道号。
下面我们就看怎么在U8SDK中实现这样的功能。
首先我们需要一个配置,来配置需要所有渠道号。然后需要一个已经接入了官方SDK的游戏包(apk文件)。接着便可以写脚本了。我们定义一个modify_channels.py脚本:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# -*- coding: utf-8 -*-
#CreateTime:2014-10-25
 
import sys
import file_operate
import os
import os.path
import time
import zipfile
 
 
def entry():
     sourceApkFile = file_operate.getFullPath("u8source.apk")
     channelsFile = file_operate.getFullPath("channels.txt")
 
     if not os.path.exists(channelsFile):
          file_operate.printF("The channels.txt file is not exists.")
          return
 
     f = open(channelsFile)
     channelLines = f.readlines()
     f.close()
 
     channels = []
     if channelLines != None and len(channelLines) > 0:
 
          for line in channelLines:
               targetChannel = line.strip()
               channels.append(targetChannel)
 
     else:
          file_operate.printF("There is no channel configed in channels.txt")
 
     modify(channels, sourceApkFile)
 
 
 
def modify(channels, sourceApkFile):
 
     sourceApkFile = sourceApkFile.replace(‘\\‘, ‘/‘)
     if not os.path.exists(sourceApkFile):
          file_operate.printF("The source apk file is not exists")
          return   
 
     tempFolder = file_operate.getFullPath(‘temp‘)
     if not os.path.exists(tempFolder):
          os.makedirs(tempFolder)
 
 
     empty_file = os.path.join(tempFolder, "temp.txt")
     f = open(empty_file, ‘w‘)
     f.close()
 
     for channel in channels:
          generateNewChannelApk(sourceApkFile, empty_file, channel)
 
     file_operate.del_file_folder(tempFolder)
 
 
def generateNewChannelApk(sourceApkFile, empty_file, channelID):
 
     file_operate.printF("Now to generate channel %s", channelID)
 
     targetFolder = file_operate.getFullPath("channels")
     if not os.path.exists(targetFolder):
          os.makedirs(targetFolder)
 
     targetApk = os.path.join(targetFolder, "u8-"+channelID+".apk")
     file_operate.copy_file(sourceApkFile, targetApk)
 
     zipped = zipfile.ZipFile(targetApk, ‘a‘, zipfile.ZIP_DEFLATED)
     emptyChannelFile = "META-INF/u8channel_{channel}".format(channel=channelID)
     zipped.write(empty_file, emptyChannelFile)
     zipped.close()
 
 
entry()

这个脚本有几点说明:
1、游戏包名必须是u8source.apk。当然你可以可以修改成其他的
2、渠道号的配置文件必须是channels.txt,并且是每行配置一个渠道号
3、脚本会创建一个临时的temp目录下的temp.txt空文件,然后将这个空文件添加到META-INF/目录下,并以u8channel_{渠道号}进行命名
4、所有包打完之后,会删除temp目录
5、所有最终的包会输出到channels目录下,并以u8-{渠道号}.apk进行命名
紧接着我们需要在u8sdk的抽象层逻辑里,来读取apk目录下的META-INF/目录下的以u8channel_开头的文件,从而获取到逻辑渠道号。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
 * 获取CPS,CPA,CPD等非SDK联运渠道的逻辑渠道号
 * @return
 */
public int getLogicChannel (){
       
       if( this. channel > 0){
            return this. channel;
      }
       
      String chStr = SDKTools. getLogicChannel(application, LOGIC_CHANNEL_PREFIX);
       if(!TextUtils. isEmpty(chStr)){
            this. channel = Integer. valueOf(chStr);
      } else{
            this. channel = 0;
      }
       
       
       
       return this. channel;
}
 
 
 
这样就可以完成逻辑渠道号的读取。然后就是增加协议了。比如游戏启动的时候,向U8Server发送一个http请求,传送当前逻辑渠道号等信息,然后,登录认证的时候,也加上该逻辑渠道号。这样后面就可以根据这些数据做分析统计,根据数据分钱给CPS,CPA等渠道商了。

本文作者小黑
欢迎访问小黑自己的博客:http://www.uustory.com

U8SDK——快速批量修改渠道号

标签:u8sdk   unity sdk接入   sdk接入   批量修改渠道号   

原文地址:http://blog.csdn.net/chenjie19891104/article/details/45251441

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!