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