【Gradle】总结gradle中的常用的【工具方法】,超实用

引言:AS开发中不可或缺的就是gradle的使用,虽然跟编程没有直接的关系,但是其中工具却着实方便。

1.添加Framework.jar包方法(同等级文件夹)

1.在进行Android定制开发的时候,经常会用到定制的ramework.jar包,否则一些定制的接口和方法无法使用,这个我不多讲解:
在这里插入图片描述

方法:(如上目录结构)
1.将该jar包放置该同等级的文件夹内,然后进入build.gradle
2.如果是fragment的话,需要完全替换源码环境就需要注释掉

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

在添加(compileOnly下面有解释)

ompileOnly files('../../CommonLibs/framework.jar')
compileOnly files('../CommonLibs/framework.jar')

PS:  ../../ 表示文件夹层级关系,如果2层文件夹,就需要../二次(如下图)

在这里插入图片描述
3.另外在android以及dependencies 同级别下增加

allprojects {
    repositories {
        jcenter()
    }
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs.add('-Xbootclasspath/p:' + rootDir.getAbsolutePath() + '/CommonLibs/framework.jar')
//如果是放在app下的lib中,路径如下            //options.compilerArgs.add('-Xbootclasspath/p:app\\libs\\framework.jar')

        }
    }
}

2.在Android Studio中生成jar包,(AidlProxy.jar)

需求如下:
需要将该APP(Service)提供的接口单独分离成library包,然后生成对应的jar包提供给其他APP 使用。
Ps:目前我发现bulid.gradle 中的

apply plugin: 'com.android.application'

如果是application,就无法再build下的intermediates文件夹中生成packaged-classes文件夹,如果是:

apply plugin: 'com.android.library'

则在build/intermediates/packaged-classes/能看到debug或者release文件夹,其中就有class.jar,该jar其实就是该library的jar包,我们需要在修改下名字就好
在dependencies{}平级的 目录下增加

dependencies {
    implementation fileTree(dir: "libs", include: ["*.jar"])
    testImplementation 'junit:junit:4.12'

}
// 以下代码是将Classes.jar 修改为DeviceManagerProxy.jar
task makeJar(type: Jar) {
    archivesBaseName = "DeviceManagerProxy"
    from(project.zipTree('build/intermediates/packaged-classes/release/classes.jar'))
    destinationDir = file('build/libs')

}
makeJar.dependsOn(build)

在将该jar包放在app/lib/下 Add AS Library,就可以了,就算放在同等级的文件夹中,也可以通过这个指定需要加载的项目
在这里插入图片描述
在这里插入图片描述

3.添加系统签名(将APP变为系统应用)

signingConfigs {
    release {
        keyAlias 'test-name'
        keyPassword '123456'
        storeFile file(rootDir.getAbsolutePath() + '/KeyStore/AndroidStudio.jks')
        storePassword '123456'
    }
    debug {
        keyAlias 'test-name'
        keyPassword '123456'
        storeFile file(rootDir.getAbsolutePath() + '/KeyStore/AndroidStudio.jks')
        storePassword '123456'
    }
}

添加signingConfigs,然后添加到buildTypes {}中:( 封装此项目的所有构建类型配置),如下:

buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.release 
    }
    debug {  //add
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        signingConfig signingConfigs.debug


    }
}

//一:单独修改APK 名字

android.applicationVariants.all { variant ->
    variant.outputs.all {
        outputFileName = "ICIFunDriving.apk"
    }
}
//二:修改APK生成路径 + 修改APK名字
 android.applicationVariants.all { variant ->
            variant.outputs.all {
                output ->
                    def outputFile = output.outputFile
                    if (outputFile != null && outputFile.name.contains('release')) {
                        def fileName = "ICIReleaseMonitor.apk"
                        outputFileName = fileName;
                    } else if (outputFile != null && outputFile.name.contains('debug')) {
                        def fileName = "ICIDebugMonitor.apk"
                        outputFileName = fileName;
                    }
            }
    }

