如下内容为感慨和吐槽,没兴趣的能够直奔分割线下方。 java
进新公司以后发现,由于以前作App开发,如今进了作ROM的公司,虽然也是作APP开发,可是不少东西就变了,以前在windows环境下就能搞定的事情,如今双系统,由于公司配的unbuntu系统的电脑配置略高,因此花了一段时间才摸熟ubuntu,以后由于是开发系统app,签名等方式都是按照android.mk。来进行编译打包签名的。老实说,刚进来,一个系统编译4个小时,我就懵逼了。性子急表示整不肯意等,关键是编译失败,心里是奔溃的有木有。linux
以后由于作的任务多半和编译无关,我也有幸不去管这块了,过了一段时间以后,由于在写app方面确实比组内其余成员有经验些。因此担起了一个核心app的重构工做,过程是曲折的,一个卡片展现形式的插件,用有本身的project,附着在桌面展现,经过桌面插件方式load出来项目中的主view展现在桌面,由于是寄生在桌面程序上,因此没有application,心里是奔溃的。作过app开发的都知道,没有application,一些三方库是无法使用的,意味着得回到原始社会,重操urlconection手写全部代码,处理各类逻辑,重复造轮子有木有。android
好几经波折我发现虽然是插件app,在project中直接用这个view去getApplication拿不到,可是经过在attachwindow时获取父容器的Context,能够获取到applicationcontext.而后各种三方库能够愉快的用起来有木有。可是这里有坑需谨慎,后来咱们这个插件app准备接入事件统计,我把Umeng接进来发现初始化用桌面的context初始化用的是桌面的manifest信息。心里是奔溃的,有木有。versionName,versioncode不是本身项目的,泪奔。。。。。。好在公司内部有一个组仿照umeng写了一个统计sdk,而后让他们给定制化,在初始化以前手动传入versionName,versionCode.ubuntu
~~~~~~~~~~~~~~~~~~~~~~~~~~~~吐槽分割线~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~windows
而后就要谈到今天这个问题了,其实这个问题,一直困扰着我,为了尽快出包,简化打包流程,开始我想到手写mk文件,而后看了一成天android的makefile的知识,准备去编译系统,把项目里的aar等依赖处理简化,由于你们都知道mk方式打包对aar的支持不是很好,然而系统依旧是编译不过,太浪费时间,因此我看了下项目里的mk文件指定的签名是app
LOCAL_CERTIFICATE := platform
而后我思考着既然咱们是把项目放到系统源码下只是为了让编译的时候帮咱们签下名,为何咱们不能直接用这个签名去给未签名的包去签名,而后去系统项目根目录下的/build/target/product/security目录下找到了platform签名文件platform.x509.pem和platform.pk8,去网上找了下系统签名的方式原来是用signApk.jar去进行签名的。而后我屁颠屁颠的区sdk的platform-tools和tools下面找这个Jar包了,发现鬼影都没有,好吧,打开方式不对,是否是在系统工程目录下,而后百度了下果真是这么回事。ide
而后我找了组内其余已经编译过系统的人copy过来了这个项目根目录下的out/hostlinux-x86/framework/signApk.jar进行了签名。工具
java -jar signApk.jar platform.x509.pem platform.pk8 unsigned-source.apk sligned-result.apkgradle
这样sligned-result.apk就打包好了,直接能够放到系统原来的目录下,而后你也能够彻底依照开发app的流程不用去考虑麻烦,费时的mk编译了。ui
咨询了组内系统开发的老司机,原来系统中也是存在预编译apk直接用mk,进行配置apk就行。
看了下系统目录下已经存在的预编译apk的makefile文件语法
LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) # Module name should match apk name to be installed LOCAL_MODULE := CleanTask //模块名 LOCAL_MODULE_TAGS := optional LOCAL_SRC_FILES := $(LOCAL_MODULE).apk //这个值能够本身指定,就也能够直接用模块名。 //只须要改动这2个地方,就能实现预编译apk了,须要注意的是若是项目有依赖其余module,那么你能够先用as把依赖的项目所有 //用provided加入到project的中,这样就不会把依赖打包进项目,而后在mk文件里代表他们的依赖,虽然我没试过,可是理论上 //应该能够 LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX) LOCAL_CERTIFICATE := platform LOCAL_PRIVILEGED_MODULE := true include $(BUILD_PREBUILT)
感受很爽有木有,不再用管那些复杂的系统编译了。
可是用了几天以后,感受仍是太麻烦了,由于之前打包都是直接用as 点击run就出来包,区别只是as的release包使用keystore来进行配置的,而后我想虽然是系统签名,可是又了pem,pk8能够签名,那应该能够用工具把pem,pk8转换成platform.keystore.说干就干,果真我在网上找到了:
keytool-importkeypair -k platform.keystore -p android -pk8 platform.pk8 -cert platform.x509.pem -alias platform
生成keystore以后,把文件放到app工程的根目录下,对应在as的build.gradle下配置:
signingConfigs { releaseConfig { keyAlias 'platform' keyPassword 'android' storeFile file('platform.keystore') storePassword 'android' } }
而后就能够能够彻底按照app的方式开发了.只能说过程好曲折。。。。