有源码怎么编译-Android系统原生App编译-以Settings为例

编译调试Android系统原生App——以Settings为例

0. 前言:

Android原生系统有很多原生的App,比如浏览器、录音机、计算器、设置等,有时候,我们需要使用一些系统功能,或者对现有的功能做二次开发,比如当我上学的时候,我做了一个为一家公司提供Launcher和Wizard,需要使用系统设置中的个别功能,比如Wifi、声音、显示等功能,所以需要从Settings源码中提取所需的功能。

尤其是当公司定制Android系统,需要在前端制作一些系统级的App时,通过编译其源码并修改即可直接使用原生App的现有功能,可用性非常高。

以下内容以Settings为例,主要介绍如何编译、运行和调试Settings源码。

1、源码:

这里分两种情况,分为原生系统和公司定制系统。 无论是原生还是定制有源码怎么编译,像Settings这样需要使用系统级或者隐藏API的app都需要系统签名文件并编译系统源码得到对应的jar包才可以在IDE中编译,因为标准的SDK基本上都有没有可调用的 API。

举个栗子:

闹钟、计算器等不需要额外的Jar包。 获取源代码并将其导出到 IDE 后即可运行它们。 由于包名冲突,如果要调试,必须删除系统应用程序或更改包名。

Settings、Launcher等需要系统级Jar包,而SDK没有提供相应的API。 如果要调试此类问题,必须删除同包名的系统App。 更改包名称会导致意想不到的混乱问题。

(1) 原生应用程序:

网址:

位置:platform/packages/apps/,可以使用Ctrl+F搜索。 单击要编译的App,例如Settings。

使用Git克隆它:如git clone

如果需要额外的Jar,则需要自己编译系统源码。 这样就比较麻烦了。 如果你有兴趣,可以尝试编译定制自己的Android系统。

(2)定制:

向公司下层工程师要代码。

第一个是“out/target/common/obj/JAVA_LIBRARIES/”文件夹。 让底层工作人员将整个文件夹压缩后给你。 虽然比较大(1G左右),但是还是有必要的。 底层工作人员可能会说:你告诉我你想要什么,废话,别听他的,你全都要。

接下来,我们需要Settings的源代码。

** 注意,既然是定制的,那么源码、jar、签名文件、系统都是一一对应的。 您不能使用其他公司的系统签名来签署您公司的系统应用程序,因为这将很难运行。 **

2、编译:

有了源码,下一步其实就是跑起来了。

建议使用Eclipse进行编译,而不是AS,因为用AS编译原生小应用会让你吐血,而且错误提示也不友好。 但是用过AS的人就不想再碰Eclipse了吧? ? 不用担心,你可以先用Eclipse编译一下,然后粘贴到AS中。 这更容易并且节省时间。

步:

初始化:

新建一个工程,选择最大的Compile With,选择Target和Min与自己使用的系统一致,包名与原生app的包名一致。 例如,“设置”是 com.android.settings。

创建成功后,添加libs文件夹,删除AndroidManifest.xml,并清除res。 使用Git初始化项目,添加忽略文件,提交init,方便​​出现错误时回滚。

放入源码:

将Settings源代码的AndroidManifest.xml、src、res复制到项目中,选择Project -> Clean清除,控制台会出现很多错误。

git commit 再次提交,出了问题很容易回滚。

修复分辨率错误:

第一个是res下的错误。 每种语言的strings.xml文件可能会报错。 建议删除其他不需要的语言。 可以按照Console的错误信息,写一个小程序,批量删除,留下需要的,修改一下。 就是错了。 例如,本机代码可能有重复的字符串,只需将其删除即可。 我只留下了value和value-zh-rCN的strings.xml,因为它们在其他语言中没有使用。

如果缺少图片等Drawable文件,可以通过以下方式找回:

不要害怕改变,优先解决问题。 比如我发现编译后缺少@*android:drawable/XXX文件。 我在SDK文件夹中搜索后找到了该文件,将其放在res/drawable文件夹中,并将其引用更改为@drawable/XXX。 毕竟,它只是一个资源文件。

如果缺少样式,可以将样式名称粘贴到Google中,通常可以获得正确的结果。

总之,只要按照提示操作,仍然解决,直到res不提示错误为止。 解决了,git提交。

修复src错误:

接下来是 src 错误。 首先要导出jar包。 解压底层工程师给你的JAVA_LIBRARIES文件夹。 里面有很多子文件夹。

第一个包:

文件夹:framework_intermediates

第二包:

文件夹:core_intermediates/core-libart_intermediates(可能是另一个名称)

第三个包:

文件夹:android-common_intermediates

将上述文件夹中的classes.jar重命名为framework-classes.jar、core-classes.jar和common-classes.jar以便更好识别。 将它们放在一个容易找到的文件夹中,这三个jar包将被引用为User Library。 它不能用作普通罐子。 如何引用请谷歌。

必须要注意的是:

经过参考,在Java Build Path/Order和Export中,framework必须排在第一,core第二,common第三。

然后再次clean一下,看看src有没有错误。 例如,如果未找到 com.android.setupwizard.Test 类,请转到 JAVA_LIBRARIES 文件夹中搜索 Test,然后导航到其目录,找到其classes.jar 文件并重命名。 然后将其加载到库中。 其他错误也是如此。

有一个特殊的类EventLogTags,在文件夹中根本找不到它,它使用了一些静态变量。 于是我直接在网上搜索静态变量的名字,比如EventLogTags.LOCK_SCREEN_TYPE,直接使用它的值。 虽然是对的,但我也只好先这么做了。