//编译版本(右侧Gradle ->other -> assembleRelease)

最后在Android.mk中

最后在AndroidManifest.xml中添加
(1)android:sharedUserId="android.uid.system"
 (2)在Android.mk文件里面添加LOCAL_CERTIFICATE := platform(使用系统签名)

Android Studio 中创建同等级的APP

这个其实一贯的思维就是一个AS中就只能创建一个APP应用+多个Library包 +多个jar包

但是在用到一些公用的Client的时候,一个工程中多个APP 就需要用到了。
1.

在这里插入图片描述
如图,同等级文件夹下,左侧是建立一个APP,右侧是建立一个library
在这里插入图片描述
注意:
创建APP的时候,产生的项目名字可能是小写,需要在创建项目的时候可修改为大写
在这里插入图片描述
Module name:就是在项目创立后的项目的文件夹名字
Package name:就是项目的路径,该路径如果需要修改,需要提前修改,我反正后期修改的时候,
编译报错,AndroidManifest.xml中路径不对。一般提前修改就好。
2.
在这里插入图片描述
另外在创建Library的时候,AndroidManifest.xml中路径保持默认,不随意修改。
总之我删掉了中间的黄色的那一行 lin:4,就报错了(如下图所示)
在这里插入图片描述

build.gradler的buildTypes 解释

下面我们来说说buildTypes里面各项的的常见属性:(网上找的)


属性	描述
boolean debbuggable	该构建类型是否生成一个可调式的apk
boolean minifyEnabled	是否可以移出无用的java代码,默认为false
Boolean multiDexEnabled	是否可以分包
File multiDexKeepFile	指定放在main dex内的类,如果设置则它的格式为一个类一行:com/example/MyClass.class
File multiDexKeepProguard	指定用在main dex 的类上的混淆文件,跟系统混淆文件联合使用
String name	这种构建类型的名称
proguardFiles	指定插件使用的混淆文件
SigningConfig signingConfig	签名配置文件
boolean zipAlignEnabled	是否使用zipAlign优化apk,Android sdk包里面的工具,能够对打包的应用程序进行优化,让整个系统运行的更快
String versionNameSuffix	VersionName的后缀

uild.gradler的dependencies 解释
还不熟悉 2.x 版本依赖的可以看看下面的说明,括号里对应的是 3.0 版本的依赖方式。
1.compileOnly表示只在编译时引用该jar包,打包的时候并不会将该jar打包进去。
这里有一点一定要特别注意:一定要将Modules下的build.gradle里的
implementation fileTree(include: [’*.jar’], dir: ‘libs’)
注释掉,否则还是会将framework.jar打包进apk
这种是我们最常用的方式,使用该方式依赖的库将会参与编译和打包。
当我们依赖一些第三方的库时,可能会遇到com.android.support冲突的问题,就是因为开发者使用的compile依赖的com.android.support包,而他所依赖的包与我们本地所依赖的com.android.support包版本不一样,所以就会报All com.android.support libraries must use the exact same version specification (mixing versions can lead to runtime crashes这个错误。
解决办法可以看这篇博客:com.android.support冲突的解决办法

2.provided(compileOnly)
只在编译时有效,不会参与打包
可以在自己的module中使用该方式依赖一些比如com.android.support,gson这些使用者常用的库,避免冲突。

3.implementation:使用了该命令编译的依赖,它仅仅对当前的Module提供接口。例如我们当前项目结构如下

4.apk(runtimeOnly)
只在生成apk的时候参与打包,编译时不会参与,很少用。

5.testCompile(testImplementation)
testCompile 只在单元测试代码的编译以及最终打包测试apk时有效。

6.debugCompile(debugImplementation)
7.debugCompile 只在 debug 模式的编译和最终的 debug apk 打包时有效

8.releaseCompile(releaseImplementation)
Release compile仅仅针对 Release 模式的编译和最终的 Release apk 打包。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值