美团Walle多渠道打包+友盟统计+360加固

1、集成友盟统计

在实际项目开发过程当中,因为运营的须要,咱们每每须要知道咱们的APP在各大应用市场的下载和具体使用状况,这时候咱们每每须要接入第三方统计,较经常使用的就是友盟统计。具体接入方式能够查看友盟统计的官方接入文档:html

  1. 基础组建集成:https://developer.umeng.com/docs/66632/detail/66890
  2. U-App统计集成:https://developer.umeng.com/docs/66632/detail/66889

仔细观察文档能够发现,在旧版本中,咱们是经过在AndroidManifest.xml文件中配置java

<meta-data android:value="YOUR_APP_KEY" android:name="UMENG_APPKEY"/> 
        <meta-data android:value="Channel ID" android:name="UMENG_CHANNEL"/>

来实现渠道号的设置的,而后每次打新渠道包的时候,只须要手动修改这个Channel ID便可,固然,为了减小这种手动输入,咱们能够经过productFlavor来实现多渠道打包,但这本质上仍是每次都从新打一个包,只是解放了咱们的双手,但并无解决打包效率低、耗时的问题。其实咱们须要的就是把咱们要统计的App的渠道ID传给友盟,来让友盟进行渠道的统计,对此,友盟提供了新的接入方式:python

UMConfigure.init(Context context, String appkey, String channel, int deviceType, String pushSecret)

这时候咱们能够将以前AndroidManifest.xml中的channelId配置相关的<meta-data>删除,只须要提供channel便可,而后就能够经过美团Walle或者其余方式来获取到这个channel便可。android

2、接入美团多渠道打包方案Walle

传统打包方案除了经过productFlavor方式外,还要经过apktools方式逆向来实现多渠道,这种方式原理也很简单,就是讲apk解压,而后经过修改AndroidManifest.xml中的渠道值,再从新进行打包和签名。这种方式咱们每次打包时再也不须要从新构建项目。只需先打包生成一个apk,而后在该apk的基础上生成其余渠道包便可。这种方式虽然比以前快了不少,但还能更快。git

美团第一代多渠道打包方式提供了在META-INF目录内添加空文件这种方案,具体能够参考:https://tech.meituan.com/mt-a...,这种方案快在,咱们能直接修改apk的渠道号,而不须要再从新签名,这样能节省很多打包的时间。据美团将,这种打包方式速度很是快,900多个渠道不到一分钟就能打完。github

可是好景不长,在Android 7.0(Nougat)推出了新的应用签名方案APK Signature Scheme v2后,以前快速生成渠道包的方式(美团Android自动化之旅—生成渠道包)已经行不通了(固然,咱们能够暂时经过设置v2SigningEnabled false来继续经过以前的方式打包,但最好仍是应该接受新的改变),由于以前的签名方案并不会校验META-INF目录,于是咱们对该目录的修改并不须要从新签名。而新的方案下,咱们对apk中包含的文件的任何修改,都会引发校验失败。这时美团推出了第二代多渠道打包方案Walle。segmentfault

第二代多渠道打包方案Walle的思路其实就是从Zip文件自己入手,由于apk本质上仍是一个Zip文件,美团经过在ZIP文件格式的 Central Directory 区块所在文件位置的前面添加一个APK Signing Block区块,而后把渠道信息写到这个区块中,以后再读出这个信息,就完成了。固然,实际细节比较复杂。具体能够参考新一代开源Android渠道包生成工具Walle,听说这种打包方式速度很是快,对一个30M大小的APK包只须要100多毫秒(包含文件复制时间)就能生成一个渠道包,而在运行时获取渠道信息只须要大约几毫秒的时间。app

在接入Walle以前,咱们须要建立好签名文件,而且在项目的build.gralde中进行配置,相似这种:工具