同理,仍然解决,直到Clean后src没有错误,然后git commit。

建议取消勾选:

窗口 -> 首选项 -> Android -> Lint 错误检查运行完整错误检查...

这样就不会提示一些不影响运行的警告和Lint错误了。 反正没关系,眼不见心不烦。

3.尝试运行:

编译通过后,尝试调试,直接运行。 当你将其安装到设备中时,会出现以下错误:

错误:

无法执行dex:多个dex文件定义Landroid/support/annotation/AnimRes;

转换为 Dalvik 格式失败:无法执行 dex:多个 dex 文件定义 Landroid/support/annotation/AnimRes;

这是因为 Annotation 最初是作为一个单独的库存在的,但是由于某些激励,Annotation 已经包含在最新的 v4 中,因此不需要 Annotation 包。 如果您没有导出Annotation包,则说明您已经导出了SDK,只需通过Java Build Path/Libraries将其删除即可。 例如,如果我使用 Android N,请删除 Android N。

如果发现仍然存在这个问题,说明v4和v13包冲突,v13包中包含v4,所以直接去掉v4包即可。

安装错误:INSTALL_FAILED_VERSION_DOWNGRADE:

由于系统中已存在“设置”,因此无法安装。 您可以获取Root权限,删除/system/app/Settings/Settings.apk文件,删除前记得保存,万一出错可以恢复。

或者,通过右键单击并选择 Android 工具 -> 重命名应用程序包来重命名包。 如果您的项目是GBK编码的,则重命名可能会失败。 可以通过右键选择属性->资源->选择UTF-8来重命名成功。 此方法需要谨慎使用。 它可能不适用于所有应用程序。 如果不使用特殊的API,完全没有问题。 因为像Settings这样重命名后会出现很多奇怪的问题。

如果要删除Settings.apk,提示:override rw-r–r-- root:root for 'Settings.apk'?,可以使用-rf:

rm -rf 设置.apk

提示:rm:Settings.apk:只读文件系统,您可以:

mount -o rw,重新挂载/系统

重新挂载/system目录,然后就可以删除它了。 这里涉及到的是Linux文件权限系统相关的,这里不再展开。

其实有一个软件可以操作它。 如果您的设备已经Root,您可以下载X-plore应用程序,打开设置,选择Root访问权限,选择超级用户+挂载可写,即可轻松删除系统应用程序。 不过在删除之前,建议先备份。

安装错误:INSTALL_PARSE_FAILED_MANIFEST_MALFORMED:

AndroidMenifest.xml 错误。 据说包名可能有大写字母,但我反正没有。 网上查了一下,有人说可以,写Activity之类的注册全名就可以了。 但我没有这样的情况。 后来发现有人在讲android:taskAffinity的问题。 我自己搜了一下,发现有的是“”,有的是com.android.settings。 我全部修改了,但还是有这个错误。 经过一番折腾,原来是我重命名了包名,导致了这个问题有源码怎么编译,于是我把包名改回来了。 删除相应的系统应用后,问题解决。

弹出Toast有问题。 SettingsActivity中使用Toast出现问题,报xml解析错误。 我不知道这是怎么回事,所以没有深入探究。

安装错误:INSTALL_FAILED_SHARED_USER_INCOMPATIBLE:

原因:apk的AndroidManifest.xml中声明了android:sharedUserId="android.uid.system",但没有对应的系统签名。 别担心,下一步是解释如何签名。

4、调试

使用系统级API,或者在AndroidManifest.xml文件中声明

android:sharedUserId="android.uid.system"

如果没有系统签名,则无法直接运行调试签名。 需要向底层工程师索要系统签名文件,该文件位于源码目录下。

构建目标产品安全

下的platform.pk8和platform.x509.pem。 如果想看这次Settings编译是否成功,可以适当在入口添加一个Log,然后导入未签名的apk,使用系统签名进行签名,放到/下的Replace Settings.apk中system/app/,然后重启系统,打开设置,看Logcat是否输出添加的Log。

将系统签名转换为调试签名进行调试:

在知道系统签名可以转为调试签名之前,说实话,我还是用Log形式调试的,太蛋疼了。 现在知道了,大家都彻底糊涂了。

我们都希望能够像普通应用程序一样调试系统应用程序。 下面介绍如何通过openssl将platform.pk8和platform.x509.pem转换为debug.keystore文件:

三个命令

获取 platform.priv.pem

openssl pkcs8 -in platform.pk8 -inform DER -outform PEM -out platform.priv.pem -nocrypt

获取平台.pk12

openssl pkcs12 -export -in platform.x509.pem -inkey platform.priv.pem -out platform.pk12 -name androiddebugkey

此过程提示输入密码,输入android

生成debug.keystore

keytool -importkeystore -deststorepass android -destkeypass android -destkeystore debug.keystore -srckeystore platform.pk12 -srcstoretype PKCS12 -srcstorepass android -alias androiddebugkey

这个方法来自:

Mac自带openssl,Linux和Win需要安装。

然后就可以用得到的debug签名配置到eclipse中愉快的调试了。 当然,你必须先删除系统中已经存在的应用程序。 然后重新启动系统。 至于如何配置eclipse的debug签名,请谷歌。

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

悟空资源网 源码编译 有源码怎么编译-Android系统原生App编译-以Settings为例 https://www.wkzy.net/game/186174.html

常见问题

相关文章

官方客服团队

为您解决烦忧 - 24小时在线 专业服务