搭建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
  • 混淆机制
  • 多渠道打包机制
  • gradle的一些理解https://github.com/rujews/android-tech-docs/blob/master/new-build-system/user-guide/README.md
  • 手把手教你无脑接入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

搭建Android项目:AS+GitHub+aar+maven(GitHub上的)_第1张图片

大功告成,把代码提交到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咯

https://github.com/gepriniusce/hello-world
https://github.com/gepriniusce/hello-maven


代码混淆机制

 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'
}

参考:
http://www.androidchina.net/6295.html
http://android.jobbole.com/84057/

多渠道打包机制

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

你可能感兴趣的:(项目)