博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
解决系统App编译签名问题
阅读量:7051 次
发布时间:2019-06-28

本文共 2878 字,大约阅读时间需要 9 分钟。

hot3.png

以下内容为感慨和吐槽,没兴趣的可以直奔分割线下方。       

进新公司之后发现,因为之前做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的方式开发了.只能说过程好曲折。。。。

转载于:https://my.oschina.net/mastere/blog/753526

你可能感兴趣的文章
python的学习笔记之——time模块常用内置函数
查看>>
计算机是如何工作的
查看>>
【c++】必须在类初始化列表中初始化的几种情况
查看>>
阿拉伯数字1与英语字母l造成的代码bug
查看>>
深度学习常见的专业术语
查看>>
2018-2019-2 20165334《网络对抗技术》Exp2 后门原理与实践
查看>>
vue双向数据绑定最最最最最简单直观的例子
查看>>
HTML提交方式post和get区别(实验)
查看>>
Java 11.do语句
查看>>
学习理论之感知器与最大间隔分类器
查看>>
我们建了一个 Golang 硬核技术交流群(内含视频福利)
查看>>
Be Nice!要善良
查看>>
二、ansible配置简要介绍
查看>>
解决docker容器中无ifconfig命令和ping命令问题
查看>>
CHAR、TCHAR、WCHAR_T之间的区别与问题
查看>>
sql小计合计
查看>>
安装Java
查看>>
Ubuntu Linux输入法fcitx方块乱码解决设置
查看>>
node递归批量重命名指定文件夹下的文件
查看>>
python if not用法
查看>>