相信有不少朋友都遇到过分包的问题,比如说运营需要查看各个渠道的用户情况,这时候就需要使用我们的分包了,现在我就来分享一下比较分包思路。
这个分包思路是从AndroidManifest.xml文件中的 application节点下的meta-data节点来获取所在的包是什么渠道的,然后请求服务端去统计数据。
<manifest>
<application>
<activity>
...
</activity>
<meta-data android:name="game_id" android:value="1"/>
<meta-data android:name="channel_id" android:value="1"/>
<meta-data android:name="channel_name" android:value="meituan"/>
</application>
</manifest>
我在这里的xml代码就做简写了,就不复制所有的代码了,meta-data 节点是是与activity节点是同一级的。
然后再从代码里面去获取mate节点中的value就行了
fun getGameId(): Int {
val applicationInfo =
packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)
val gameId = applicationInfo.metaData.getInt("game_id")
return gameId
}
fun getChannelId(): Int {
val applicationInfo =
packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)
val channelId = applicationInfo.metaData.getInt("channel_id")
return channelId
}
fun getChannelName(): String {
val applicationInfo =
packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA)
val channelName = applicationInfo.metaData.getString("channel_name")
return channelName!!
}
做好了代码里面的获取之后,然后再做我们的修改这个mate-data的操作
使用apktool这个反编译的工具反编译 -> 修改mate-data -> 合成apk包 -> 签名
当然,我们做这个的前提是,要配置好java环境,这个就不用我多说了。然后下载apktool这个反编译文件点这里跳转下载最新的apktool.jar文件
下载到最新文件之后进行我们的反编译操作
1.使用cd命令进入到你要操作的文件夹内
2.反编译
java -jar apktool_2.6.1.jar apktool d app.apk
当然还有更多的用法,比如说是文件夹存放位置等操作。可以使用java -jar apktool_2.6.1.jar help查看帮助
3.修改反编译出来的app文件夹内的AndroidManifest.xml文件中的mate-data节点的value内容。比如说channel_name 是不是meituan,是huawei或者是xiaomi等等都可以
4.修改之后就要进行合包了,还是用之前的命令行
java -jar apktool_2.6.1.jar b -o E:\develop\apktool\app1.apk app
这个命令的意思是app文件夹进行合包,合成出来的包是在E:\develop\apktool\app1.apk,-o是输出路径的意思
当然这个 -o E:\develop\apktool\app1.apk也可以不写
比如说这样:java -jar apktool_2.6.1.jar b app
5.签名,这里使用的是v2签名
E:\develop\apktool>java -jar 你的sdk路径\build-tools\随便一个版本(前提是支持v2的版本)\lib\apksigner.jar sign --ks 签名文件路径 --ks-key-alias 签名文件别名 --ks-pass pass:密码 --key-pass pass:密码 --out 签名后的文件 未签名的文件
然后就可以安装在手机上测试效果了。
当然,这种比较传统的打包方式有很大的缺点,缺点就是反编译和合包这种放在服务器上的话,会比较的占用内存资源。所以还有更简单的方法,下一篇文章更新另外的分包方式。