筆記和教程不同斯辰,筆記給自己看的,看不懂的朋友不要吐槽坡疼,我沒(méi)那么多時(shí)間寫這個(gè)教程彬呻。
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())
}
}
}
所有配置
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'
}
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)
首先上面的話是有問(wèn)題的,沒(méi)有用doLast或者doFirst包裹柄瑰,那么直接運(yùn)行會(huì)發(fā)現(xiàn)先后優(yōu)先級(jí)還是存在問(wèn)題的 闸氮,而且掃描的時(shí)候就執(zhí)行了,
因此任務(wù)里面記上doFirst
或者doLast
才是最完美的寫法
任務(wù)優(yōu)先級(jí)規(guī)則:
1.不加doLast和doFirst的最先執(zhí)行
2.依賴task優(yōu)先級(jí)高于自己的doFirst和doLast
3.同一個(gè)task中的doLast按從上向下順序執(zhí)行
4.同一個(gè)task中的doFirst按從下到上倒序執(zhí)行
5.同一個(gè)task的doFirst優(yōu)先級(jí)高于doLast
6.不加doLast的 掃描時(shí)按代碼的先后執(zhí)行教沾,而不是根據(jù)依賴
模塊化開(kāi)發(fā)打包ARR SDK的坑
模塊 依賴另外一個(gè)模塊蒲跨,執(zhí)行這個(gè)模塊的arr生成, 被依賴的模塊不會(huì)合并到同一個(gè)arr中授翻,也就是說(shuō)所使用到的另外一個(gè)模塊的類的任何代碼都不會(huì)在你這個(gè)模塊中或悲,因此又要保證方便維護(hù)做一個(gè)合格的程序員孙咪,又要為了時(shí)間,所以還是用傳統(tǒng)的目錄分層來(lái)解決巡语。
能不能合并呢翎蹈?,當(dāng)然是可以的捌臊,我之前花果1天時(shí)間倒騰, 踩了很多坑兜材,雖然網(wǎng)上的辦法能夠解決理澎,但是里面的jar進(jìn)行了拆分arr,但是轉(zhuǎn)換為eclipse模塊操蛋了,曙寡,這就很容易被使用者分析代碼糠爬,而且公司強(qiáng)制適配eclipse項(xiàng)目,因此這樣會(huì)導(dǎo)致多出很多jar,當(dāng)然對(duì)于這種也不是不可以合并成同一個(gè)jar,但是公司給的時(shí)間太少举庶,也懶得繼續(xù)研究gradle了执隧,還不如直接用python加apktool 拆分合并速度快一些,當(dāng)然時(shí)間太趕了
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"] //可方便關(guān)閉警告真實(shí)的jni目錄就是jni,
jniLibs.srcDirs = ['cachejnilibs']//以及編譯好的so打包進(jìn)去户侥。
}
}
}
lintOptions {
abortOnError false
}
}
根build.gradle
ext {
COMPILE_JNI = true
USE_ARR = true;
}
android.useDeprecatedNdk = true
這里的精髓在于如果不需要編譯jni,就完全可以關(guān)閉镀琉,這樣打包的時(shí)候可以提升效率,不然又是混淆又是編譯so,超級(jí)慢蕊唐。