signingConfigs {
        myConfig {
            storeFile file("../Walle.jks")
            storePassword "abc12345"
            keyAlias "Walle"
            keyPassword "abc12345"
        }
    }

    buildTypes {
        debug {
            signingConfig signingConfigs.myConfig
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            signingConfig signingConfigs.myConfig
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

具体关于如何建立签名文件,能够参考:
Android Studio下应用签名的方法以及获取 MD五、SHA1(签名)、SHA256 值,关于keystone签名文件更详细的知识,能够参考:Android Keystore漫谈
美团Walle具体接入方法能够参考:https://github.com/Meituan-Di...
这里其余咱们都按照默认便可,只须要根据本身的须要来编写channel文件便可,注意,这个文件不能有任何后缀。
channel%E6%96%87%E4%BB%B6.pnggradle

集成Walle后咱们就能够经过

String channel = WalleChannelReader.getChannel(this.getApplicationContext());

来获取channel,而后把该channel传给友盟进行渠道的统计:

UMConfigure.init(Context context, String appkey, String channel, int deviceType, String pushSecret);

而后咱们须要进行多渠道打包的时候,只须要执行./gradlew clean assembleReleaseChannels便可来生成全部的渠道包
%E6%B8%A0%E9%81%93%E5%8C%85.png
有时候执行该命令,咱们可能会遇到R.java文件丢失的问题,可是经过AS的clean又能从新生成,这时候咱们能够把上述命令中的clean去掉,变为经过命令./gradlew assembleReleaseChannels生成
全部渠道包。

这样,咱们就完成了渠道包的生成,若是想验证是否能在代码中成功获取到渠道信息,咱们能够在友盟的管理后台查看,也能够直接经过Log在代码中输出到Logcat
%E5%8F%8B%E7%9B%9F%E5%90%8E%E5%8F%B0%E6%B8%A0%E9%81%93%E4%BF%A1%E6%81%AF.png

3、进行360加固

相信任何在公司从事过App开发的,都知道应用在上线以前应该进行加固,可是我仍是在应用市场上见过没加固的,直接使用jadx反编译以后,每一行代码都能清清楚楚的看到,跟他们相关人员联系后,给个人答案是:“咱们知道没有加固,这点咱们很早就清楚。” “(⊙o⊙)…我.....”,而后还反问我一句:“你知道吗,你用加固的话,那些加固厂商可能会在你apk里加入些东西”...我都无fuck说了,那你还集成那么多的第三方服务干吗,他们就不会添加?这就是裸奔的理由?好了,吐槽结束。咱们在发布apk到应用市场的时候,必定要进行apk加固,若是实在是信不过加固厂商,本身又牛逼的很的话,就本身写吧。

这里用的比较多的就是360加固了,使用也很简单,就是讲本身打包好的apk上传上午,加固好以后再下载加固后的包便可。具体能够查看360加固官网

这看起来一切流程都已经完成了,咱们就一个个把第二步中生成的那些渠道一个个上传到360进行加固,而后下载下来不就好了。首先,若是渠道太多的话,这个是要死人的。更要命的是,当你一个个加密以后,居然发现这些都不能用,获取不到渠道信息的时候

%E6%83%B3%E6%AD%BB.jpg

其实,这里就涉及到一个问题,咱们直接经过美团Walle多渠道方案打包生成的apk,在通过360加固以后,是会丢掉渠道信息的,那么如何解决呢,美团在GitHub上也提出了解决方案360加固失效?

做为懒人,繁琐的一步步本身去作是不可能,这辈子均可能的。这里咱们就直接采用Jay-Goo大佬提供的Python打包脚本ProtectedApkResignerForWalle,这也是美团官方推荐的方案。接下来咱们就讲解若是使用该脚本

4、解决360加固丢失渠道信息的问题

这里咱们使用ProtectedApkResignerForWalle解决360加固丢失渠道信息的问题,能够直接去ProtectedApkResignerForWalle仓库查看,很简单。这里我只是将其余一些须要注意的事情讲下。

  1. 生成一个发布版的包,能够经过执行assembleRelease这个task或者经过工具栏上面的Build下面的Generated Signed Apk
  2. 将这个apk经过360网页版进行加固(经过其提供的桌面工具加固的话会自动使用V1方式签名),而后下载下来加固以后的apk,好比叫:release.encrypted.apk
  3. 经过 git clone https://github.com/Jay-Goo/ProtectedApkResignerForWalle.git命令来将仓库clone下来,而后把步骤1中生成的release.encrypted.apk放入该项目的根目录,并根据按照config.py文件中的注释改为本身项目配置
  4. 根据项目状况修改channel这个文件中,若是以前配置Walle的时候已经写了,直接复制过来就好,以前位置的channel文件就没用了,之后咱们只须要维护这个channel文件便可
  5. 运行命令 python ApkResigner.py,便可自动生成全部渠道包。以后咱们便可在该仓库的channels文件夹下看到生成的各类渠道包了

最后,咱们须要经过jadx反编译利器来随意查看某个apk是否加固成功,再安装试试,看是否能正常获取渠道信息。没问题的话,就开心的加班发布去吧。

相关文章
相关标签/搜索