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堆内存 } }
相关文章推荐
- 使用Ant自动签名、打包Android apk并且自动安装到手机
- 通过Ant将Android project编译打包成APK文件并安装到手机
- android打包签名apk后,安装到手机上会闪退,而run as运行在手机上没有问题
- 使用Ant自动签名、打包Android apk并且自动安装到手机
- 通过Ant将Android project编译打包成APK文件并安装到手机
- 使用Ant自动签名、打包Android apk并且自动安装到手机
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)
- 【转】探秘腾讯Android手机游戏平台之不安装游戏APK直接启动法
- 实践中探索Android智能手机系统------APK程序安装
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等) 收藏
- 探秘腾讯Android手机游戏平台之不安装游戏APK直接启动法 3ff8
- Android 开发中,如何将多个程序打包成一个apk文件,但是安装完成后显示多个程序?
- 探秘腾讯Android手机游戏平台之不安装游戏APK直接启动法
- 获取android手机内部存储空间和外部存储空间的参数 && 如何决定一个apk的安装位置
- android 手机安装应用程序(APK)权限详细对照表
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等)
- android学习笔记(3)---详解申请证书并将Android的工程打包为APK手机应用软件
- Android 源码编译的系统apk如何安装到手机
- 【Android】获取手机中已安装apk文件信息(PackageInfo、ResolveInfo)(应用图片、应用名、包名等) .