引言: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 打包。