1. 合理配置 .gitignore
文件
配置 .gitignore
可以排除一些非必要文件和保护保密信息,下面是在项目根目录下 .gitignore
的配置:
1 2 3 4 5 6 7 8 | .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
文件里:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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
:
1 2 3 4 | RELEASE_KEY_ALIAS=androiddebugkey RELEASE_STORE_PASSWORD=androidstore RELEASE_KEY_PASSWORD=androidkey RELEASE_STORE_FILE=$rootDir/debug.jks |
对于 /app/build.gradle
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | 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
中的配置如下:
1 2 3 4 5 6 | 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
版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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
版本的交集,对,这里强调下:交集、交集、交集
1 2 3 | armeabi armeabi-v7a x86 |
找到了交集,就是我们需要在打包进APK的 so
版本,如何指定打包 so
版本,需要配置 /app/build.gradle
文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | 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
:
1 2 | //apply plugin: 'com.android.application' apply plugin: 'com.android.library' |
即修改 apply plugin: 'com.android.application'
为 apply plugin: 'com.android.library'
2.修改demoLibary一些信息:
删除 AndroidManifest.xml
中的无用信息:
1 2 3 | //例如: android:icon="@mipmap/ic_launcher" android:label="@string/app_name" |
删除 res/values
下不用的值和文件。
3.在主 module app 里添加对 demoLibary 的引用:
1 2 3 4 | dependencies { ... compile project(':demoLibary') } |
4.生成 aar 文件:
build
module app 之后就能在 demoLibary 下的 build/outputs/aar
下找到我们需要的 aar 文件了,这里命名为 demoLibary-1.0.aar
。
使用 aar
1.配置项目根目录的 /build.gradle
:
1 2 3 4 5 6 7 8 | allprojects { repositories { ... flatDir { dirs 'libs' } } } |
2.在 module app 中引用 aar :
首先复制 demoLibary-1.0.aar
到 module app 下的 libs
目录(没有则创建此目录)中,然后修改 /app/build.gradle
文件:
1 2 3 4 5 | dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile(name: 'demoLibary-1.0', ext: 'aar') ... } |
这样,你就可以使用 demoLibary 开放的接口和方法了。