Android SDK开发中库相关技术问题咨询
嘿,好久没碰Android开发了吧?刚从Alpha版的Android Studio跳到现在,确实得适应下新的构建机制,我来帮你捋捋这几个关于SDK开发的问题:
1. 库中Activity的声明与AAR导出问题
完全不需要使用者手动在他们的应用Manifest里声明你的库中Activity!Android Gradle插件有Manifest合并机制,当你把包含Activity的库打包成AAR后,使用者引入这个AAR时,Gradle会自动把库Manifest里的Activity配置合并到主应用的最终Manifest中。
这个方案是完全可行的,但有个关键细节要注意:
- 如果你这个Activity只供SDK内部跳转使用,不需要被外部应用直接调用,记得把
android:exported设为false,避免安全风险; - 如果需要让外部应用(或者系统)能直接启动这个Activity,再把
exported设为true,同时可能需要配置对应的<intent-filter>。
2. 库中权限的声明问题
当然可以在库的Manifest里定义权限!同样靠Manifest合并机制,这些权限会自动被合并到主应用的Manifest中。不过要分两种情况:
- 普通权限(比如
ACCESS_NETWORK_STATE这种):合并后主应用会自动拥有,不需要额外操作; - 危险权限(比如
ACCESS_FINE_LOCATION):虽然Manifest里会包含,但Android 6.0(API 23)及以上版本要求运行时申请,这一步必须由使用者的主应用来完成——你的库没法直接触发权限申请,所以最好在SDK文档里明确告知使用者需要处理这些权限的运行时请求。
3. AAR vs JAR:选择与实际问题
除了官方提到的AAR包含资源、Manifest、JNI库等,JAR只有字节码的差异外,还有这些实际区别:
- 内容支持:AAR可以打包res资源、assets文件、JNI原生库、Manifest配置、甚至自定义的Build配置;JAR只能打包Java/Kotlin字节码,没法包含这些资源类内容。
- 依赖管理:AAR可以直接依赖其他AAR或JAR,Gradle会自动处理依赖传递;JAR只能依赖其他JAR,且如果依赖了AAR的内容,没办法直接打包进去。
- 构建灵活性:AAR可以包含自定义的
build.gradle配置(比如编译选项、依赖声明),JAR不行。
关于AAR的实际使用问题:
- 低API版本支持:AAR本身和API版本无关,只要你的库的
minSdkVersion设置合理,低版本设备(比如API 16及以上)都能正常使用,不存在格式层面的不支持; - Eclipse兼容性:这确实是个痛点——Eclipse本身不支持AAR格式,使用者如果还在用电Eclipse,需要手动解压AAR,把里面的
classes.jar、res资源、JNI库等手动导入到项目中,操作非常繁琐。如果你的目标用户还有大量Eclipse使用者,可能需要考虑同时提供JAR版本(但如果有资源/Activity的话,JAR没法满足)。
选择建议
- 如果你的SDK包含Activity、资源文件、JNI库或者需要Manifest配置,优先选AAR,它能把所有组件打包在一起,使用者引入更方便;
- 如果只是纯Java/Kotlin逻辑,没有任何资源或组件,JAR也可以,但AAR的扩展性更好,后续加资源也不用改格式。
内容的提问来源于stack exchange,提问作者vfsoraki
相关产品推荐
相关产品推荐

