首先,多渠道打包的“渠道”指的是应用厂商,而多渠道打包为的是统计不同应用厂商的数据,简单点就是中国的各大应用厂商,百度手机助手,360手机助手,应用宝等,拓展点,可以统计Google市场的用户,再或者可以指定某个国家的应用市场做市场分析,假如这个应用市场是本地的话,总之,就是方便统计分析数据。
多渠道打包有很多途径,参考了以下几篇文章 * stormzhang的ANDROID STUDIO系列教程六–GRADLE多渠道打包
美团的打包方案 这篇文章有点老 Android 7.0听说不适配
快速打包插件,100多个渠道打包只需10s packer-ng-plugin
最后选择了 友盟多渠道打包
AndroidManifest.xml
<application> <meta-data android:name="UMENG_APPKEY" android:value="xxx" /> <meta-data android:name="UMENG_CHANNEL" android:value="${UMENG_CHANNEL_VALUE}" /> </application>app/build.gradle
android { productFlavors { wandoujia {} baidu {} c360 {} uc {} productFlavors.all { flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name] } } }打包的时候通过动态替换UMENG_CHANNEL_VALUE生成不同的包
单个
多个
gradle命令如果不行要先配环境变量 分号间隔,$引用
在小黑窗打开 open -e .bash_profile 或者直接 vi ~/.bash_profile 或者 vim ~/.bash_profile 改好后 source .bash_profile我的gradle环境变量
export GRADLE_HOME=/Users/fred/.gradle/wrapper/dists/gradle-2.14.1-all/xxx/gradle-2.14.1 export PATH=${PATH}:/Users/fred/Library/Android/sdk/platform-tools:$GRADLE_HOME/bin 单个 gradle assembleWandoujiaRelease(根据productFlavors的参数写,assemblewandoujiaRelease这样子也可以) 如果输入错的 就会出现异常输出的apk在 outputs/apk/下
比如baidu
outputs/apk/app-baidu-release-unsigned.apk
多个 gradle assembleRelease通过反编译可以验证渠道包是否有效
apktool d xxx.apk
<meta-data android:name="UMENG_CHANNEL" android:value="baidu"/>第二天从友盟平台也可以看到渠道统计
混淆要义:如果是直接使用 字段本身,比如接口字段或者bean,你通过访问服务器返回的字段肯定就不能混淆了,比如反射基于方法或者属性本身的不能混淆,比如继承父类的不能混淆。重点:http://blog.csdn.net/fulinwsuafcie/article/details/10947341
proguard英文文档 * https://www.guardsquare.com/en/proguard/manual/usage
学习文章 * ProGuard基础语法和打包配置
http://www.cnblogs.com/permanent2012moira/p/5126276.html
http://blog.csdn.net/jddkdd2/article/details/8858909#0-tsina-1-77128-397232819ff9a47a7b7e80a40613cfe1
Proguard不正确使用===没用
自动化插件,生成常用的混淆代码,在基础上自己增删,插件是安装整个zip包
https://github.com/zhonghanwen/AndroidProguardPluginProguard基本语法:
* 代表通配符,所有 -keep 全部不混淆(字面意思不难看出,保留,保护,不混淆) -keepclassmembers 类成员不混淆 -keepclasseswithmembers 类名和成员不混淆 -dontwarn Proguard 不在控制台输出找不到的警告 -keep class xxxx.** {*;} 中括号内为变量或者方法 参数不同的同名方法可以用...代替 -keep class xxxx.** { 保留 变量 producerIndex long producerIndex; 保留 所有方法名为v的方法 public static int v(...); 保留 所有参数为View的方法 public void *(android.view.View); } -keepattributes 保留属性 #保护 范型 -keepattributes Signature #保护 注解 -keepattributes *Annotation* 在打印混淆的相关结果 app/build/outputs/mapping/ #apk 包内所有 class 的内部结构 -dump class_files.txt # 未混淆的类和成员 -printseeds seeds.txt # 列出从 apk 中删除的代码 -printusage unused.txt # 混淆前后的映射 -printmapping mapping.txt 第三方库 -libraryjars libs/baidumapapi.jar Log管理不输出 -assumenosideeffects class android.util.Log { public static boolean isLoggable(java.lang.String, int); public static int v(...); public static int i(...); public static int w(...); public static int d(...); public static int e(...); }混淆也能debug+debug带签名
在androidstudio中可以设置debug下也混淆,通过android log直观的、快速的定位问题所在, 设置如下 signingConfigs { release { storeFile file("xxx.jks") storePassword 'xxxxxx' keyAlias 'xxx' keyPassword 'xxxxxx' } debug{ ... } } } buildTypes { release { // 不显示Log buildConfigField "boolean", "LOG_DEBUG", "false" //开启代码混淆 minifyEnabled true // 移除无用的resource文件 shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release //使用上述签名信息 } } debug { ... signingConfig signingConfigs.debug } }安装包立减1M–微信Android资源混淆打包工具–AndResGuard
反编译需要三个工具 * apktool(获取资源文件) * dex2jar(获取源码) * JD-GUI(查看源码)
我也有看到smali2java,可以把apktool的smali文件转java
windows的比较方便,linux就不清楚了
mac下的配置 http://blog.csdn.net/hanhailong726188/article/details/42368295 下载完附件后 去下载最新的apktool.jar替换不然会编译不了,dex2jarJD-GUI也下载新的
用cp命令 置于/usr/local/bin下 aapt apktool apktool.jar 反编译apk apktool d xxx.apk反编译后可以看到资源文件 将xxx.apk改后缀为zip后解压获取class.dex 复制到dex2jar所在路径粘贴覆盖
查看源码小黑窗进入dex2jar所在路径
sh dex2jar.sh classes.dex 得到 classes_dex2jar.jar,注意是”_”这个 可以JD-GUI打开 看到java源文件
PS:// 不显示Log buildConfigField “boolean”, “LOG_DEBUG”, “false”
public final class BuildConfig { public static final boolean LOG_DEBUG = false; } buildTypes { release { // 不显示Log, 在java代码中的调用方式为:BuildConfig.LOG_DEBUG buildConfigField "boolean", "LOG_DEBUG", "false" minifyEnabled true zipAlignEnabled true shrinkResources true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' signingConfig signingConfigs.release } debug { // 显示Log buildConfigField "boolean", "LOG_DEBUG", "true" versionNameSuffix "-debug" minifyEnabled false zipAlignEnabled false shrinkResources false signingConfig signingConfigs.debug } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); CommonUtils.getVersionName(this); initViews(); if(BuildConfig.LOG_DEBUG) { Log.i("leo", "MainActivity.onCreate()"); } }