专栏名称: 唤之
目录
相关文章推荐
程序员小灰  ·  DeepSeek做AI代写,彻底爆了! ·  2 天前  
OSC开源社区  ·  大模型训练中的开源数据和算法:机遇及挑战 ·  3 天前  
程序猿  ·  问问DeepSeek,你和ChatGPT谁厉 ... ·  3 天前  
程序员小灰  ·  DeepSeek创始人梁文峰牛逼的个人经历 ·  3 天前  
51好读  ›  专栏  ›  唤之

Andriod 多渠道分包,实用的module分层,开发代码混淆规

唤之  · 掘金  · 程序员  · 2017-12-08 08:27

正文

Andriod 多渠道分包,实用的module分层,开发代码混淆规则

Andriod studio 3.0 有必要重新学习更好的处理build.gradle 看了很多文章到这里来总结下:


多渠道打包

  • 多渠道打包

    Andriod studio3.0 build apk 多了一个 build apk(S)
    build apk(S)

    这个会直接生成 apk debug版

    将 apk 放入jdk的安装目录bin 文件下

    如果返回以验证 就说明apk 已经签名了
    cmd

    不过我感觉不实用了 大家还是用代码跑吧。

进入正题

我们需要用到分渠道打包,那么我们需要解决两个问题
1. 怎么区分各个平台的标识
2. 怎么每次版本更新都生成几十个包、几百个包

第一步

在AndroidManifext.xml中配置:
<meta-data
        android:name="UMENG_CHANNEL"
        android:value="${UMENG_CHANNEL_VALUE}" />

value里面填的就是各个平台的值,比如填写uc、yyb(应用宝)、360、baidu替换掉Channel_ID,App安装好,可以读取这个值然后传给后台,从而实现区分各个平台的安装需求。

第二步

配置我们的 app/build.gradle

我们需要配置:

1 signingConfigs这是刚才我们新建的密匙信息
2 buildTypes 打包类型,包括了Debug和Release
3 productFlavors打包渠道就在这儿配置咯 同时在AndroidManifest里面加上,渠道标识

apply plugin: 'com.android.application'



android {
//    关闭 multi-APK
//
//    multi-apk 是为了根据配置生成不同的APK,以达到减少APK体积大小的问题。但是这个配置没有必要在开发的时候开启。
    if(project.hasProperty('devBuild')){
        splits.abi.enable = false
        splits.density.enable = false
        aaptOptions.cruncherEnabled = false
    }

    //签名密钥
    signingConfigs {
        config {
            keyAlias 'ceshikey'
            keyPassword '091838'
            storeFile file('D:/text.jks')
            storePassword '091838'
        }

    }
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.example.achers.myapplication"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        flavorDimensions "versionCode"

    }
    buildTypes {

        debug {
            minifyEnabled false
            debuggable true
        }

        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.config
            debuggable false
        }

    }


    productFlavors {
        //配置多渠道
        uc {   //uc
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "uc"]
        }
        _360 {  //360
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "360"]
        }
        baidu {  //百度
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
        }
        yyb {  //应用宝
            manifestPlaceholders = [UMENG_CHANNEL_VALUE: "yyb"]
        }

        //配置包的环境 和 替换包名  
//        url{
                //主机地址 
//            applicationId "com.host.myapplication"
//        }
//        urlonline{
                //线上地址
//            applicationId "com.online.myapplication"
//        }
//        urltest{
                //测试地址
//            applicationId "com.test.myapplication"
//        }

    }

}





dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    api 'com.jakewharton:butterknife:8.4.0'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.4.0'
    implementation 'com.google.code.gson:gson:2.2.4'
    implementation 'com.zhy:okhttputils:2.6.2'
    implementation 'org.greenrobot:eventbus:3.1.1'
    implementation 'io.reactivex.rxjava2:rxjava:2.1.5'
    implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
    implementation 'com.android.support:design:26.1.0'
}

我们这里还有更加简洁的写法 效果是一样的


    productFlavors {
        //配置多渠道
        uc {}
        _360 {}
        baidu {}
        yyb {}

        //配置包的环境 和 替换包名
//        url{
                //主机地址
//            applicationId "com.host.myapplication"
//        }
//        urlonline{
                //线上地址
//            applicationId "com.online.myapplication"
//        }
//        urltest{
                //测试地址
//            applicationId "com.test.myapplication"
//        }

    }

    productFlavors.all { flavor ->
        flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
    }

另外
我们写完之后可以用Gradle Project 来指定生成apk
Gradle Project

好的 我们这样打包其实是很慢的

所以推荐用美团的打包策略
tech.meituan.com/mt-apk-pack…

这里就不说了 太多资料了 结合Python 更好,更快。

拓展
Build Variants(构建变种版本)
开发每次调试接口,我们可能会需要配置3个URL

public final static String URL = "主机环境:---10.18.3.1";
public final static String URL = "线上环境:---10.18.3.1";
public final static String URL = "测试环境:---10.18.3.1";

其实就是给测试的兄弟 打三个不同地址的包 我们如果一个一个去改 去打 毕竟麻烦

所以我们来操作下
不需要,改代码,要选择运行那个环境直接切换,方便快捷

这里写图片描述

这里写图片描述

这里写图片描述

这样我们能在同一个手机上同时装上不同环境的包了

  • 加粗 Ctrl + B
  • 斜体 Ctrl + I
  • 引用 Ctrl + Q
  • 插入链接 Ctrl + L
  • 插入代码 Ctrl + K
  • 插入图片 Ctrl + G
  • 提升标题 Ctrl + H
  • 有序列表 Ctrl + O
  • 无序列表 Ctrl + U
  • 横线 Ctrl + R
  • 撤销 Ctrl + Z
  • 重做 Ctrl + Y
  • -

实用的module分层

新建config.gradle

可以在根目录下建个config.gradle,然后只需在根目录下build.gradle最顶部加上下面一行代码,然后同步下,意思就是所有的子项目或者所有的modules都可以从这个配置文件里读取内容。

apply from: "config.gradle"

config.gradle

ext {

android = [
        compileSdkVersion: 26,  
        buildToolsVersion: "26.0.0",       
        minSdkVersion    : 15,
        targetSdkVersion : 26,

]

dependencies = [
        appcompatV7': 'com.android.support:appcompat-v7:26.1.0',
        design      : 'com.android.support:design:26.1.0'

]

}

app/build.gradle

android {
    compileSdkVersion rootProject.ext.android.compileSdkVersion
    buildToolsVersion rootProject.ext.buildToolsVersion

    defaultConfig {
        applicationId "com.example.achers.myapplication"
        minSdkVersion rootProject.ext.android.minSdkVersion
        targetSdkVersion rootProject.ext.android.targetSdkVersion
        versionCode 1
        versionName "1.0"
    }

...

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    testCompile 'junit:junit:4.12'
    compile rootProject.ext.dependencies.appcompatV7
    compile rootProject.ext.dependencies.design
}

开发代码混淆规则

混淆能让反编译的代码可读性变的很差,而且还能显著的减少APK包的大小。

第一个技巧

相信很多朋友对混淆都觉得麻烦,甚至说,非常乱。因为添加混淆规则需要查询官方说明文档,甚至有的官方文档还没说明。当你引用了太多库后,添加混淆规则将使一场噩梦。
这里介绍一个技巧,不用查官方文档,不用逐个库考虑添加规则。
首先,除了默认的混淆配置(android-sdk/tools/proguard/proguard-android.txt), 自己的代码肯定是要自己配置的:







请到「今天看啥」查看全文