Android必知必会-发布开源 Android 项目注意事项
如果移动端访问不佳,请使用 –> 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-drawable、fresco、Vitamio-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.修改 demoLibary 的 build.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:
Android必知必会-发布开源 Android 项目注意事项的更多相关文章
- Android必知必会-获取视频文件的截图、缩略图
背景 公司最近要求给我负责的APP加上视频录制和发布的功能,我简单的完成了基本的录制和视频压缩功能,后来发现发布接口需要上传视频的截图,网上搜索了一下资料,在这里整理一下. 代码实现 /** * 获取 ...
- 迈向高阶:优秀Android程序员必知必会的网络基础
1.前言 网络通信一直是Android项目里比较重要的一个模块,Android开源项目上出现过很多优秀的网络框架,从一开始只是一些对HttpClient和HttpUrlConnection简易封装使用 ...
- Android必知必会-使用okhttp的PUT方式上传文件
注:如果移动端排版有问题,请看 简书版 (<-点击左边),希望CSDN能更好的支持移动端. 背景 公司的文件上传接口使用PUT协议,之前一直用的都是老项目中的上传类,现在项目中使用了okhttp ...
- Android程序员必知必会的网络通信传输层协议——UDP和TCP
1.点评 互联网发展至今已经高度发达,而对于互联网应用(尤其即时通讯技术这一块)的开发者来说,网络编程是基础中的基础,只有更好地理解相关基础知识,对于应用层的开发才能做到游刃有余. 对于Android ...
- 脑残式网络编程入门(三):HTTP协议必知必会的一些知识
本文原作者:“竹千代”,原文由“玉刚说”写作平台提供写作赞助,原文版权归“玉刚说”微信公众号所有,即时通讯网收录时有改动. 1.前言 无论是即时通讯应用还是传统的信息系统,Http协议都是我们最常打交 ...
- RecyclerView 必知必会(转)
[腾讯Bugly干货分享]RecyclerView 必知必会 本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:http://mp.weixin.qq.com ...
- Java面试必知必会(扩展)——Java基础
float f=3.4;是否正确? 不正确 3.4是双精度,将双精度赋值给浮点型属于向下转型,会造成精度损失: 因此需要强制类型转换: 方式一:float f=(float)3.4 方式二:float ...
- 读书笔记--SQL必知必会--建立练习环境
书目信息 中文名:<SQL必知必会(第4版)> 英文名:<Sams Teach Yourself SQL in 10 Minutes - Fourth Edition> MyS ...
- 2015 前端[JS]工程师必知必会
2015 前端[JS]工程师必知必会 本文摘自:http://zhuanlan.zhihu.com/FrontendMagazine/20002850 ,因为好东东西暂时没看懂,所以暂时保留下来,供以 ...
- [ 学习路线 ] 2015 前端(JS)工程师必知必会 (2)
http://segmentfault.com/a/1190000002678515?utm_source=Weibo&utm_medium=shareLink&utm_campaig ...
随机推荐
- Unity3D UGUI 自动调节大小
可添加以下组件 组件包含的两个枚举参数,可以自行设定适应方式. 例如一个Text UI元素,当文字过多的时候他不会自动增加高度而导致文字不能完全显示,这时候就可以挂载这个组件,如上图设置参数,就可以自 ...
- [NOI 2010]能量采集
Description 题库链接 给你一个 \(n\times m\) 的坐标轴.对于坐标轴的每一个正整数整点 \((x,y)\) 其对答案产生的贡献为 \(2k+1\) ,其中 \(k\) 表示这个 ...
- 计蒜客NOIP模拟赛4 D2T2 跑步爱天天
YOUSIKI 在 noip2016 的一道<天天爱跑步>的题爆零后,潜心研究树上问题,成为了一代大师,于是皮皮妖为了测验他,出了一道题,名曰<跑步爱天天>. 有一个以 1 为 ...
- bzoj 5285: [Hnoi2018]寻宝游戏
Description Solution 把输入的 \(n\) 个二进制数看作一个大小为 \(n*m\) 的矩阵 把每一列压成一个二进制数,其中最高位是最下面的元素 然后就有了 \(m\) 个二进制数 ...
- C++Primer学习——动态内存
静态内存:用来保存static 栈内存:保存非static 智能指针: shared_ptr:允许多个指针指向一个对象 unique_ptr:独占所指对象 weak_ptr:一种弱引用,指向share ...
- hdu 5430(几何)
题意:求光在圆内反射n次后第一次返回原点的方案数 如果k和n-1可约分,则表明是循环多次反射方案才返回原点. #include <iostream> #include <cstrin ...
- 对中断的理解handle_level_irq【原创】
如下为本人原创,在解决问题的过程中的一点心得,如果有描述不准确的地方还请各位指出,非常感谢 Linux内核版本:linux-4.9.18 曾有一次调试触摸屏的时候遇到如下的问题 /startup/mo ...
- 勤拂拭软件Android开发之旅(1) 之 Android 开发环境搭建
勤拂拭软件工作室原创出品,欢迎转载,欢迎交流. 转载请注明原文:http://www.cnblogs.com/wangleiblog/p/6019063.html 勤拂拭软件Android开发之旅目录 ...
- 使用json-Server与postman快速模拟服务环境搭建
在前后端分离的这种工作模式下,分工明确,各司其职.前端负责展示数据,后端提供数据.然而,在这种过程中对于接口的规范 需要提前制定好.例如根据规范提前模拟数据,这个时候就比较麻烦的.JsonServer ...
- Android 自定义支持快速搜索筛选的选择控件(一)
Android 自定义支持快速搜索筛选的选择控件 项目中遇到选择控件选项过多,需要快速查找匹配的情况. 做了简单的Demo,效果图如下: 源码地址:https://github.com/whieenz ...