您的位置:首页 > 移动开发 > Android开发

android 多渠道打包、手机上安装多个apk、重命名apk与65535

2018-03-02 11:48 381 查看

参考:

手把手教你AndroidStudio多渠道打包

多渠道共存打包(一)

Android Studio3.0中dependencies依赖由compile变为implementation的区别

Android Studio 应用sourceSets的配置

dependencies依赖由compile变为implementation的区别

当我们使用Android Studio3.0新建项目时会发现,默认的依赖由之前的compile更改为implementation了。

3.0 以下版本build.gradle中依赖的写法:

compile fileTree(dir: 'libs', include: ['*.jar'])


但在3.0后的写法为

implementation fileTree(dir: 'libs', include: ['*.jar'])
//或
api fileTree(dir: 'libs', include: ['*.jar'])


在3.0版本中,compile 指令被标注为过时方法,而新增了两个依赖指令,一个是implementation和api,这两个都可以进行依赖添加,但是有什么区别呢?

api

完全等同于compile指令,没区别,你将所有的compile改成api,完全没有错。

implementation

这个指令的特点就是,对于使用了该命令编译的依赖,对该项目有依赖的项目将无法访问到使用该命令编译的依赖中的任何程序,

也就是将该依赖隐藏在内部,而不对外部公开。

比如我在一个libiary中使用implementation依赖了gson库,然后我的主项目依赖了libiary,那么,我的主项目就无法访问gson库中的方法。

这样的好处是编译速度会加快,推荐使用implementation的方式去依赖,如果你需要提供给外部访问,那么就使用api依赖即可

在Google IO 相关话题的中提到了一个建议,就是依赖首先应该设置为implementation的,如果没有错,那就用implementation,

如果有错,那么使用api指令,这样会使编译速度增快。

一、android 多渠道打包

第一步:将打包签名文件拷贝到app目录下:



第二步:app module的build.gradle下配置多渠道打包的签名、渠道:

apply plugin: 'com.android.application'

android {
compileSdkVersion 25
buildToolsVersion "25.0.3"

signingConfigs {//签名配置
// 1、signingConfigs代码块一定要写在buildTypes前面,
// 2、如果defaultConfig中有用到签名的话,signingConfigs也要写在defaultConfig之前。
// 3、签名密码写在gradle中不安全,故最好在打包上线的时候将相关代码注释掉。
releaseConfig {
storeFile file("xqkeystore.jks")
storePassword "xq123456"
keyAlias "xq"
keyPassword "xq123456"
}

debugConfig {
//密码、别名注意引号
storeFile file("debug.keystore")
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
}

defaultConfig {
applicationId "com.xq.mypacage"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}

buildTypes { //构建类型
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

signingConfig signingConfigs.releaseConfig  //启用正式签名
//applicationIdSuffix ".xq" //applicationId添加后缀,可用于在手机安装多个apk
}

debug {
signingConfig signingConfigs.debugConfig //启用测试签名
}
}

productFlavors {//多渠道打包配置
/*写法一:*/
kuan {//UMENG_CHANNEL_VALUE为自定义的名字
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "kuan"]
}
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
qh360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qh360"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}

/*写法二:*/
//        kuan {}
//        xiaomi {}
//        qh360 {}
//        baidu {}
//        wandoujia {}
//
//        productFlavors.all {
//            flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
//        }
}

}

dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
//    compile files('libs/umeng-analytics-v5.5.3.jar')
}


友盟在AndroidManifest.xml配置渠道:

<meta-data
android:name="UMENG_CHANNEL"
android:value="${UMENG_CHANNEL_VALUE}" />


执行打包:

方式1:Build ––> Generate signed APK

方式2:采用gradle面板或者终端命令行方式打包才会自动读取buildTypes调用signingConfigs的签名配置

①命令行:在AndroidStudio窗口左下角打开Terminal面板,输入

gradlew assembleRelease


打包成功后会提示BUILD SUCCESSRUL

注意:如果APK包名显示为unsigned,也就是说未签名。

②gradle面板:打开右侧边缘的gradle面板,点击执行命令。



打包完成可以在app–>build–>outputs–>apk路径中就可以看到打包成功后的APK

二、一份代码在手机上安装多个apk

方式一:修改包名

参考:

Android Studio修改项目中整体包名

方式二:applicationIdSuffix 修改 applicationId

android {
defaultConfig {
applicationId "com.example.myapp"
}

//不同签名的包可以同时安装:
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'

signingConfig signingConfigs.releaseConfig
applicationIdSuffix ".release " //applicationId添加后缀
}

debug {
signingConfig signingConfigs.debugConfig
applicationIdSuffix ".debug " //applicationId添加后缀
}
}

//不同渠道的包可以同时安装:
productFlavors {
xiaomi{
applicationIdSuffix ".xiaomi"//applicationId添加后缀
}
wandoujia{
applicationIdSuffix ".wandoujia"//applicationId添加后缀
}
}
}


注意:修改applicationId影响:

1、第三方注册申请key的时候需要填写包名。如果你测试包applicationId更改了,你测试包申请下来的key就用不了了

2、你上传市场的时候 从第一次上传后开始,以后的applicationId一定要和第一次上传的一致。不然升不了级,会判断你不同应用。

三、自动规定打包的apk名称

见下面自定义打包apk名称部分:

apply plugin: 'com.android.application'

