android 7.1 apk的systemuid相同导致问题[2]

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=png

1

上周发的一篇文章《android 7.1 apk的systemuid和系统应用Setting相同导致开机找不到库的问题》,然后有个小伙伴找我讨论了,觉得自己的脑洞了打开了很多,所以针对这个问题再次做一次总结,如果大家有好的建议也可以在文末留言。

2

先说一个命令 adb shell dumpsys package p > dumpsys_p ,这个命令可以查看apk的一些状态,包括apk属于32位还是64位,保存成文件后查找里面对应的包名,就可以看到对应应用的信息。

640?wx_fmt=png

3

我们先是分析了出现问题时候的Settings,我们用原来的固件复现问题,在出现问题的时候用上面的命令查看,发现Settings已经变成了32位。

Package com.android.settings:
userId=1000
sharedUser=SharedUserSetting{a6835fb android.uid.system/1000}
pkg=Package{6d89bbd com.android.settings}
codePath=/system/priv-app/Settings
resourcePath=/system/priv-app/Settings
legacyNativeLibraryDir=/system/priv-app/Settings/lib
primaryCpuAbi=armeabi-v7a


4

上篇文章提到,我们报错是因为没有找到库文件,还有下面的日志引起32位和64位不匹配的原因。

PackageManager: Instruction set mismatch, PackageSetting{1e08467
com.xxxxxx.jjjjj.titket.oceanFlower/1000} requires arm whereas
PackageSetting{51ca86c android.rockchip.update.service/1000} requires
arm64 PackageManager: Instruction set mismatch, PackageSetting{1e08467
com.xxxxxx.jjjjj.titket.oceanFlower/1000} requires arm whereas
PackageSetting{992cb54 android/1000} requires arm64

我们的第一个尝试是,直接去掉原来修改的两个宏,然后在Setings安装位置system/priv-app/xxx/目录下面建立一个lib/arm64文件夹。这样复测20次,没有出现问题。原因是,我们的apk,发现当前安装位置下面有lib文件夹,优先从文件夹里去找库,而且是lib/arm64说明是64位的,让Settings运行在64位模式,我们的apk运行在32位模式。

5

添加前面文章的两个宏之后,在生成固件的apk里面多了一个class.dex,我们尝试把这个class.dex放到原来的Settings里面,然后再压缩把原来的Settings替换掉,这样复测20次,也是没有问题。所以这个class.dex起作用了。

  • rm /data/system/packages.xml

  • 恢复出厂设置

  • 测试20次没有出现问题。

然后再查看Setting的运行模式

userId=1000
sharedUser=SharedUserSetting{842777 android.uid.system/1000}
pkg=Package{7785b91 com.android.settings}
codePath=/system/priv-app/Settings
resourcePath=/system/priv-app/Settings
legacyNativeLibraryDir=/system/priv-app/Settings/lib
primaryCpuAbi=armeabi-v7a

Seting变成了32位,就因为我们加了class.dex的原因。

6

后面大神给我了一个补丁,用来解决这个问题,补丁代码如下,希望对有这方面问题的同学有参考意义

diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java
index 12901ba..6d4e6fa 100755
--- a/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -2572,7 +2572,7 @@ public class PackageManagerService extends IPackageManager.Stub {
// NOTE: We ignore potential failures here during a system scan (like
// the rest of the commands above) because there's precious little we
// can do about it. A settings error is reported, though.
-                adjustCpuAbisForSharedUserLPw(setting.packages, null /* scanned package */,
+                adjustCpuAbisForSharedUserLPw(setting.sameProcessPackages, null /* scanned package */,
false /* boot complete */);
             }

@@ -7222,12 +7222,18 @@ public class PackageManagerService extends IPackageManager.Stub {
     }

private static String fixProcessName(String defProcessName,
-            String processName, int uid)
 
{
-        if (processName == null) {
-            return defProcessName;
-        }
-        return processName;
-    }
+        String processName,PackageSetting ps) {
+            String returnName = processName;
+            if (returnName == null) {
+                returnName =  defProcessName;
+            }
+            if (returnName!=null && returnName.equals("system")) {
+                if (ps!=null && ps.sharedUser != null)
+                ps.sharedUser.addSameProcessPackage(ps);
+            }
+        return returnName;
+        }
+    

