1. 程式人生 > >搭建Android專案:AS+GitHub+aar+maven(GitHub上的)

搭建Android專案:AS+GitHub+aar+maven(GitHub上的)

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的理解了。