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,一经查实,立即删除!

相关文章

uasset python_Unreal Python 结合 C++ 开发蓝图库插件

本文章转载自 智伤帝的个人博客 - 原文链接前言上个月的这个时候我写了一篇文章关于如何嵌入 PySide 调用 Qt 的 GUI 开发。 链接Python 虽然很好&#xff0c;但是有些功能&#xff0c;并没有从 C 里面暴露出来。这种情况就需要通过 C 的蓝图开发来将这部分的功能进行暴露。这样…

设计模式_2_单例模式

单例模式 单例模式(创建型模式): 涉及到的单一的类,该类只负责自己对象的创建,并且只有单个对象被创建,提供唯一的对象访问方式,可直接访问 注: 只能有一个实例作为全局的访问点, 构造函数私有单例类只能自己创建自己唯一的实例, 必须给所有其他对象提供这一实例; !!!使用syn…

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

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

Java多线程_1_Java内存模型_内存模型的3大特性

Java内存模型: 内存分布情况及其关系: 主内存:Java内存模型规定所有的变量都保存在主内存中 工作内存:每个线程都有自己的工作内存,保存了该线程使用到的变量的主内存副本拷贝 主内存与工作内存的关系: 线程对变量的所有操作都必须在自己的工作内存中进行,不能直接读写主内存…

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…

luogu P1046 陶陶摘苹果

二次联通门 : luoguP1046 /*这个题好难.....由苹果树可知这应该是个树结构的题所以很自然的想到了用树链剖分来搞一下连边 最后查询以1为根节点的子树的权值和...从前闲的没事写着玩... */ #include <cstdio> #define Max 3300void read (int &now) {now 0;char wor…

毕业的这0111年

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

Struts2_4_ActionMap与ValueStack详解_Struct2的EL及常用标签_防止表单数据重复提交

接着Struts2_3_day的讲 注:使用Struts2的< s:debug>< /s:debug>就可获取数据储存的分布图 StrutsPrepareAndExecuteFilter都会创建一个ActionContext和ValueStack对象, 所以Struts2的数据存储分为两类: ActionMap(contextMap)以及ValueStack; ActionMap中都是以m…

python快递代取系统_代取快递的变现方式,校园跑腿的经营范围有多大?

原标题&#xff1a;代取快递的变现方式&#xff0c;校园跑腿的经营范围有多大&#xff1f;进入大学&#xff0c;随着越来越多的学生加入到网购的行列。快递在学校也是堆积成山&#xff0c;高校校园快递市场也日渐红火。但往往带来的也有更多的麻烦&#xff0c;学生取快递时间变…

java 空指针异常之一。 新建的一个对象没有NEW 导致其SET属性时报错

代码&#xff1a; //会报错 Lendbook lbk;//不会报错 Lendbook lbknew Lendbook();//在这里报错lbk.setLenddate(new Date());lbk.setPersoncode(personcode);lbk.setPersonname(personname); 转载于:https://www.cnblogs.com/Ychao/p/6811648.html

我的互助小蜜圈

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

设计模式_3_建造者模式

建造者模式(BuilderPattern) 内在的核心问题就是: 使用多个简单对象根据一种组合关系构造一个我们想要的复杂对象, 属于创建型模式 建造者模式的角色关系 建造者模式中总共有两种角色: 1.建造者: 负责建造每个基本组件 2.指挥者: 将建造者建造好的基本组件按照某种组合关系进…

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

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

6递归

1 /*2 递归函数:3 函数自己调用自己就叫递归函数4 递归可以实现循环5 递归是神,迭代是人(迭代循环)6 缺点:需要暂存大量的数据,递归次数太多会占用大量内存空间7 8 递归和迭代的区别9 迭代是循环结构 10 递归是选择结…

我的知识小密圈

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

设计模式_4_原型模式(对象的拷贝)

原形模式(PrototypePattern, 创建型模式,创建重复对象且保证性能, 对象的克隆) 通常使用原型模式创建一个原型接口, 用于获取创建对象的克隆, 对于浅拷贝与深拷贝不用纠结, 他们二者的区别就在于重写Clonable的clone方法 浅拷贝与深拷贝 浅拷贝: 直接调用Object的clone pub…

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

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

学习,才是最好的投资~

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