private void verifySignaturesLP(PackageSetting pkgSetting, PackageParser.Package pkg)
throws PackageManagerException 
{
@@ -8508,7 +8514,7 @@ public class PackageManagerService extends IPackageManager.Stub {
         pkg.applicationInfo.processName = fixProcessName(
                 pkg.applicationInfo.packageName,
                 pkg.applicationInfo.processName,
-                pkg.applicationInfo.uid);
+                pkgSetting);

if (pkg != mPlatformPackage) {
// Get all of our default paths setup
@@ -8774,7 +8780,7 @@ public class PackageManagerService extends IPackageManager.Stub {
for (i=0; i<N; i++) {
                 PackageParser.Provider p = pkg.providers.get(i);
                 p.info.processName = fixProcessName(pkg.applicationInfo.processName,
-                        p.info.processName, pkg.applicationInfo.uid);
+                        p.info.processName,(PackageSetting)pkg.mExtras);
                 mProviders.addProvider(p);
                 p.syncable = p.info.isSyncable;
if (p.info.authority != null) {
@@ -8833,7 +8839,7 @@ public class PackageManagerService extends IPackageManager.Stub {
for (i=0; i<N; i++) {
                 PackageParser.Service s = pkg.services.get(i);
                 s.info.processName = fixProcessName(pkg.applicationInfo.processName,
-                        s.info.processName, pkg.applicationInfo.uid);
+                        s.info.processName,(PackageSetting)pkg.mExtras);
                 mServices.addService(s);
if ((policyFlags&PackageParser.PARSE_CHATTY) != 0) {
if (r == null) {
@@ -8853,7 +8859,7 @@ public class PackageManagerService extends IPackageManager.Stub {
for (i=0; i<N; i++) {
                 PackageParser.Activity a = pkg.receivers.get(i);
                 a.info.processName = fixProcessName(pkg.applicationInfo.processName,
-                        a.info.processName, pkg.applicationInfo.uid);
+                        a.info.processName,(PackageSetting)pkg.mExtras);
                 mReceivers.addActivity(a, "receiver");
if ((policyFlags&PackageParser.PARSE_CHATTY) != 0) {
if (r == null) {
@@ -8873,7 +8879,7 @@ public class PackageManagerService extends IPackageManager.Stub {
for (i=0; i<N; i++) {
                 PackageParser.Activity a = pkg.activities.get(i);
                 a.info.processName = fixProcessName(pkg.applicationInfo.processName,
-                        a.info.processName, pkg.applicationInfo.uid);
+                        a.info.processName,(PackageSetting)pkg.mExtras);
                 mActivities.addActivity(a, "activity");
if ((policyFlags&PackageParser.PARSE_CHATTY) != 0) {
if (r == null) {
diff --git a/services/core/java/com/android/server/pm/SharedUserSetting.java b/services/core/java/com/android/server/pm/SharedUserSetting.java
old mode 100644
new mode 100755
index 06e020a..01897fb
--- a/services/core/java/com/android/server/pm/SharedUserSetting.java
+++ b/services/core/java/com/android/server/pm/SharedUserSetting.java
@@ -31,6 +31,7 @@ final class SharedUserSetting extends SettingBase {
int uidPrivateFlags;

final ArraySet<PackageSetting> packages = new ArraySet<PackageSetting>();
+    final ArraySet<PackageSetting> sameProcessPackages = new ArraySet<PackageSetting>();

final PackageSignatures signatures = new PackageSignatures();

@@ -66,7 +67,11 @@ final class SharedUserSetting extends SettingBase {
             }
         }
     }
-
+    
+    void addSameProcessPackage(PackageSetting packageSetting) {
+        sameProcessPackages.add(packageSetting);
+    }
+        
void addPackage(PackageSetting packageSetting) {
if (packages.add(packageSetting)) {
             setFlags(this.pkgFlags | packageSetting.pkgFlags);


7

参考我之前的文章
还有一些尝试方法还没有论证,喜欢研究的同学可以继续跟进
至于为何有同一个uid需要运行位数一致,大神找到了这样的解释

Adjust instruction sets for shared UID apps.

Since shared UID apps are run in the same process,
we'll need to make sure they're compiled for the same
instruction set.



640?wx_fmt=png


640?wx_fmt=png


640?wx_fmt=png




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/468712.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

送书送书送书,(包邮)送,仅此而已!

亲爱的各位fans们&#xff0c;大家好&#xff0c;这次小编联合5个公众号朋友一起送书&#xff0c;一共送出 6本&#xff0c;当然包邮&#xff01;感谢本次活动的赞助商北京大学出版社。6个公众号联合送书&#xff0c;一共6本书&#xff0c;每个公众号送1本(包邮)。 6个公众号同…

requests 获取div_爬虫系列第五篇 使用requests与BeautifulSoup爬取豆瓣图书Top250

上一篇我们学习了BeautifulSoup的基本用法&#xff0c;本节我们使用它来爬取豆瓣图书Top250。一、网页分析我们爬取的网页的url是https://book.douban.com/top250?icnindex-book250-all。首页如图与豆瓣电影Top250差不多&#xff0c;将页面拉到最底部&#xff0c;可以看到分页…

python--socket套接字/TCP

socket套接字/TCP 一 客户端/服务器架构 C/S架构&#xff0c;包括 硬件C/S架构&#xff08;打印机&#xff09;软件C/S 架构&#xff08;web服务&#xff09;C/S架构的软件&#xff08;软件属于应用层&#xff09;是基于网络进行通信的Server端要&#xff1a; 1.力求一直提供服…

uniapp封装网络请求_八张图带你走进“通过一个完美请求封装一个网络模块”

本文提供视频课程讲解&#xff0c;需要的小伙伴可以点赞私信‘’网络模块‘’前往领取学习大纲1、网络模块在应用中的地位1.1当今占统治地位的网络组件OKHttp OkHttp 是一个相对成熟的解决方案&#xff0c;据说 Android4.4 的源码中可以看到 HttpURLConnection 已经替换成 OkHt…

毕业的这0111年

1.2004年&#xff0c;不知道大家对这个时间有没有感觉&#xff0c;那几年我正在读高中&#xff0c;韩寒的《三重门》席卷校园&#xff0c;同样还有郭敬明的《夏至未至》。那时候的我&#xff0c;还挣扎在温饱阶段&#xff0c;我每天吃饭的时候都想上食堂的三楼吃风味&#xff0…

我的互助小蜜圈

写在前面 从不久之前到现在&#xff0c;我的微信公众号从一个小小小阶段到了另一个小小阶段&#xff0c;非常感谢各位读者对我的信任和支持&#xff0c;当然我也是非常用心的维护这这群大佬&#xff0c;时刻想着怎样给各位大佬做好服务 &#xff0c;比如我正在溜娃&#xff0c…

比较两个表格的不同_两表数据的核对,WPS表格似乎更加方便容易

在EXCEL中的两个表格的数据对比&#xff0c;可能使用的方法会采用到查询语句&#xff0c;VBA之类的。显得在使用的过程显得有些复杂。在不经间发现WPS表格的功能处理此类的问题显得就比较的简单的多。查看并标识出分数相同的内容如下面的分数表&#xff0c;选择分数栏的范围&am…

我的知识小密圈

写在前面从不久之前到现在&#xff0c;我的微信公众号从一个小小小阶段到了另一个小小阶段&#xff0c;非常感谢各位读者对我的信任和支持&#xff0c;当然我也是非常用心的维护这这群朋友&#xff0c;时刻想着怎样给大家做好服务 &#xff0c;比如我正在溜娃&#xff0c;隔断时…

vk_down 每次下翻丙行 c++_笔记本接口不够用?不妨试试这款Type-C拓展坞,给你7个接口用...

随着笔记本电脑越来越轻薄化&#xff0c;已经很难再布局较多的数据接口了&#xff0c;但是在办公等环境下总是需要这些接口来满足需求。就拿小新个人来说&#xff0c;使用的是小米笔记本12.5寸款的&#xff0c;该款笔记本仅有三个接口&#xff0c;分别是全功能 USB-C 接口 x 1、…

学习,才是最好的投资~

推荐语&#xff1a;我因为王小波常说而喜欢的英国哲学家罗素的一句话&#xff1a; 参差多态乃是幸福的本源。正是因为有了多种多样的行业&#xff0c;才使得我们的职业也是多种多样&#xff0c;行行出大牛&#xff01;这个世界天生就注定有人搞互联网的&#xff0c;Linux&#…

第二百四十八节,Bootstrap轮播插件

Bootstrap轮播插件 学习要点&#xff1a; 1.轮播插件 本节课我们主要学习一下 Bootstrap 中的轮播插件。 一&#xff0e;轮播 轮播插件就是将几张同等大小的大图&#xff0c;按照顺序依次播放。 基本实例。 第一步&#xff0c;给轮播器区域div设置一个id给轮播器区域div设置样…

xgboost分类_XGBoost(Extreme Gradient Boosting)

一、XGBoost在Ensemble Learning中的位置机器学习中&#xff0c;有一类算法叫集成学习&#xff08;Ensemble Learning&#xff09;&#xff0c;所谓集成学习&#xff0c;指将多个分类器的预测结果集成起来&#xff0c;作为最终预测结果&#xff0c;它要求每个分类器具备一定的“…

Android技术架构演进与未来

本文阅读大约需15分钟 引言众所周知&#xff0c;Android是谷歌开发的一款基于Linux的开源操作系统&#xff0c;每年迭代一次大版本升级。 小米、华为、OPPO、VIVO、三星等各大厂商对Android原生系统进行二次开发衍生出具有各家特色的系统&#xff08;比如MIUI&#xff09;&…

Hibernate_1_配置文件详解_基础案例_Hibernate工具类_API详解_持久化类编写规则

Hibernate( ORM框架 ) Hibernate是一个数据持久化层的ORM框架. 它通过JavaBean, 数据库中的表与自身的映射关系达到表中数据的增删改查 特性 1.对JDBC访问数据库的代码进行封装, 简化数据访问的重复性代码 2.使用反射机制完成对Bean的封装 3.轻量级框架,支持关系型数据库 核…

建筑电气工程设计常用图形和文字符号_建筑水电图纸看不懂?10年老师傅教你看图技巧,分分钟安排...

1、建筑给排水工程包括&#xff1a;给水、排水、热水、消火栓、自动喷淋等常用系统&#xff0c;其管道当中流动的是水。(其管道输送介质为水)2、给排水系统的主要功能&#xff1a;(1)建筑给水系统的任务&#xff0c;就是经济合理地将水由室外给水管网输送到装置在室内的各种配水…

Android系统架构开篇

Android系统庞大且错综复杂&#xff0c;Gityuan带领大家初探Android系统整体架构&#xff0c;一窥其全貌。一、引言本文作为Android系统架构的开篇&#xff0c;起到提纲挈领的作用&#xff0c;从系统整体架构角度概要讲解Android系统的核心技术点&#xff0c;带领大家初探Andro…

20155220 实验三 敏捷开发与XP实践 实验报告

20155220 实验三 敏捷开发与XP实践 实验报告 实验内容 XP基础XP核心实践相关工具实验要求 没有Linux基础的同学建议先学习《Linux基础入门&#xff08;新版&#xff09;》《Vim编辑器》 课程完成实验、撰写实验报告&#xff0c;实验报告以博客方式发表在博客园&#xff0c;注意…

Android binder 框架和学习资料

&#xff11;Android binder 是学习 Android 系统一定要啃得硬骨头&#xff0c;可能你刚开始的时候并不理解其中的精髓&#xff0c;但是在 android 系统的很多地方你都会遇到它。不过要我自己写明白其中的逻辑脉络需要花费太多的时间和精力&#xff0c;而且传播效果也不是非常好…

Spring_Bean配置_生命周期_注解

Spring Spring是一个开源框架&#xff0c;Spring是于2003 年兴起的一个轻量级的Java 开发框架&#xff0c;由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之…

完全理解Gson(1):简单入门

GSON是Google开发的Java API&#xff0c;用于转换Java对象和Json对象。本文讨论并提供了使用API的简单代码示例。更多关于GSON的API可以访问&#xff1a;http://sites.google.com/site/gson/. 本文是GSON系列文章的第一篇。本文是其他文章的基础&#xff0c;因此不需要任何GSON…