多渠道打包
首先,多渠道打包的“渠道”指的是应用厂商,而多渠道打包为的是统计不同应用厂商的数据,简单点就是中国的各大应用厂商,百度手机助手,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生成不同的包
release打包
单个
多个
命令行打包(未签名)
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基础语法和打包配置
自动化插件,生成常用的混淆代码,在基础上自己增删,插件是安装整个zip包
Proguard基本语法:
* 代表通配符,所有
-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()");
}
}