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位,保存成文件后查找里面對應的包名,就可以看到對應應用的信息。
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.javaindex?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.
總結
以上是生活随笔為你收集整理的android 7.1 apk的systemuid相同导致问题[2]的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 学习日记:类模板
- 下一篇: 我要转行,考CPDA数据分析师证书有哪些
