在实际项目开发过程当中,因为运营的须要,咱们每每须要知道咱们的APP在各大应用市场的下载和具体使用状况,这时候咱们每每须要接入第三方统计,较经常使用的就是友盟统计。具体接入方式能够查看友盟统计的官方接入文档:html
仔细观察文档能够发现,在旧版本中,咱们是经过在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
传统打包方案除了经过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
文件便可,注意,这个文件不能有任何后缀。gradle
集成Walle
后咱们就能够经过
String channel = WalleChannelReader.getChannel(this.getApplicationContext());
来获取channel,而后把该channel传给友盟进行渠道的统计:
UMConfigure.init(Context context, String appkey, String channel, int deviceType, String pushSecret);
而后咱们须要进行多渠道打包的时候,只须要执行./gradlew clean assembleReleaseChannels
便可来生成全部的渠道包
有时候执行该命令,咱们可能会遇到R.java文件丢失的问题,可是经过AS的clean
又能从新生成,这时候咱们能够把上述命令中的clean去掉,变为经过命令./gradlew assembleReleaseChannels
生成
全部渠道包。
这样,咱们就完成了渠道包的生成,若是想验证是否能在代码中成功获取到渠道信息,咱们能够在友盟的管理后台查看,也能够直接经过Log
在代码中输出到Logcat
中
相信任何在公司从事过App开发的,都知道应用在上线以前应该进行加固,可是我仍是在应用市场上见过没加固的,直接使用jadx
反编译以后,每一行代码都能清清楚楚的看到,跟他们相关人员联系后,给个人答案是:“咱们知道没有加固,这点咱们很早就清楚。” “(⊙o⊙)…我.....”,而后还反问我一句:“你知道吗,你用加固的话,那些加固厂商可能会在你apk里加入些东西”...我都无fuck说了,那你还集成那么多的第三方服务干吗,他们就不会添加?这就是裸奔的理由?好了,吐槽结束。咱们在发布apk到应用市场的时候,必定要进行apk加固,若是实在是信不过加固厂商,本身又牛逼的很的话,就本身写吧。
这里用的比较多的就是360加固了,使用也很简单,就是讲本身打包好的apk上传上午,加固好以后再下载加固后的包便可。具体能够查看360加固官网
这看起来一切流程都已经完成了,咱们就一个个把第二步中生成的那些渠道一个个上传到360进行加固,而后下载下来不就好了。首先,若是渠道太多的话,这个是要死人的。更要命的是,当你一个个加密以后,居然发现这些都不能用,获取不到渠道信息的时候
其实,这里就涉及到一个问题,咱们直接经过美团Walle多渠道方案打包生成的apk,在通过360加固以后,是会丢掉渠道信息的,那么如何解决呢,美团在GitHub上也提出了解决方案360加固失效?
做为懒人,繁琐的一步步本身去作是不可能,这辈子均可能的。这里咱们就直接采用Jay-Goo
大佬提供的Python打包脚本ProtectedApkResignerForWalle,这也是美团官方推荐的方案。接下来咱们就讲解若是使用该脚本
这里咱们使用ProtectedApkResignerForWalle解决360加固丢失渠道信息的问题,能够直接去ProtectedApkResignerForWalle仓库查看,很简单。这里我只是将其余一些须要注意的事情讲下。
assembleRelease
这个task
或者经过工具栏上面的Build下面的Generated Signed Apk
release.encrypted.apk
git clone https://github.com/Jay-Goo/ProtectedApkResignerForWalle.git
命令来将仓库clone
下来,而后把步骤1中生成的release.encrypted.apk
放入该项目的根目录,并根据按照config.py文件中的注释改为本身项目配置最后,咱们须要经过jadx
反编译利器来随意查看某个apk是否加固成功,再安装试试,看是否能正常获取渠道信息。没问题的话,就开心的加班发布去吧。