简书链接:模块化开发2笔记与加速编译的技巧
文章字数:771,阅读全文大约需要3分钟
笔记和教程不同,笔记给自己看的,看不懂的朋友不要吐槽,我没那么多时间写这个教程。
1 2 3 4 5 6 7 8
   | 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()
   | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
   |     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())
              }         }
      }
  | 
 

所有配置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
   | 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' }
 
  | 
 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
   | 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 2 3 4 5 6 7 8 9 10 11 12
   | 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加速编译
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
   | 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
1 2 3 4
   | ext {     COMPILE_JNI = true     USE_ARR = true; }
  | 
 
1
   | android.useDeprecatedNdk = true
   | 
 
这里的精髓在于如果不需要编译jni,就完全可以关闭,这样打包的时候可以提升效率,不然又是混淆又是编译so,超级慢。