模块化开发2笔记与加速编译的技巧

笔记和教程不同,笔记给自己看的,看不懂的朋友不要吐槽,我没那么多时间写这个教程。

temp=["ff","ff"]
//temp.join("555")
//temp.push("555")
print temp.toString()
temp.add("55")
print(temp.getClass().getName())
//temp.add("55")
print temp.toString()
    sourceSets {
        main {
            manifest.srcFile  !DEBUGJNI.asBoolean()?'AndroidManifest.xml':'AndroidManifestJni.xml'
            aidl.srcDirs = ['src']
            java.srcDirs = !DEBUGJNI.asBoolean() ? ['src'] : ['src', 'testsrc']
            jni.srcDirs = ['jni']
            resources.srcDirs = ['src']
            res.srcDirs = !DEBUGJNI.asBoolean() ? ['res'] : ['res', 'testres']
            assets.srcDirs = ['assets']
            jniLibs.srcDirs = ['libs']
            renderscript.srcDirs = ['src']
            if (DEBUGJNI.asBoolean()) {
//                sourceSets.main.java.srcDirs.add("testsrc") //java.lang.UnsupportedOperationException (no error message)
                //      print "srcDir:"+sourceSets.main.java.srcDirs.toString()
//                throw new RuntimeException("中断" + sourceSets.main.java.srcDirs.toString())

            }
        }

    }
image.png

所有配置

if (DEBUGJNI.asBoolean()) {
    apply plugin: 'com.android.application'
} else {

    apply plugin: 'com.android.library'
}

android {
    compileSdkVersion 28



    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 28
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"

        externalNativeBuild {
            cmake {
                cppFlags ""
            }
        }
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        main {
            manifest.srcFile  !DEBUGJNI.asBoolean()?'AndroidManifest.xml':'AndroidManifestJni.xml'
            aidl.srcDirs = ['src']
            java.srcDirs = !DEBUGJNI.asBoolean() ? ['src'] : ['src', 'testsrc']
            jni.srcDirs = ['jni']
            resources.srcDirs = ['src']
            res.srcDirs = !DEBUGJNI.asBoolean() ? ['res'] : ['res', 'testres']
            assets.srcDirs = ['assets']
            jniLibs.srcDirs = ['libs']
            renderscript.srcDirs = ['src']
            if (DEBUGJNI.asBoolean()) {
//                sourceSets.main.java.srcDirs.add("testsrc") //java.lang.UnsupportedOperationException (no error message)
                //      print "srcDir:"+sourceSets.main.java.srcDirs.toString()
//                throw new RuntimeException("中断" + sourceSets.main.java.srcDirs.toString())

            }
        }

    }
    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
    lintOptions {
        checkReleaseBuilds false

        abortOnError false
    }
}

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

    implementation 'com.android.support:appcompat-v7:28.0.0'
}

image.png
task buildJar(type: Jar, dependsOn: ['assembleRelease']) {
    destinationDir = file('build/outputs/jar/')
//    from( 'build/intermediates/classes/release/')
    from(project.zipTree('build/intermediates/transforms/proguard/release/jars/3/3/main.jar'))
    exclude('**/BuildConfig.class')
    exclude('**/BuildConfig\$*.class')
    exclude('**/R.class')
    exclude('**/R\$*.class')
    include('**/*.class')
}



task moveArr2mergeincludearr(type: org.gradle.api.tasks.Copy) {
    from('build/outputs/aar/mergedsdk-release.aar')
    into('$build/sdk')
}

makeJar.dependsOn(build)

首先上面的话是有问题的,没有用doLast或者doFirst包裹,那么直接运行会发现先后优先级还是存在问题的 ,而且扫描的时候就执行了,
因此任务里面记上doFirst或者doLast才是最完美的写法

任务优先级规则:

1.不加doLast和doFirst的最先执行

2.依赖task优先级高于自己的doFirst和doLast

3.同一个task中的doLast按从上向下顺序执行

4.同一个task中的doFirst按从下到上倒序执行

5.同一个task的doFirst优先级高于doLast

6.不加doLast的 扫描时按代码的先后执行,而不是根据依赖

模块化开发打包ARR SDK的坑

模块 依赖另外一个模块,执行这个模块的arr生成, 被依赖的模块不会合并到同一个arr中,也就是说所使用到的另外一个模块的类的任何代码都不会在你这个模块中,因此又要保证方便维护做一个合格的程序员,又要为了时间,所以还是用传统的目录分层来解决。

能不能合并呢?,当然是可以的,我之前花果1天时间倒腾, 踩了很多坑,虽然网上的办法能够解决,但是里面的jar进行了拆分arr,但是转换为eclipse模块操蛋了,,这就很容易被使用者分析代码,而且公司强制适配eclipse项目,因此这样会导致多出很多jar,当然对于这种也不是不可以合并成同一个jar,但是公司给的时间太少,也懒得继续研究gradle了,还不如直接用python加apktool 拆分合并速度快一些,当然时间太赶了

jni sdk加速编译

if (USE_ARR) {
    apply plugin: 'com.android.library'

} else {

    apply plugin: 'com.android.application'
}

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.3"

    defaultConfig {
        if (!USE_ARR) {

            applicationId "com.ijm.drisk"
        }
        minSdkVersion 10
        targetSdkVersion 24

        /*      ndk {
                  moduleName "drisk"
                  abiFilters 'armeabi-v7a'
      //            abiFilters 'x86', 'armeabi-v7a', 'arm64-v8a', 'x86_64'
                  //abiFilters 'armeabi' 'armeabi',
              }*/

    }

    buildTypes {
        release {
            minifyEnabled USE_ARR ? true : false
            proguardFiles 'proguard-project.txt'

            ndk {
                moduleName "drisk"
                abiFilters 'x86', 'armeabi-v7a', 'arm64-v8a', 'x86_64'
                //abiFilters 'armeabi' 'armeabi',
            }

        }
        debug {
            minifyEnabled false
            proguardFiles 'proguard-project.txt'
            ndk {
                moduleName "drisk"
                abiFilters 'armeabi-v7a', 'x86'
            }
        }


    }

    if (COMPILE_JNI) {
        externalNativeBuild {
            ndkBuild {
                path 'src/main/jni/Android.mk'
            }
        }

    } else {

        sourceSets {
            main {
                jni.srcDirs = ["jninull"] //可方便关闭警告真实的jni目录就是jni,
                jniLibs.srcDirs = ['cachejnilibs']//以及编译好的so打包进去。
            }
        }

    }
    lintOptions {
        abortOnError false
    }


}

根build.gradle

ext {
    COMPILE_JNI = true
    USE_ARR = true;
}
android.useDeprecatedNdk = true

这里的精髓在于如果不需要编译jni,就完全可以关闭,这样打包的时候可以提升效率,不然又是混淆又是编译so,超级慢。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 废话不多说,自己进入今天的主题 1、面向对象的特征有哪些方面? 答:面向对象的特征主要有以下几个方面: - 抽象:...
    传奇内服号阅读 2,425评论 1 31
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,805评论 18 399
  • 有人住高楼, 有人在深沟, 有人光万丈, ...
    一把玻璃阅读 239评论 0 1
  • 每天除了工作还要带孩子,学习自考课程,感觉好累。刚工作两个月,还不是很熟练。只能等孩子睡着了,我才能上会网课。感觉...
    飞舞的海燕阅读 222评论 0 0