使用美团walle多渠道打包+友盟统计+Apk包加固

链接地址

Walle_Android Signature V2 Scheme签名下的新一代渠道包打包神器

ProtectedApkResignerForWalle_[Walle WiKi官方推荐]一步解决应用加固导致Walle渠道信息失效的自动化脚本工具,自动生成渠道包

友盟统计

Python2.7_Python环境

walle-cli使用说明

依据友盟官方文档接入友盟统计(这里只关注关于友盟渠道统计应注意的点)
Channel渠道的使用规范

每台设备仅记录首次安装激活的渠道,在其他渠道再次安装不会重复计量。 所以在测试不同的渠道的时候,请使用不同的设备来分别测试不要改变’UMENG_CHANNEL’。

Channel渠道的命名规范
  • 可以由英文字母、阿拉伯数字、下划线、中划线、空格、括号组成,可以含汉字以及其他明文字符,但是不建议使用中文命名,会出现乱码。

  • 首尾字符不可以为空格。

  • 不要使用纯数字作为渠道ID。

  • 最多256个字符。

  • “unknown” 及其各种大小写形式,作为【友盟+】保留的字段,不可以作为渠道名。

在您查看数据时,渠道会作为一个数据细分的维度。

接下来,需要友盟appkey和channel值来呼叫友盟初始化函数

初始化方法由基础组件包提供,要使用统计SDK,需要在宿主应用application.onCreate函数中调用基础组件包提供的初始化函数:

/**
* 注意: 即使您已经在AndroidManifest.xml中配置过appkey和channel值,也需要在App代码中调
* 用初始化接口(如需要使用AndroidManifest.xml中配置好的appkey和channel值,
* UMConfigure.init调用中appkey和channel参数请置为null)。
*/
UMConfigure.init(Context context, String appkey, String channel, int deviceType, String pushSecret);

或者

/** 
* 注意:如果您已经在AndroidManifest.xml中配置过appkey和channel值,可以调用此版本初始化函数。
*/
UMConfigure.init(Context context, int deviceType, String pushSecret);
// 这里我们需要呼叫5个参数的初始化函数,并传入友盟appkey和channel值
UMConfigure.init(Context context, String appkey, String channel, int deviceType, String pushSecret);
channel值,是通过walle中用于读取渠道号的AAR来进行获取的(依据walle的Github的README.md文档进行配置自我项目(这里只关注关于渠道应注意的点))

配置channel信息(渠道信息)

channel文件内容

# 配置自我项目所需要的渠道信息_依照友盟Channel渠道的命名规范
# 例如下述
# Google Play
googleplay
# 美团
meituan 
// 配置完成后,呼叫WalleChannelReader的getChannel函数进行获取渠道信息
String channel = WalleChannelReader.getChannel(this.getApplicationContext());

依据walle的Github的README.md文档

生成渠道包

生成渠道包的方式是和assemble${variantName}Channels指令结合,渠道包的生成目录默认存放在 build/outputs/apk/,也可以通过walle闭包中的apkOutputFolder参数来指定输出目录

用法示例:

  • 生成渠道包 ./gradlew clean assembleReleaseChannels
  • 支持 productFlavors ./gradlew clean assembleMeituanReleaseChannels

Windows系统下_命令如下(删除./即可):

gradlew clean assembleReleaseChannels

最后将在指定渠道包的输出路径下找到自己所打包好的渠道包可以上传发布市场啦。

但是一般来说,我们上传市场的包是需要加固的,为什么加固哦。就和自我需要穿衣服的一样的呀。总不能裸奔吧。(啊,不会吧,您还有那种兴趣爱好哦。。。难受哦)。

Apk包加固,由于Apk包加固后,获取不到渠道信息,渠道自然而然也就统计失败啦。

啊哦,那么我们使用walle上述所进行的多渠道打包操作就做了无用功啊。

既然问题出来了,我们该如何去解决呢?

在walle的README.md文档中寻找到

Q&A

这里看到啦,专门修复类似360加固重签名和批量注入渠道,2秒搞定的ProtectedApkResignerForWalle。

去看看呢。

[Walle WiKi官方推荐]一步解决应用加固导致Walle渠道信息失效的自动化脚本工具,自动生成渠道包。

优秀,NB。快且稳定(官方推荐)。

依照ProtectedApkResignerForWalle的README.md文档描述进行使用

写在前面

最近很多朋友问我这个脚本和walle的关系,用了这个脚本还用walle吗?在这里我来解释下:

官方walle分为两部分,第一部分是打包部分,包括 plugin 部分和 build.gradlewalle{...} 脚本,另一部分是用于读取渠道号的AAR,如果你使用类似友盟等统计工具,你需要利用walle提供的aar来读取你的渠道信息,然后手动传给友盟渠道信息。在不考虑加固的情况下只需要执行类似./gradlew clean assembleReleaseChannels,AS会自动执行gradle中的脚本和插件进行多渠道打包。

