专栏首页Android必知必会Android必知必会-发布开源 Android 项目注意事项

Android必知必会-发布开源 Android 项目注意事项

版权声明:本文为[他叫自己Mr.张]的原创文章,转载请注明出处,否则禁止转载。 https://micro.blog.csdn.net/article/details/51933453

如果移动端访问不佳,请使用 –> Github版

1. 合理配置 .gitignore 文件

配置 .gitignore 可以排除一些非必要文件和保护保密信息,下面是在项目根目录下 .gitignore 的配置:

.gradle
/local.properties
/gradle.properties
/build
*.log
*.apk
*.ap_
/*/build/

这里介绍下一些参数的意义:

  • /local.properties:这个文件里默认写的有本地 SDK 的位置,多人协作时一般要排除,仅仅做开源项目可以不排除。
  • /gradle.properties:一般写有 gradle 的 jvm 、代理和打包签名文件 Key 的一些信息,根据需要进行处理,一般情况下需要排除,其他情况见下文。
  • /build/*/build/:排除 build 项目生成的文件,文件较大,且 IDE 可以自动生成,无特殊需求,必须排除

2. 签名文件

在使用了一些需要配置 appkey 的第三方的 SDK 时,比如 XX 地图 SDK 、XX 播放器 SDK ,这些都需要在对应的开发者中心里配置包名Android签名 信息,这些和签名文件直接相关,所以需要在项目里提前放置好一个编译用的签名文件,可以在 gradle.properties 里写上相应的变量。

签名文件目前有两种格式:.keystore.jsk ,这里以 debug.jks 为例,此文件存放在项目根目录,如果目录有变化,加上相应的路径即可。

根据是否在 gradle.properties 里写上相应的变量有两种使用方法:

方案一:不使用 gradle.properties

不使用 gradle.properties 的话,相关信息直接写在 /app/build.gradle 文件里:

android {
    ...
    signingConfigs {
        debug {
            storeFile file("$rootDir/debug.jks")
            storePassword "androidstore"
            keyAlias "androiddebugkey"
            keyPassword "androidkey"
        }

        release {
            storeFile file("$rootDir/debug.jks")
            storePassword "androidstore"
            keyAlias "androiddebugkey"
            keyPassword "androidkey"
        }
    }
}

方案二:使用 gradle.properties

使用 gradle.properties 的话,相关信息写在 /gradle.properties/app/build.gradle 文件里:

对于 /gradle.properties

RELEASE_KEY_ALIAS=androiddebugkey
RELEASE_STORE_PASSWORD=androidstore
RELEASE_KEY_PASSWORD=androidkey
RELEASE_STORE_FILE=$rootDir/debug.jks

对于 /app/build.gradle

android {
    ...
    signingConfigs {
        debug {
            storeFile file(RELEASE_STORE_FILE)
            storePassword RELEASE_STORE_PASSWORD
            keyAlias RELEASE_KEY_ALIAS
            keyPassword RELEASE_KEY_PASSWORD
        }
        releaseConfig {
            storeFile file(RELEASE_STORE_FILE)
            storePassword RELEASE_STORE_PASSWORD
            keyAlias RELEASE_KEY_ALIAS
            keyPassword RELEASE_KEY_PASSWORD
        }
    }
}

这种情况下 /gradle.properties 不能出现在 .gitignore 文件中。

3. .SO 文件

如果开源项目中使用的开源库中有多个库包含 jni,由于每个开源库提供的 so 文件的编译版本不尽相同,那么,很有可能在不同 CPU 架构的手机上崩溃,所以要在打包时进行 so 文件的过滤或者说选择。

下面举个简单的例子:假设我的一个开源项目使用了 gif-drawablefrescoVitamio-4.0

/app/build.gradle 中的配置如下:

dependencies {
    ...
    compile 'pl.droidsonroids.gif:android-gif-drawable:1.1.14'
    compile 'com.facebook.fresco:fresco:0.9.0'
    compile(name: 'Vitamio-4.0', ext: 'aar')
}

然后我们看一下它们各自编译的 so 版本:

gif-drawable
    --mips
    --mips64
    --armeabi
    --armeabi-v7a
    --arm64-v8a
    --x86
    --x86_64
fresco:imagepipeline
    --armeabi
    --armeabi-v7a
    --arm64-v8a
    --x86
    --x86_64
Vitamio-4.0
    --mips
    --armeabi
    --armeabi-v7a
    --x86

我们找一下以上三个库的 so 版本的交集,对,这里强调下:交集交集交集

armeabi
armeabi-v7a
x86

找到了交集,就是我们需要在打包进APK的 so 版本,如何指定打包 so 版本,需要配置 /app/build.gradle 文件:

android {
    ...
    productFlavors {
        dev {
            ndk {
                abiFilters "armeabi-v7a","arm64-v8a","x86"
            }
        }
        prod {
            ndk {
                abiFilters "armeabi-v7a","arm64-v8a","x86"
            }
        }
    }
}

