搭建Android專案:AS+GitHub+aar+maven(GitHub上的)
阿新 • • 發佈:2019-01-07
Android專案:AS+GitHub+aar+maven(GitHub上的)
時間過得好快,一轉眼進公司就這麼久了。論語:溫故而知新可以為師矣。回顧一下進公司以後學了的東西吧。
AS:
Git:
GitHub:
aar:
Maven:
gradle:
混淆機制
- 用AS的gradle–>uploadArchives(上傳檔案),打包成aar生成Maven,提交到GitHub上
- 專案應用GitHub上的maven
- 混淆機制
- 多渠道打包機制
- 手把手教你無腦接入tinker(實現多渠道)
- 手把手教你寫自定義task,一鍵copy分類各個渠道補丁
用AS的gradle–>uploadArchives(上傳檔案),打包成aar生成Maven,提交到GitHub上
這個其實很簡單
第一步–>project 中的gradle.properties引數配置
#project的根目錄-->這裡寫死吧,因為寫根目錄的話它指的是module的根目錄而不是project的根目錄,或許我不會更好的方法
aar.path=C:/TongsonCode/GitHub/hello-maven/
#版本name&&release
APP_VERSION_NAME=1.0.0
#groupId
PUBLISH_GROUP_ID = pr.Tongson
#artifactId
PUBLISH_ARTIFACT_ID = demo
第二步–>需要Android lib的module中的gradle配置
//申請maven外掛
apply plugin: 'maven'
// ext is a gradle closure allowing the declaration of global properties
ext {
PUBLISH_GROUP_ID = "${PUBLISH_GROUP_ID}"
PUBLISH_ARTIFACT_ID = "${PUBLISH_ARTIFACT_ID}"
PUBLISH_VERSION = android.defaultConfig.versionName
}
//上傳文件配置
uploadArchives {
repositories.mavenDeployer {
def deployPath = file (getProperty('aar.path'))
repository(url: "file://${deployPath.absolutePath}")
pom.project {
groupId project.PUBLISH_GROUP_ID
artifactId project.PUBLISH_ARTIFACT_ID
version project.PUBLISH_VERSION
}
}
}
第三步–>uploadArchives生成aar
大功告成,把程式碼提交到GitHub!
專案應用GitHub上的maven
這個其實更特麼簡單了!
//依賴中新增
dependencies {
//compile 'groupId:artifactId:release'
compile 'pr.Tongson:demo:1.0.0'
}
//倉庫中新增
repositories {
jcenter()
maven {
// https://github.com/gepriniusce/hello-maven
// maven的github連結/分支
// url "https://raw.githubusercontent.com/gepriniusce/hello-maven/master"
url "https://raw.githubusercontent.com/gepriniusce/hello-maven/master"
}
}
大功告成–>分享一下demo咯
程式碼混淆機制
buildTypes {
release {
//是否開啟小功能
minifyEnabled false
//混淆器-->檔案
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
混淆的常見配置
Keep用來保留Java的元素不進行混淆. keep有很多變種,他們一般都是
-keep
-keepclassmembers
-keepclasseswithmembers
dontwarn是一個和keep可以說是形影不離,尤其是處理引入的library時.
-dontwarn
哪些不應該混淆
反射中使用的元素
GSON的序列化與反序列化
列舉也不要混淆
四大元件不建議混淆
註解不能混淆
其他不該混淆的
- jni呼叫的java方法
- java的native方法
- js呼叫java的方法
- 第三方庫不建議混淆
- 其他和反射相關的一些情況
語法
-include {filename} 從給定的檔案中讀取配置引數
-basedirectory {directoryname} 指定基礎目錄為以後相對的檔案名稱
-injars {class_path} 指定要處理的應用程式jar,war,ear和目錄
-outjars {class_path} 指定處理完後要輸出的jar,war,ear和目錄的名稱
-libraryjars {classpath} 指定要處理的應用程式jar,war,ear和目錄所需要的程式庫檔案
-dontskipnonpubliclibraryclasses 指定不去忽略非公共的庫類。
-dontskipnonpubliclibraryclassmembers 指定不去忽略包可見的庫類的成員。
保留選項
-keep {Modifier} {class_specification} 保護指定的類檔案和類的成員
-keepclassmembers {modifier} {class_specification} 保護指定類的成員,如果此類受到保護他們會保護的更好
-keepclasseswithmembers {class_specification} 保護指定的類和類的成員,但條件是所有指定的類和類成員是要存在。
-keepnames {class_specification} 保護指定的類和類的成員的名稱(如果他們不會壓縮步驟中刪除)
-keepclassmembernames {class_specification} 保護指定的類的成員的名稱(如果他們不會壓縮步驟中刪除)
-keepclasseswithmembernames {class_specification} 保護指定的類和類的成員的名稱,如果所有指定的類成員出席(在壓縮步驟之後)
-printseeds {filename} 列出類和類的成員-keep選項的清單,標準輸出到給定的檔案
壓縮
-dontshrink 不壓縮輸入的類檔案
-printusage {filename}
-dontwarn 如果有警告也不終止
-whyareyoukeeping {class_specification}
優化
-dontoptimize 不優化輸入的類檔案
-assumenosideeffects {class_specification} 優化時假設指定的方法,沒有任何副作用
-allowaccessmodification 優化時允許訪問並修改有修飾符的類和類的成員
混淆
-dontobfuscate 不混淆輸入的類檔案
-printmapping {filename}
-applymapping {filename} 重用對映增加混淆
-obfuscationdictionary {filename} 使用給定檔案中的關鍵字作為要混淆方法的名稱
-overloadaggressively 混淆時應用侵入式過載
-useuniqueclassmembernames 確定統一的混淆類的成員名稱來增加混淆
-flattenpackagehierarchy {package_name} 重新包裝所有重新命名的包並放在給定的單一包中
-repackageclass {package_name} 重新包裝所有重新命名的類檔案中放在給定的單一包中
-dontusemixedcaseclassnames 混淆時不會產生形形色色的類名
-keepattributes {attribute_name,...} 保護給定的可選屬性,例如LineNumberTable, LocalVariableTable, SourceFile, Deprecated, Synthetic, Signature, and
InnerClasses.
-renamesourcefileattribute {string} 設定原始檔中給定的字串常量
常見錯誤
1) Proguard returned with error code 1. See console
更新proguard版本
android-support-v4 不進行混淆
新增缺少相應的庫
2) 使用gson包解析資料時,出現 missing type parameter 異常
在 proguard-project.txt 中新增
-dontobfuscate
-dontoptimize
在 proguard-project.txt 中新增
# removes such information by default, so configure it to keep all of it.
-keepattributes Signature
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.* { ; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.* { ; }
3) 型別轉換錯誤
在 proguard-project.txt 中新增
-keepattributes Signature
4) 空指標異常
混淆過濾掉相關類與方法
5) java.lang.reflect.UndeclaredThrowableException
-keep interface com.dev.impl.**
6) Error: Unable to access jarfile ..libproguard.jar
路徑問題
7) java.lang.NoSuchMethodError
這也是最常見的問題,因為找不到相關方法,方法被混淆了,混淆過濾掉相關方法便可。
快取重新整理機制
gradle配置中
configurations.all {
resolutionStrategy.cacheChangingModulesFor 10, 'seconds'
}
多渠道打包機制
在module中的build.gradle中android {裡}
// If you need to add more flavors, consider using flavor dimensions.
productFlavors {
mock {
applicationIdSuffix = ".mock"
}
prod {
}
}
在module中的src資料夾裡面建立目錄:
根據加上對應name的資料夾,然後在裡面做修改就好了
其實這裡
mock ==main
prod ==main
然後渠道資料夾裡的內容把main裡的內容覆蓋而已。
而打包機制這個就要對gradle Task的理解了。