多渠道打包-混淆打包-反编译

多渠道打包

首先,多渠道打包的“渠道”指的是应用厂商,而多渠道打包为的是统计不同应用厂商的数据,简单点就是中国的各大应用厂商,百度手机助手,360手机助手,应用宝等,拓展点,可以统计Google市场的用户,再或者可以指定某个国家的应用市场做市场分析,假如这个应用市场是本地的话,总之,就是方便统计分析数据。

多渠道打包有很多途径,参考了以下几篇文章
* stormzhang的ANDROID STUDIO系列教程六–GRADLE多渠道打包

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打包

单个
image

多个
image

命令行打包(未签名)

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这样子也可以)
    如果输入错的
    就会出现异常
    image

输出的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包

image

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()");
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值