正文
Andriod 多渠道分包,实用的module分层,开发代码混淆规则
Andriod studio 3.0 有必要重新学习更好的处理build.gradle 看了很多文章到这里来总结下:
多渠道打包
进入正题
我们需要用到分渠道打包,那么我们需要解决两个问题
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
好的 我们这样打包其实是很慢的
所以推荐用美团的打包策略
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), 自己的代码肯定是要自己配置的: