需要的工具 apktool, jarsigner(这个可以在java的安装目录下的bin文件夹中找到)。
第一步、让应用告诉服务端它来自哪个渠道。
首先得在android工程里的AndroidManifest.xml文件中application节点中添加一个meta-data节点。channel的值就表示推广的id。可以表示某个用户或者某个应用商店。默认值为0。
<meta-data android:name="channel" android:value="0" />
然后在程序中获取channel值。
ApplicationInfo appInfo = activity.getPackageManager().getApplicationInfo(activity.getPackageName(), PackageManager.GET_META_DATA); if((appInfo != null) && (appInfo.metaData != null)){ ret = appInfo.metaData.get("channel").toString();
}
获取推广id之后就可以根据自己的需求来把这个id值发送到服务端了。
第二步、反编译apk包。
apktool d file.apk file 把file.apk反编译后的文件放到file文件夹下面 。
第三步、修改channel值。
找到反编译后的AndroidManifest.xml文件,把channel值替换为指定的id。
第四步、编译修改后文件。
apktool b file unsigned.apk 生成一个未签名的apk文件。
第五步、为新的apk签名。
jarsigner -keystore keystoreName.keystore -storepass password -signedjar signed.apk unsingned.apk alias
其中的password :keystore文件的密码 alias :别名
签名后的signed.apk文件就是能够正常使用的包了。
需要注意的是上面是jdk6.0的签名命令,jdk7需要在jarsigner -keystore 中间插入-digestalg SHA1 -sigalg MD5withRSA -verbose 。
流程搞清楚了接下来得写个程序模拟上面的第二步到第五步的命令,就能实现指定id生成对应id的apk包了。最后把这个模拟程序放到服务器上面给服务端那边的程序调用就实现了在线生成推广包的功能了。