Android7.1编译framework.jar不生效

博主分享了framework编译方法及让其生效的经验。编译分res和源代码两种情况,后者要注意系统版本。编译命令使用有讲究,如m命令初次编译后再用会失败。让其生效有多种方法,包括推送重启、重新打包刷入等,还介绍了高通代码加入patch的新方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 版权声明:本文为博主原创文章,转载请联系作者并注明出处。此博客已同步更新至:https://blog.sasurai.cn https://blog.youkuaiyun.com/asahinokawa/article/details/79528698

被framework生效问题困了一天, 一定要记下来。试了网上各种答案,得到的结果都没生效。最终还是从同事那里得到的一份答案,还是同事靠谱啊。

一、framework编译方法

一般修改framework层的内容分为两种,一种是res,一种是源代码前者只需要在其目录下,通过mm的方式即可将framework-res.apk编译出来,并且通过将其push到手机/system/framework/目录下,可即时生效。后者则有一箩筐要说。

遇到了修改res下的内容,生成framework-res.apk后推到手机里面后,出现无法开机、资源无法找到的问题。困惑了很久,后来慢慢意识到可能是当前手机的系统版本的原因。手机当前的系统为客户分支系统,而当前的framework-res.apk编译自master分支,客户分支当然有很多master分支没有的东西,所以推送到客户分支所编译出来的系统之后,出现了资源无法找到等奇怪的错误。正确的姿势是将当前的手机系统,刷成master分支所编译出来的系统,然后再进行操作。这个坑靠着自己的直(xia)觉(meng)怕了出来。

1.使用m命令编译framework只有在系统初次编译后第一次使用有效,之后编译会失败,需使用make命令。

2.编译命令及解释

编译指令解释
m在源码树的根目录执行编译
mm编译当前路径下所有模块,但不包含依赖
mmm [module_path]编译指定路径下所有模块,但不包含依赖
mma编译当前路径下所有模块,且包含依赖
mmma [module_path]编译指定路径下所有模块,且包含依赖
make [module_name]无参数,则表示编译整个Android代码

下面列举部分模块的编译指令:

模块make命令mmm命令
initmake initmmm system/core/init
zygotemake app_processmmm frameworks/base/cmds/app_process
system_servermake servicesmmm frameworks/base/services
java frameworkmake frameworkmmm frameworks/base
framework资源make framework-resmmm frameworks/base/core/res
jni frameworkmake libandroid_runtimemmm frameworks/base/core/jni
bindermake libbindermmm frameworks/native/libs/binder

·对于make命令,模块名称未确定时,到相应目录下Android.mk文件中查找 LOCAL_PACKAGE_NAME 值。

通过上面的方法,可以编译成功得到framework.jar文件,但是将其push到/system/framework/后,则不一定会生效。

二、如何让它生效?

一般网上看到的做法是这样:

方法一:

将编译所生成的framework.jar推送到手机相应的位置,重启,看是否生效。如果没有生效,则继续删除/system/framework/arm目录和/system/framework/arm64目录中的boot.artboot.oat删除掉,之后重启机器。

如果这样操作后还是不生效该怎么办?

方法二:

在源代码的根目录,初始化好环境之后,在源代码的根目录下使用make snod,重新打包生成system.img,然后通过fastboot flash system %src_dir%\system.img,将新生成的system.img刷入手机,然后重启。

很遗憾,我还是没有生效。我把上面两者结合起来还是没有生效。。

方法三:

较为花式,请慎重服用。但这种近乎重新刷机的做法,感觉一定会生效

修改好了framework里面的东西之后,全局编译一次,然后将编译得到的结果刷入手机。

注意事项:

  • 如果在修改framework之前就已经进行过全局编译操作,那么在修改后,再进行全局编译,速度则非常快。
  • 如果在修改之后,还进行了git pull操作拉取了其他人对代码的修改,那么此次全局编译的速度就未知,不过基本上很慢。

 

