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

6 篇文章 0 订阅
2 篇文章 0 订阅

参考:

手把手教你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 studio3.0以下和3.0以上自定义命名apk有区别,具体请参考:Android studio3.0.1导入GitHub项目出错及解决方法

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堆内存
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值