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

在游戏快上线的时候,我们除了接入多家联运的渠道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

时间: 2024-08-06 20:02:18

U8SDK——快速批量修改渠道号的相关文章

快速批量修改cvs的root文件

1 import java.io.File; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 import java.util.LinkedList; 5 6 public class ModifyCVSIPV2 { 7 8 private static final String OVER_FLAG="GAMEOVER"; 9 10 private static void searchCVSFiles

利用shell脚本批量修改表

最近公司里因为开发新功能,程序员需要快速在某一个库里的所有表添加字段,于是就用shell脚本简单快速实现批量修改表添加字段 #!/bin/bash export mysql_bin=/usr/local/mysql/bin export database=database export tables=`$mysql_bin/mysql -Bse "use ${database};show tables;"` for i in ${tables}         do          

linux下批量修改用户密码

对系统定期修改密码是一个很重要的安全常识,通常,我们修改用户密码都使用 passwd user 这样的命令来修改密码,但是这样会进入交互模式,即使使用脚本也不能很方便的批量修改,除非使用expect 这样的软件来实现,难道修改一下密码还需要单独安装一个软件包吗? 不,我们其实还有其他很多方法可以让我们避开交互的,下面具体写一下具体的实现方式: 第一种:echo "123456" | passwd --stdin root echo doiido:helloboy |chpasswd 优

Android - 渠道号(vender)

渠道号(vender) 本文地址: http://blog.csdn.net/caroline_wendy Android的apk发布,需要统计各个渠道(vendor)的激活数,就可以使用vendor.txt内渠道号进行统计. 因此,在正式版本中,一定要添加Android渠道号,才可以发布: 给其他公司修改版本bug之后,返回应用apk时, 一定要检查渠道号(vendor.txt)是否添加,同时检查配置(app_config.xml)是否正确. 添加渠道号的方法: 在包的assets->ctes

关于Entity Framework采用DB First模式创建后的实体批量修改相关属性技巧

Entity Framework采用DB First模式创建实体是比较容易与方便的,修改已创建的实体在个数不多的情况下也是没问题的,但如果已创建的实体比较多,比如10个实体以上,涉及修改的地方比较多的时候,那么这个时候采用可视化编器就不再那么方便了,而应该采用以XML的形式来呈现实体数据,然后用我们常用的编辑手段,复制.粘贴.剪切来快速实现批量修改,下面就来说说批量修改的方法: 1.找到Entity Framework采用DB First模式创建的文件,文件以.edmx结尾,如下图示: 2.选中

(转)linux passwd批量修改用户密码

linux passwd批量修改用户密码 原文:http://blog.csdn.net/xuwuhao/article/details/46618913 对系统定期修改密码是一个很重要的安全常识,通常,我们修改用户密码都使用 passwd user 这样的命令来修改密码,但是这样会进入交互模式,即使使用脚本也不能很方便的批量修改,除非使用expect 这样的软件来实现,难道修改一下密码还需要单独安装一个软件包吗? 不,我们其实还有其他很多方法可以让我们避开交互的,下面具体写一下具体的实现方式:

bat批量修改图片的名字实现(两种方法)

问题描述: 业务中遇到需要批量修改大量图片的名字. 如下图,需要修改为图片名字"u="之后和","之前的那一串 解决思路1: bat批处理,网上查找相关代码如下: 1 @echo off 2 SetLocal EnableDelayedExpansion 3 4 REM 要查找的文件 5 set ext=*.jpg 6 7 REM 新文件名在原文件名中的起始位置,从0开始 8 set pstart=2 9 10 REM 新文件名在原文件名中的长度 11 set le

批量修改谷歌浏览器(Chrome)地址栏保存的历史记录及导出功能探索研究

内网IP调整引发的Chrome历史记录修改及ShadowRoot的学习 由于IP经常变动, 导致本地项目的那些存在地址栏的历史记录就都失效了, 突然脑洞大开, 有没有办法修改本地历史记录的方法? 想法是: 假设我原IP是192.168.1.51, 新IP是192.168.1.63, 我历史记录有http://192.168.1.51:8080/test.html, 我通过某种办法强行修改Chrome历史记录将192.168.1.51替换成192.168.1.63, 这样, 下次在地址栏输入tes

百度云盘批量修改文件名称方法

今天介绍百度云盘在线批量修改文件名称的方法,一次性修改多个关键词,大大提升批量修改文件名称的速度. 第一步,下载最新百度网盘批量处理软件 工具为绿色免安装版本,直接下载到电脑中后解压运行其中的bdmaster.exe文件,另外,特别提示:软件的解压路径不能有中文,否则会出现兼容性闪退. 下载地址:dwz.cn/JTUmWpfD 第二步,登录网盘账号,可以多账号登录 运行后批量处理助手软件如同打开浏览器界面一样,只是在菜单栏中多出了一些批量处理的功能,其他操作完全和浏览器中使用一致. 第三步,选择