ProtectedApkResignerForWalle是用于解决walle产生的加固问题,用的是walle的打包CLI,替代的是第一部分,所以你无须引用 plugin 部分和 build.gradlewalle{...} 脚本部分,第二部分还是要正常引用的。多渠道打包时,先加固,然后把未签名的apk使用此脚本进行多渠道打包即可。

按照上述描述,进行使用。

1、移除walle的打包部分,只留下用于读取渠道号的AAR部分。

2、打一个正式包出来,然后选择加固方案(我司使用的腾讯云的加固方案)


image-20201118160036234.png

3、立即去加固,加固后,下载加固后的Apk包。

4、使用ProtectedApkResignerForWalle(需要Python环境)进行打包签名多渠道包。将其项目从Github上Clone到本地。

5、ProtectedApkResignerForWalle的使用

  • 按照config.py文件中的注释改成自己项目配置
  • 将已经加固好的包【未签名的包,请不要使用加固客户端签名工具】放到脚本工具根目录下,即app-release.encrypted.apk
  • 各种渠道的定义是在channel这个文件中,请根据项目情况修改
  • 运行命令 python ApkResigner.py,即可自动生成所有渠道包。

6、将以下红框中的所需要的文件放入根目录中

  • 加固后的Apk包
  • 渠道信息文件(可以从自我项目中拿到,之前不是按照walle官方文档进行配置了自我项目嘛)
  • 签名文件(.jks)


    image-20201118160742037.png

7、修改config.py文件配置,可以使用Notepad++等任何工具打开并编辑。

8、浏览一下config.py文件。

#!/usr/bin/python  
#-*-coding:utf-8-*-

#keystore信息
#Windows 下路径分割线请注意使用\\转义
keystorePath = "..path/your.keystore"
keyAlias = "your keyAlias"
keystorePassword = "your keystorePassword"
keyPassword = "your keyPassword"

#加固后的源文件名(未重签名)
protectedSourceApkName = "your protected.apk"
#加固后的源文件所在文件夹路径(...path),注意结尾不要带分隔符,默认在此文件夹根目录
protectedSourceApkDirPath = ""
#渠道包输出路径,默认在此文件夹Channels目录下
channelsOutputFilePath = ""
#渠道名配置文件路径,默认在此文件夹根目录
channelFilePath = ""
#额外信息配置文件(绝对路径,例如/Users/mac/Desktop/walle360/config.json)
#配置信息示例参看https://github.com/Meituan-Dianping/walle/blob/master/app/config.json
extraChannelFilePath = ""
#Android SDK buidtools path , please use above 25.0+
sdkBuildToolPath = "/Users/mac/Library/Android/sdk/build-tools/26.0.2"

9、将其自我项目配置进入写入该文件中,修改后的文件如下所示。

#!/usr/bin/python  
#-*-coding:utf-8-*-

#keystore信息
#Windows 下路径分割线请注意使用\\转义
keystorePath = "yunyang.jks"
keyAlias = "yunyang"
keystorePassword = "yunyang"
keyPassword = "yunyang"

#加固后的源文件名(未重签名)
protectedSourceApkName = "app-release.encrypted.apk"
#加固后的源文件所在文件夹路径(...path),注意结尾不要带分隔符,默认在此文件夹根目录
protectedSourceApkDirPath = ""
#渠道包输出路径,默认在此文件夹Channels目录下
channelsOutputFilePath = ""
#渠道名配置文件路径,默认在此文件夹根目录
channelFilePath = ""
#额外信息配置文件(绝对路径,例如/Users/mac/Desktop/walle360/config.json)
#配置信息示例参看https://github.com/Meituan-Dianping/walle/blob/master/app/config.json
extraChannelFilePath = ""
#Android SDK buidtools path , please use above 25.0+
sdkBuildToolPath = "C:\\Users\\shenq\\AppData\\Local\\Android\\sdk\\build-tools\\25.0.1"

10、在当前目录下运行命令 python ApkResigner.py,即可自动生成所有渠道包(默认在此文件夹Channels目录下)。


image-20201118162150058.png

11、查看渠道信息是否写入Apk包中,使用walle-cli(可以在lib文件夹中找到)。


image-20201118161816671.png

12、依据walle-cli官方文档使用(在当前目录下执行命令)。

显示当前apk中的渠道和额外信息:

java -jar walle-cli-all.jar show 你的apk名.apk的路径

例如:

java -jar walle-cli-all.jar show C:\AAAAAEdit\ProtectedApkResignerForWalle-master\app-release.encrypted.apk
image-20201118162658918.png

渠道信息如上所示。

最后我们就可以拿着打包好的携带渠道信息的包开开心心的上传市场啦。

推荐阅读更多精彩内容