IntelliJ IDEA,是java编程语言开发的集成环境,在业界被公认为最好的java开发工具之一。参考其官网:https://www.jetbrains.com/idea/。
其实不只是Java,同家公司的Android Studio、PHPStorm、WebStorm、PyCharm、RubyMine的功能,它都有,不就是插件嘛!所以,最近把Android Studio、PHPStorm、WebStorm、PyStorm全部干掉了,所有项目都用IntelliJ来开发。
因为IntelliJ的各种插件都比较新,所以,顺带把Android的各种编译工具和环境更新到相对新的版本,也就有了如下采坑总结,记录一下。
1.gradle.properties
#gradle:3.0.1 studio3.0 之前用
#android.useDeprecatedNdk=true
#gradle:3.0.1 studio3.0 之后用
#android.deprecatedNdkCompileLease=1511832698813
org.gradle.daemon=true
org.gradle.configureondemand=true
org.gradle.jvmargs=-Xmx4g -XX:MaxPermSize=2048m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
2.根目录下的:build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
repositories {
maven{url 'http://maven.aliyun.com/nexus/content/groups/public/'}
google()
// jcenter {
// url "http://jcenter.bintray.com/"
// }
}
dependencies {
// classpath 'com.android.tools.build:gradle:2.1.3'
classpath 'com.android.tools.build:gradle:3.5.0'
classpath 'com.mob.sdk:MobSDK:+'
classpath 'com.mob.sdk:MobSDK-Impl:2018.0710.1743'
// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}
allprojects {
repositories {
jcenter()
maven {
url "https://maven.google.com"
}
maven {
url 'https://dl.bintray.com/youzanyun/maven/'
}
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
3.library目录下的:build.gradle
apply plugin: 'com.android.library'
android {
compileSdkVersion 28
buildToolsVersion '28.0.3'
defaultConfig {
minSdkVersion 15
targetSdkVersion 28
versionCode 1
versionName "1.0"
}
lintOptions {
abortOnError false
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:support-v4:28.0.0'
implementation 'com.android.support:design:28.0.0'
implementation 'com.jakewharton:butterknife:8.8.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.8.1'
}
4.子项目的build.gradle
android {
dexOptions {
preDexLibraries = false
javaMaxHeapSize "4g"
}
externalNativeBuild {
ndkBuild {
path "src/main/jni/Android.mk" // 设置所要编写的c源码位置,以及编译后so文件的名字
}
}
compileOptions {
encoding = "UTF-8"
sourceCompatibility JavaVersion.VERSION_1_7
targetCompatibility JavaVersion.VERSION_1_7
}
signingConfigs {
release {
keyAlias '***'
keyPassword '***'
storeFile file('../***')
storePassword '***'
}
}
lintOptions {
checkReleaseBuilds false
// Or, if you prefer, you can continue to check for errors in release builds,
// but continue the build even when errors are found:
abortOnError false
}
compileSdkVersion 28
defaultConfig {
applicationId "com.threeti.huimapatient"
multiDexEnabled true
minSdkVersion 16
targetSdkVersion 26
versionCode 800
versionName "8.0.0"
// 下面这段是老版本的写法,不需要了
// ndk {
// moduleName "JniAES"
// ldLibs "log", "z", "m"
// abiFilters "armeabi-v7a", "x86"
// }
// 使用ndkBuild工具
externalNativeBuild {
ndkBuild {
//指定 Application.mk 的路径
arguments "NDK_APPLICATION_MK:=src/main/jni/Application.mk"
//指定生成哪些平台的 so 文件
//abiFilters "armeabi-v7a", "armeabi"
//生成多个版本的so文件
abiFilters "armeabi-v7a", "x86"
//cFlags 和 cppFlags 是用来设置环境变量的, 一般不需要动
cFlags "-DTEST_C_FLAG1", "-DTEST_C_FLAG2"
cppFlags "-DTEST_CPP_FLAG2", "-DTEST_CPP_FLAG2"
//cppFlags ""
}
}
}
buildTypes {
release {
minifyEnabled false
signingConfig signingConfigs.release
applicationVariants.all { variant ->
variant.outputs.all {
outputFileName = "YOURAPPNAME_release_v${defaultConfig.versionName}_${releaseTime()}_${variant.productFlavors[0].name}.apk"
}
}
}
}
sourceSets {
main {
jni.srcDirs = ['src/main/jni','src/main/jni/']
jniLibs.srcDir 'src/main/libs'
}
}
// Specifies the flavor dimensions you want to use. The order in which you
// list each dimension determines its priority, from highest to lowest,
// when Gradle merges variant sources and configurations. You must assign
// each product flavor you configure to one of the flavor dimensions.
flavorDimensions "default"//,"mode","version","api"
productFlavors {
xiaomi { // Assigns this product flavor to the "mode" flavor dimension.
dimension "default"
}
yingyongbao { // Assigns this product flavor to the "mode" flavor dimension.
dimension "default"
}
huawei { // Assigns this product flavor to the "mode" flavor dimension.
dimension "default"
}
// 这里需要这个配置是因为,我们上面虽然建立了渠道,但是并没有处理Manifest里面的meta-data信息。
productFlavors.all { flavor ->
flavor.manifestPlaceholders = [UMENG_CHANNEL: name] //动态地修改AndroidManifest中的渠道名
}
}
useLibrary 'org.apache.http.legacy'
}
repositories {
flatDir {
dirs 'libs'
}
mavenCentral()
}
dependencies {
implementation 'in.srain.cube:ultra-ptr:1.0.11'
implementation files('libs/universal-image-loader-1.9.3.jar')
implementation (name: 'alipaySdk-15.6.8-20191021122455-noUtdid', ext: 'aar')
...
}
5.对应的android.mk
LOCAL_PATH := $(call my-dir)
# Builds a dylib out of test.cpp
# 会清除很多 LOCAL_XXX 变量,不会清除 LOCAL_PATH,基本上是固定的,不需要去动
include $(CLEAR_VARS)
# 需要构建模块的名称,会自动生成相应的 libNDKSample.so 文件,每个模块名称必须唯一,且不含任何空格
LOCAL_MODULE := JniAES
# 包含要构建到模块中的 C 或 C++ 源文件列表
LOCAL_SRC_FILES := KeyValue.c
# 指定这个模块里会用到哪些原生 API,详见:https://developer.android.google.cn/ndk/guides/stable_apis.html
LOCAL_LDLIBS := -llog
# 帮助系统将所有内容连接到一起,固定的,不需要去动
include $(BUILD_SHARED_LIBRARY)
6.对应的Application.mk
# https://developer.android.com/ndk/guides/application_mk.html
# 选择不同的 ABI,多个使用空格作为分隔符,全部是all
APP_ABI := all # armeabi-v7a x86
# 指定要使用的运行时
APP_STL := system
参考:
https://developer.android.com/ndk/guides/android_mk
https://www.cnblogs.com/webor2006/p/9999063.html
http://wuxiaolong.me/2017/12/27/AndroidNDK/