关于打包时指定 so 版本这一点很重要,不仅时在开源项目中需要注意,在实际的开发项目中更要注意这一点,所以在选择包含了 jni 的开源库时,务必要注意到当前项目中其他开源库的 jni 的版本。每次添加新的包含 jni 的类库时,都要做一次比对,务必打包它们交集的 jni 版本。

4. 第三方SDK二次打包

项目中使用的第三方 SDK 中,其作者可能考虑的不够细致,也可能是为了兼容 Eclipse ,常常会出现让你复制粘贴大量的图片和 XML 文件到现有的项目中,这大大影响了项目原有的目录结构和可读性,更糟糕的问题是对 SDK 的升级、删除会非常的麻烦,碰到这样的 SDK ,需要我们进行二次打包成 aar 格式的类库。

PS:Eclipse 不支持 aar 格式,只能使用上述比较麻烦的方式,不过你可以在使用此类类库的时候,列一张清单,记录此 SDK 在项目中添加的所有文件,便于以后变更。如果不是特别需要,建议使用 Android Studio 进行开发。

打包 aar

打包 aar 需要在 Android Studio 中进行。这里先做一个约定,在 Android Studio 中的一个 Project 中,包含两个 module ,其中需要打包成 aar 的 module ,名称是 demoLibary ,主 module 或者说测试用的 module 名称是 app

1.修改 demoLibarybuild.gradle

//apply plugin: 'com.android.application'
apply plugin: 'com.android.library'

即修改 apply plugin: 'com.android.application'apply plugin: 'com.android.library'

2.修改demoLibary一些信息:

删除 AndroidManifest.xml 中的无用信息:

//例如:
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"

删除 res/values 下不用的值和文件。

3.在主 module app 里添加对 demoLibary 的引用:

dependencies {
    ...
    compile project(':demoLibary')
}

4.生成 aar 文件:

build module app 之后就能在 demoLibary 下的 build/outputs/aar 下找到我们需要的 aar 文件了,这里命名为 demoLibary-1.0.aar

使用 aar

1.配置项目根目录的 /build.gradle

allprojects {
    repositories {
        ...
        flatDir {
            dirs 'libs'
        }
    }
}

2.在 module app 中引用 aar :

首先复制 demoLibary-1.0.aar 到 module app 下的 libs 目录(没有则创建此目录)中,然后修改 /app/build.gradle 文件:

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile(name: 'demoLibary-1.0', ext: 'aar')
    ...
}

这样,你就可以使用 demoLibary 开放的接口和方法了。

n. 不是结尾

以上几点是目前发现的较明显的问题,如果你了解更多的注意事项,欢迎和我联系。

PS:

你可以关注的我 GithubCSDN微博

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 聊聊Elasticsearch的SingleObjectCache

    elasticsearch-7.0.1/server/src/main/java/org/elasticsearch/common/util/SingleObj...

    codecraft
  • 源码分析Dubbo事件派发机制

    从官网我们得知,Dubbo协议是使用单一长连接来进行网络传输,也就是说服务调用方持久与服务提供者建立一条连接,所有的服务调用调用信息通过。 一条TCP连接进行传...

    丁威
  • Elasticsearch Search API之(Request Body Search 查询主体)-下篇

    查询选择副本分片的倾向性(即在一个复制组中选择副本的分片值。默认情况下,es以未指定的顺序从可用的碎片副本中进行选择,副本之间的路由将在集群章节更加详细的介绍 ...

    丁威
  • Android 双击返回键退出程序的3种写法~

    LZ-Says: 去年真的浪费了好多的机会,,,而今年,却找不到一个合适的机会,,,还是自己能力有所欠缺啊。。。从一点点开始积累吧。。。那个谁,,,这次,我会...

    HLQ_Struggle
  • Apk 反编译前期了解

    LZ-Says:学习之路,似乎枯燥乏味,唯有耐着性子,独自前行,当光明笼罩的那一刻,一切,也仿佛明亮了许多。

    HLQ_Struggle
  • Netty-server

        当然网上对Netty 这框架有许多人都介绍,对于在网络编程的地位以及优劣性也有很多,打架可以去看看,今天我主要的目的是将自己项目中的实例拿出来和打架风向

    冯杰宁
  • 类图的6大关系详解

    以下类图使用 PlantUML 绘制,更多语法及使用请参考:http://plantuml.com/ 。

    李红
  • ES Pipeline Aggregation(管道聚合)

    同级管道聚合,它计算同级聚合中指定度量的平均值。同级聚合必须是多桶聚合,针对的是度量聚合(metric Aggregation)。 示例如下:

    丁威
  • Dubbo网络通讯篇概述

    从本节开始将深入学习Dubbo网络通讯的底层实现细节,在深入学习Dubbo网络模型时,首先应从整体上了解Dubbo的网络通讯模型、线程模型是怎样的?下图是Dub...

    丁威
  • HttpServletRequest 使用@Autowired 注解会有问题吗?

    SpringBoot 中,默认注入的对象是单例对象,那么,我们如果注入一个 HttpServletRequest,会有问题吗?因为每次请求,Request 是不...

    水货程序员

扫码关注云+社区

领取腾讯云代金券