android 7.1 apk的systemuid [2]
1
上周發的一篇文章《android 7.1 apk的systemuid和系統應用Setting相同導致開機找不到庫的問題》,然后有個小伙伴找我討論了,覺得自己的腦洞了打開了很多,所以針對這個問題再次做一次總結,如果大家有好的建議也可以在文末留言。
2
先說一個命令 adb shell dumpsys package p > dumpsys_p ,這個命令可以查看apk的一些狀態,包括apk屬于32位還是64位,保存成文件后查找里面對應的包名,就可以看到對應應用的信息。
 
 看到primaryCpuAbi=arm64-v8a,說明我們的settings應用是64位的。
3
我們先是分析了出現問題時候的Settings,我們用原來的固件復現問題,在出現問題的時候用上面的命令查看,發現Settings已經變成了32位。
Package [com.android.settings] (27afcae): 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-v7a4
上篇文章提到,我們報錯是因為沒有找到庫文件,還有下面的日志引起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
參考我之前的文章
 https://blog.csdn.net/weiqifa0/article/details/88432165
 還有一些嘗試方法還沒有論證,喜歡研究的同學可以繼續跟進
 至于為何有同一個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.歡迎加我的微信公眾號/嵌入式Linux ,歡迎跟我討論各種問題,人生,籃球,職業生涯 and so on…
總結
以上是生活随笔為你收集整理的android 7.1 apk的systemuid [2]的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 富勒wms系统里的定时器id_「案例」全
- 下一篇: 2022年深圳数据分析师推荐考这个证书-