不知道为啥上面的方法无效,下面介绍下新的方法,高通代码加入如下patch全编之后framework目录就不会有oat等目录了。

diff --git a/device/qcom/msm8952_64/BoardConfig.mk b/device/qcom/msm8952_64/BoardConfig.mk
index fdc1465..a9c04f0 100644
--- a/device/qcom/msm8952_64/BoardConfig.mk
+++ b/device/qcom/msm8952_64/BoardConfig.mk
@@ -129,8 +129,8 @@ MAX_VIRTUAL_DISPLAY_DIMENSION := 2048
 # Enable dex pre-opt to speed up initial boot
 ifeq ($(HOST_OS),linux)
   ifeq ($(WITH_DEXPREOPT),)
-    WITH_DEXPREOPT := true
-    WITH_DEXPREOPT_PIC := true
+    WITH_DEXPREOPT := false
+    WITH_DEXPREOPT_PIC := false
     ifneq ($(TARGET_BUILD_VARIANT),user)
       # Retain classes.dex in APK's for non-user builds
       DEX_PREOPT_DEFAULT := nostripping
 

<think>我们正在讨论的是在Android设备上设置默认应用,特别是将dangbeizhuomian.apk设置为默认启动器(Launcher)。根据之前的对话,用户已经提供了具体的操作步骤,但这里需要更直接的方法,可能不需要重新编译整个系统(如果可能的话)。不过,在Android系统中,要替换系统默认启动器,通常需要将应用预置为系统应用,并设置相应的属性。 但是,用户可能希望在不重新编译整个系统的情况下完成,这通常比较困难,因为系统应用需要系统签名和正确的权限。不过,我们可以尝试两种方法: 1. 如果有root权限,可以通过ADB命令临时设置,或者将APK推送到系统分区并设置权限,然后设置默认启动器。 2. 如果没有root权限,则只能通过常规方式设置默认启动器,但这需要应用本身声明支持HOME意图过滤器,并且用户手动设置。 根据用户的问题,他要求将dangbeizhuomian.apk设置为默认应用,但没有说明是否已经安装。我们假设该APK已经安装在设备上,并且支持作为启动器(即声明了CATEGORY_HOME的Activity)。 方法一:通过设置菜单(用户操作) 1. 安装dangbeizhuomian.apk(如果未安装)。 2. 按Home键,系统会弹出选择默认启动器的对话框,选择dangbeizhuomian并点击“始终”。 方法二:通过ADB命令(需要USB调试) 1. 确保已经启用USB调试。 2. 连接设备,执行以下命令: adb shell pm set-home-activity com.dangbeizhuomian/.MainActivity # 替换为实际的包名和主Activity 注意:此命令需要设备是debug版本或者有root权限,否则可能失败。 方法三:预置为系统应用(需要重新编译固件,如之前所述) 如果用户有系统源码和编译环境,可以按照之前的步骤将APK预置到系统中,并设置为默认启动器。 由于用户的问题没有明确环境,我将提供ADB命令的方法(如果设备支持)和用户手动设置的方法。 具体步骤: 1. 安装APK(如果未安装): adb install dangbeizhuomian.apk 2. 通过ADB设置默认启动器(需要设备支持,且命令需要root或debug版本): adb shell pm set-home-activity "com.dangbeizhuomian/.MainActivity" 如果上述命令执行成功,则设置完成。如果不支持,则只能通过用户操作。 3. 用户操作设置: - 按下Home键,系统会弹出选择启动器的对话框。 - 选择“dangbeizhuomian”,然后点击“始终”。 4. 验证: adb shell settings get secure home 如果返回的是你设置的包名和Activity,则成功。 注意:如果设备上已经有一个默认启动器,并且你想替换它,可能需要先清除默认设置: adb shell pm clear com.android.launcher3 # 清除原启动器的默认设置(替换com.android.launcher3为原启动器的包名) 但是,如果dangbeizhuomian.apk没有正确声明HOME过滤器,则无法被设置为启动器。 因此,请确保dangbeizhuomian.apk的AndroidManifest.xml中有类似如下声明: <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> 如果用户没有源码编译环境,且ADB命令pm set-home-activity不可用(需要Android 5.0以上,但部分厂商可能限制),那么只能通过用户界面设置。 因此,总结步骤: 步骤1:安装APK 步骤2:尝试使用ADB命令设置(如果设备允许) 步骤3:如果ADB命令不可行,则通过手动操作:按Home键,选择新的启动器并设置为默认。 注意:如果设备已经设置了默认启动器且没有弹出选择框,可以到设置->应用->默认应用->桌面应用(不同设备路径可能不同)中更改,或者清除原启动器的默认设置(在应用信息中点击“清除默认设置”)。 最后,生成相关问题。</think>### 如何将 `dangbeizhuomian.apk` 设置为默认启动器 #### 一、核心前提条件 1. **APK 必须包含 HOME 声明** 在 `AndroidManifest.xml` 中需包含: ```xml <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.HOME" /> <category android:name="android.intent.category.DEFAULT" /> </intent-filter> ``` 2. **签名要求** - 系统级替换:必须使用 **平台签名** $ \text{签名命令}: \text{java -jar signapk.jar platform.x509.pem platform.pk8 input.apk output.apk} $ - 用户级替换:普通签名即可 #### 二、系统级替换(需 root/刷机) ```mermaid graph TD A[签名APK] --> B[预置到priv-app] B --> C[修改system.prop] C --> D[重编译系统] D --> E[烧录固件] ``` 1. **签名 APK** ```bash java -jar out/host/linux-x86/framework/signapk.jar \ build/target/product/security/platform.x509.pem \ build/target/product/security/platform.pk8 \ dangbeizhuomian.apk dangbeizhuomian-signed.apk ``` 2. **预置到系统分区** 在 `device.mk` 中添加: ```makefile PRODUCT_PACKAGES += \ DangbeiLauncher ``` 创建预置模块: ```makefile # device/rockchip/common/apps/DangbeiLauncher/Android.mk LOCAL_MODULE := DangbeiLauncher LOCAL_SRC_FILES := dangbeizhuomian-signed.apk LOCAL_MODULE_CLASS := APPS LOCAL_MODULE_SUFFIX := .apk LOCAL_CERTIFICATE := platform # 关键! LOCAL_PRIVILEGED_MODULE := true include $(BUILD_PREBUILT) ``` 3. **设置默认启动器** 在 `system.prop` 中添加: ```properties ro.product.home_app=com.dangbei.launcher/.MainActivity ``` 4. **编译烧录** ```bash make -j8 && fastboot flash system out/target/product/rk3128/system.img ``` #### 三、用户级替换(无需 root) ```mermaid graph LR A[安装APK] --> B[清除旧启动器默认设置] B --> C[触发HOME键选择] C --> D[设置为始终启用] ``` 1. **安装 APK** ```bash adb install dangbeizhuomian.apk ``` 2. **清除旧启动器默认值** ```bash adb shell pm clear com.android.launcher3 # 替换为当前启动器包名 ``` 3. **触发选择对话框** ```bash adb shell am start -a android.intent.action.MAIN -c android.intent.category.HOME ``` 在设备上选择 **dangbeizhuomian** → **始终** 4. **验证设置** ```bash adb shell settings get secure home # 应返回:com.dangbei.launcher/.MainActivity ``` #### 四、故障排除表 | 现象 | 解决方案 | |------|----------| | 按HOME键无反应 | 检查 `AndroidManifest.xml` 的 `CATEGORY_HOME` 声明 | | 选择后不生效 | 执行 `adb shell pm clear` 清除旧启动器默认值 | | 系统重启后还原 | 必须使用系统级替换方案 | | 提示"权限拒绝" | 确保系统级替换时 APK 在 `priv-app` 目录 | > **关键提示**:RK3128 Android 7.1 的启动器管理严格,用户级设置在系统更新后会被重置,持久化替换需采用系统级方案[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值