android {
compileSdkVersion 25
buildToolsVersion "25.0.3"

//httpclient过时添加支持
useLibrary 'org.apache.http.legacy'

/*-------------------------------签名信息配置-------------------------------------------*/
signingConfigs {//签名配置
// 1、signingConfigs代码块一定要写在buildTypes前面,
// 2、如果defaultConfig中有用到签名的话,signingConfigs也要写在defaultConfig之前。
// 3、签名密码写在gradle中不安全,故最好在打包上线的时候将相关代码注释掉。
release {
storeFile file("xqkeystore.jks")//文件放于app目录下
storePassword "xq123456"
keyAlias "xq"
keyPassword "xq123456"
}

debug {
//密码、别名注意引号
storeFile file("debug.keystore")//文件放于app目录下
storePassword "android"
keyAlias "androiddebugkey"
keyPassword "android"
}
}

/*----------------------------------自定义打包apk名称---------------------------*/
applicationVariants.all { variant ->
variant.outputs.each { output ->
def outputFile = output.outputFile
def date = new Date().format("yyyyMMddHHmm", TimeZone.getTimeZone("GMT+08"))
if (outputFile != null && outputFile.name.endsWith('.apk')) {

def fileName = "测试打包_"+buildType.name +
"_${variant.productFlavors[0].name}_" +
"V${defaultConfig.versionName}_${date}.apk"
//格式:测试打包_debug_baidu_V1.0_201803021541.apk
//     测试打包_release_baidu_V1.0_201803021541.apk
output.outputFile = new File(outputFile.parent, fileName)
}
}
}

/*----------------------------------默认配置--------------------------------------------*/
defaultConfig {
applicationId "com.xq.mypacage"
minSdkVersion 15
targetSdkVersion 25
versionCode 1
versionName "1.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

// Enabling multidex support.//解决65535
multiDexEnabled true
}

/*---------------------------构建类型:如何构建不同版本的app-------------------------------*/
buildTypes {
release {
//正式服务器配置
//            buildConfigField "String", "ENVIRONMENT", "\"http://miaomiao.com/miaomiao/\""
//debuggable: debug模式默认为true, release模式默认是false
debuggable false
//启用Proguard,会对代码进行混淆和压缩,默认值为false,如果需要混淆需要手动配置为true;
minifyEnabled true
//移除无用的resource文件,设置minifyEnabled为true时shrinkResources 的设置才会生效
shrinkResources true
//是否启用zipAlign压缩
zipAlignEnabled true
//启用正式签名
signingConfig signingConfigs.release
//混淆文件配置
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
//            applicationIdSuffix ".xq" //applicationId添加后缀,用于修改applicationId
}

debug {
//测试服务器配置
//            buildConfigField "String", "ENVIRONMENT", "\"http://110.11.11.00/miaomiao/\""
debuggable true//debuggable: debug模式默认为true, release模式默认是false
minifyEnabled false//不启用Proguard
zipAlignEnabled true//是否启用zipAlign压缩
shrinkResources false//是否清理无用资源,依赖于minifyEnabled
signingConfig signingConfigs.debug //启用测试签名
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}

/*-------------------------------目录约定-------------------------------------------*/
sourceSets {
main {
//在src/main文件中新建 jniLibs文件夹,将.so文件都拷贝进去,不需要此句
//so文件放在libs时才使用
jniLibs.srcDirs = ['libs']
}
}

/*--------------------------------配置多渠道的打包---------------------------------*/
productFlavors {//多渠道打包配置
/*写法一:*/
kuan {//UMENG_CHANNEL_VALUE为自定义名字
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "kuan"]
}
xiaomi {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "xiaomi"]
}
qh360 {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "qh360"]
}
baidu {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "baidu"]
}
wandoujia {
manifestPlaceholders = [UMENG_CHANNEL_VALUE: "wandoujia"]
}

/*写法二:*/
//        kuan {}
//        xiaomi {}
//        qh360 {}
//        baidu {}
//        wandoujia {}
//
//        productFlavors.all {
//            flavor -> flavor.manifestPlaceholders = [UMENG_CHANNEL_VALUE: name]
//        }
}

//解决65535
dexOptions {
preDexLibraries = false//禁用预编译
javaMaxHeapSize "4g"   //加大java堆内存
}
}

/*-------------------------------------依赖配置-------------------------------------*/
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'

//解决65535
compile 'com.android.support:multidex:1.0.1'

}


Android 解决65535的限制

参考:AndroidStudio利用android-support-multidex解决65536问题64k问题

第一步,修改主module的build.gradle文件

apply plugin: 'com.android.application'

android {

defaultConfig {
...
// Enabling multidex support.
multiDexEnabled true
}

dexOptions {
preDexLibraries = false//禁用预编译
javaMaxHeapSize "4g"   //加大java堆内存
}
}

dependencies {
...
//解决65535
compile 'com.android.support:multidex:1.0.1'
}


第二步,继承android.support.multidex.MultiDexApplication类

第一种情况,如果我们的APP没有重写过Application类,我们直接继承MultiDexApplication,然后在manifest.xml中注册Application即可。

public class MyApplication extends MultiDexApplication {

@Override
public void onCreate() {
super.onCreate();
}
}


第二种情况,如果我们已经重写过Application类,重写attachBaseContext(Context)方法,并调用MultiDex.install(this);即可:

public class MyApplication extends Application {

@Override
public void onCreate() {
super.onCreate();
}

@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}


MultiDexApplication源码:

public class MultiDexApplication extends Application {
public MultiDexApplication() {
}

protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
MultiDex.install(this);
}
}


第三步:使用了multidex后的构建优化

android {

dexOptions {
preDexLibraries = false//禁用预编译
javaMaxHeapSize "4g"   //加大java堆内存
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