Android 64位机器system app兼容32位apk问题分析(共享system uid )

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lb5761311/article/details/90291477

rk3399 是一款基于arm64的机器,我们这边一款产品是基于rk3399 Android 7.1版本的开发,我们的 vtest.apk包含多个so,在正常userdebug模式下不会出现兼容性问题,如果切换到user版本就会出现概率性崩溃的问题。并且崩溃不是vtest.apk而且其他system apk 比如StressTest、 keychain、exchange等apk 概率性崩溃。
首先明确一些系统,StressTest、 keychain、exchange都是系统 app 并且签名都是platform
vtest.apk (com.deepblue.vehicle)也是系统签app ,预制到系统中的。并且包含多个32位的so

Stresstest崩溃主要信息如下:

08:50:14.752   581   581 I Lights Hal: >>> undefine light id
01-18 08:50:14.753   581   581 I SystemServiceManager: Starting com.android.server.display.DisplayManagerService
01-18 08:50:14.757   581   581 I SystemServiceManager: Starting phase 100
01-18 08:50:14.770   581   601 I DisplayManagerService: Display device added: DisplayDeviceInfo{"Built-in Screen": uniqueId="local:0", 400 x 400, modeId 1, defaultModeId 1, supportedModes [{id=1, width=400, height=400, fps=57.000004}], colorMode 0, supportedColorModes [0], HdrCapabilities android.view.Display$HdrCapabilities@a69d6308, density 160, 213.0 x 213.0 dpi, appVsyncOff 1000000, presDeadline 17543859, touch INTERNAL, rotation 0, type BUILT_IN, state UNKNOWN, FLAG_DEFAULT_DISPLAY, FLAG_ROTATES_WITH_CONTENT, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS}
01-18 08:50:14.771   205   205 D SurfaceFlinger: Set power mode=2, type=0 flinger=0x7758a48000
01-18 08:50:14.771   205   205 D SurfaceFlinger: Screen type=0 is already mode=2
01-18 08:50:14.772   581   581 I SystemServer: StartPackageManagerService
01-18 08:50:14.772   581   601 I DisplayManagerService: Display device added: DisplayDeviceInfo{"HDMI Screen": uniqueId="local:1", 1920 x 1080, modeId 2, defaultModeId 2, supportedModes [{id=2, width=1920, height=1080, fps=60.000004}], colorMode 0, supportedColorModes [0], HdrCapabilities android.view.Display$HdrCapabilities@a69d6308, density 320, 320.0 x 320.0 dpi, appVsyncOff 1000000, presDeadline 16666666, touch EXTERNAL, rotation 0, type HDMI, state UNKNOWN, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_PRESENTATION}
01-18 08:50:14.773   205   205 D SurfaceFlinger: Set power mode=2, type=1 flinger=0x7758a48000
01-18 08:50:14.773   205   205 D SurfaceFlinger: Screen type=1 is already mode=2
01-18 08:50:14.773   581   601 I DisplayManagerService: Display device changed state: "Built-in Screen", ON
01-18 08:50:14.774   581   601 I DisplayManagerService: Display device changed state: "HDMI Screen", ON
01-18 08:50:14.797   581   581 W SystemConfig: No directory /system/etc/sysconfig, skipping
01-18 08:50:14.816   581   581 D SELinuxMMAC: Using policy file /system/etc/security/mac_permissions.xml
01-18 08:50:14.892   581   581 E art     : DexFile_getDexOptNeeded file '/system/framework/org.apache.http.legacy.jar' does not exist
01-18 08:50:14.892   581   581 W PackageManager: Library not found: /system/framework/org.apache.http.legacy.jar
01-18 08:50:14.903   581   581 E art     : DexFile_getDexOptNeeded file '/system/framework/org.apache.http.legacy.jar' does not exist
01-18 08:50:14.903   581   581 W PackageManager: Library not found: /system/framework/org.apache.http.legacy.jar
01-18 08:50:14.906   581   581 D PackageManager: No files in app dir /vendor/overlay
01-18 08:50:14.910   581   581 W PackageManager: Failed to parse /system/framework/arm: Missing base APK in /system/framework/arm
01-18 08:50:14.911   581   581 W PackageManager: Failed to parse /system/framework/arm64: Missing base APK in /system/framework/arm64
01-18 08:50:14.937   581   581 W PackageManager: Failed to parse /system/framework/oat: Missing base APK in /system/framework/oat
01-18 08:50:14.976   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:14.980   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.WRITE_SETTINGS in package: com.rockchip.devicetest at: Binary XML file line #27
01-18 08:50:14.980   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.ACCESS_FINE_LOCATION in package: com.rockchip.devicetest at: Binary XML file line #28
01-18 08:50:14.980   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.WRITE_SETTINGS in package: com.rockchip.devicetest at: Binary XML file line #34
01-18 08:50:14.980   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.GET_TASKS in package: com.rockchip.devicetest at: Binary XML file line #46
01-18 08:50:14.981   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.INTERACT_ACROSS_USERS_FULL in package: com.rockchip.devicetest at: Binary XML file line #55
01-18 08:50:14.981   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.FORCE_STOP_PACKAGES in package: com.rockchip.devicetest at: Binary XML file line #59
01-18 08:50:14.982   581   581 I PackageManager: /system/priv-app/DeviceTest changed; collecting certs
01-18 08:50:15.027   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.077   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.105   581   581 W PackageManager: Failed to parse /system/priv-app/DeviceTest: Signature mismatch for shared user: SharedUserSetting{da03d3d android.uid.system/1000}
01-18 08:50:15.122   581   581 W PackageManager: Permission android.permission.DOWNLOAD_WITHOUT_NOTIFICATION from package com.android.providers.downloads in an unknown group android.permission-group.NETWORK
01-18 08:50:15.127   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.178   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.228   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.238   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.USE_CREDENTIALS in package: com.android.settings at: Binary XML file line #56
01-18 08:50:15.238   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.READ_SYNC_SETTINGS in package: com.android.settings at: Binary XML file line #61
01-18 08:50:15.238   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.WRITE_SYNC_SETTINGS in package: com.android.settings at: Binary XML file line #62
01-18 08:50:15.256   581   581 W PackageParser: No actions in intent filter at /system/priv-app/Settings/Settings.apk Binary XML file line #3212
01-18 08:50:15.272   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.INSTALL_GRANT_RUNTIME_PERMISSIONS in package: com.android.shell at: Binary XML file line #102
01-18 08:50:15.279   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.306   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.CONFIGURE_WIFI_DISPLAY in package: com.android.systemui at: Binary XML file line #123
01-18 08:50:15.329   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.365   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.READ_CONTACTS in package: com.android.bluetooth at: Binary XML file line #61
01-18 08:50:15.367   581   581 W PackageParser: No actions in intent filter at /system/app/Bluetooth/Bluetooth.apk Binary XML file line #223
01-18 08:50:15.379   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.400   581   581 W PackageManager: Non-privileged app; cap priority to 0; package: com.android.cts.ctsshim activity: com.android.cts.ctsshim.InstallPriority origPrio: 100
01-18 08:50:15.400   581   581 W PackageManager: Non-privileged app; cap priority to 0; package: com.android.cts.ctsshim activity: com.android.cts.ctsshim.InstallPriority origPrio: 100
01-18 08:50:15.400   581   581 W PackageManager: Non-privileged app; cap priority to 0; package: com.android.cts.ctsshim activity: com.android.cts.ctsshim.InstallPriority origPrio: 100
01-18 08:50:15.400   581   581 W PackageManager: Non-privileged app; cap priority to 0; package: com.android.cts.ctsshim activity: com.android.cts.ctsshim.InstallPriority origPrio: 100
01-18 08:50:15.400   581   581 W PackageManager: Non-privileged app; cap priority to 0; package: com.android.cts.ctsshim activity: com.android.cts.ctsshim.InstallPriority origPrio: 100
01-18 08:50:15.430   581   581 W PackageParser: Unknown element under <application>: permission at /system/app/Gallery2/Gallery2.apk Binary XML file line #245
01-18 08:50:15.430   581   581 W PackageParser: Unknown element under <application>: permission at /system/app/Gallery2/Gallery2.apk Binary XML file line #248
01-18 08:50:15.430   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.459   581   581 W PackageManager: Permission com.android.launcher3.permission.READ_SETTINGS from package com.android.launcher3 in an unknown group android.permission-group.SYSTEM_TOOLS
01-18 08:50:15.459   581   581 W PackageManager: Permission com.android.launcher3.permission.WRITE_SETTINGS from package com.android.launcher3 in an unknown group android.permission-group.SYSTEM_TOOLS
01-18 08:50:15.459   581   581 W PackageManager: Permission com.android.launcher.permission.INSTALL_SHORTCUT from package com.android.launcher3 in an unknown group android.permission-group.SYSTEM_TOOLS
01-18 08:50:15.467   581   581 W PackageParser: Unknown element under <manifest>: meta-data at /system/app/Lightning/Lightning.apk Binary XML file line #32
01-18 08:50:15.480   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.508   581   581 W PackageParser: Unknown element under <intent-filter>: categary at /system/app/RFTestTool/RFTestTool.apk Binary XML file line #18
01-18 08:50:15.514   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.WRITE_SETTINGS in package: com.rockchip.devicetest at: Binary XML file line #23
01-18 08:50:15.514   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.ACCESS_FINE_LOCATION in package: com.rockchip.devicetest at: Binary XML file line #24
01-18 08:50:15.514   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.WRITE_SETTINGS in package: com.rockchip.devicetest at: Binary XML file line #30
01-18 08:50:15.514   581   581 I PackageManager: /system/app/RKDeviceTest changed; collecting certs
01-18 08:50:15.522   581   581 W PackageManager: Failed to parse /system/app/RKDeviceTest: Signature mismatch for shared user: SharedUserSetting{da03d3d android.uid.system/1000}
01-18 08:50:15.527   581   581 I PackageManager: /system/app/RKUpdateService changed; collecting certs
01-18 08:50:15.530   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.536   581   581 W PackageManager: Failed to parse /system/app/RKUpdateService: Signature mismatch for shared user: SharedUserSetting{da03d3d android.uid.system/1000}
01-18 08:50:15.541   581   581 W PackageParser: Ignoring duplicate uses-permissions/uses-permissions-sdk-m: android.permission.DEVICE_POWER in package: android.rk.RockVideoPlayer at: Binary XML file line #25
01-18 08:50:15.581   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.591   581   581 I PackageManager: /system/app/WifiDisplay changed; collecting certs
01-18 08:50:15.595   581   581 W PackageManager: Failed to parse /system/app/WifiDisplay: Signature mismatch for shared user: SharedUserSetting{da03d3d android.uid.system/1000}
01-18 08:50:15.628   581   581 D PackageManager: No files in app dir /system/vendor/app
01-18 08:50:15.628   581   581 D PackageManager: No files in app dir /oem/app
01-18 08:50:15.628   581   581 D PackageManager: No files in app dir /system/vendor/bundled_uninstall_gone-app
01-18 08:50:15.628   581   581 D PackageManager: No files in app dir /system/vendor/bundled_uninstall_back-app
01-18 08:50:15.628   581   581 D PackageManager: No files in app dir /system/vendor/bundled_persist-app
01-18 08:50:15.631   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.637   581   581 I SELinux : SELinux: Loaded file_contexts contexts from /file_contexts.bin.
01-18 08:50:15.637   581   581 D PackageManager: No files in app dir /data/app-private
01-18 08:50:15.637   581   581 D PackageManager: No files in app dir /data/app-ephemeral
01-18 08:50:15.638   581   581 E PackageManager: There should probably be exactly one storage manager; found 0: matches=[]
01-18 08:50:15.638   581   581 W PackageManager: Protected action; cap priority to 0; package: com.android.cts.priv.ctsshim activity: com.android.cts.priv.ctsshim.InstallPriority origPrio: 100
01-18 08:50:15.639   581   581 W PackageManager: Protected action; cap priority to 0; package: com.android.cts.priv.ctsshim activity: com.android.cts.priv.ctsshim.InstallPriority origPrio: 100
01-18 08:50:15.639   581   581 W PackageManager: Protected action; cap priority to 0; package: com.android.cts.priv.ctsshim activity: com.android.cts.priv.ctsshim.InstallPriority origPrio: 100
01-18 08:50:15.639   581   581 W PackageManager: Protected action; cap priority to 0; package: com.android.cts.priv.ctsshim activity: com.android.cts.priv.ctsshim.InstallPriority origPrio: 100
01-18 08:50:15.639   581   581 W PackageManager: Protected action; cap priority to 0; package: com.android.packageinstaller activity: com.android.packageinstaller.PackageInstallerActivity origPrio: 1
01-18 08:50:15.639   581   581 W PackageManager: Package com.android.gallery3d desires unavailable shared library com.google.android.media.effects; ignoring!
01-18 08:50:15.639   581   581 W PackageManager: Package com.android.gallery3d desires unavailable shared library com.google.android.media.effects; ignoring!
01-18 08:50:15.639   581   581 W PackageManager: Instruction set mismatch, PackageSetting{43b7562 com.deepblue.vehicle/1000} requires arm whereas PackageSetting{7a24eba com.rockchips.mediacenter/1000} requires arm64
01-18 08:50:15.639   581   581 W PackageManager: Instruction set mismatch, PackageSetting{43b7562 com.deepblue.vehicle/1000} requires arm whereas PackageSetting{b1096dc android/1000} requires arm64
01-18 08:50:15.639   581   581 W PackageManager: Instruction set mismatch, PackageSetting{43b7562 com.deepblue.vehicle/1000} requires arm whereas PackageSetting{d96e574 com.android.settings/1000} requires arm64
01-18 08:50:15.639   581   581 I PackageManager: Adjusting ABI for com.android.soundrecorder to armeabi-v7a (requirer=com.deepblue.vehicle, scannedPackage=null)
01-18 08:50:15.639   581   581 I PackageManager: Adjusting ABI for com.android.keychain to armeabi-v7a (requirer=com.deepblue.vehicle, scannedPackage=null)
01-18 08:50:15.640   581   581 I PackageManager: Adjusting ABI for com.android.rk to armeabi-v7a (requirer=com.deepblue.vehicle, scannedPackage=null)
01-18 08:50:15.640   581   581 I PackageManager: Adjusting ABI for com.android.location.fused to armeabi-v7a (requirer=com.deepblue.vehicle, scannedPackage=null)
01-18 08:50:15.640   581   581 I PackageManager: Adjusting ABI for com.cghs.stresstest to armeabi-v7a (requirer=com.deepblue.vehicle, scannedPackage=null)
01-18 08:50:15.641   581   581 I PackageManager: Adjusting ABI for com.example.changeled to armeabi-v7a (requirer=com.deepblue.vehicle, scannedPackage=null)
01-18 08:50:15.641   581   581 I PackageManager: Adjusting ABI for com.deepblue.systemupdate to armeabi-v7a (requirer=com.deepblue.vehicle, scannedPackage=null)
01-18 08:50:15.641   581   581 I PackageManager: Adjusting ABI for com.android.wallpaperbackup to armeabi-v7a (requirer=com.deepblue.vehicle, scannedPackage=null)
01-18 08:50:15.641   581   581 I PackageManager: Adjusting ABI for com.android.providers.settings to armeabi-v7a (requirer=com.deepblue.vehicle, scannedPackage=null)
01-18 08:50:15.642   581   581 I PackageManager: Adjusting ABI for com.android.inputdevices to armeabi-v7a (requirer=com.deepblue.vehicle, scannedPackage=null)
01-18 08:50:15.642   581   581 I PackageManager: Adjusting ABI for com.android.server.telecom to armeabi-v7a (requirer=com.deepblue.vehicle, scannedPackage=null)
01-18 08:50:15.644   581   581 I PackageManager: Time to scan packages: 0.764 seconds
01-18 08:50:15.644   581   581 W PackageManager: Unknown permission android.permission.ACCESS_ALL_EXTERNAL_STORAGE in package com.example.changeled
01-18 08:50:15.645   581   581 W PackageManager: Unknown permission com.google.android.googleapps.permission.GOOGLE_AUTH in package com.android.providers.calendar
01-18 08:50:15.645   581   581 W PackageManager: Unknown permission com.google.android.googleapps.permission.GOOGLE_AUTH.cl in package com.android.providers.calendar
01-18 08:50:15.645   581   581 W PackageManager: Not granting permission android.permission.GLOBAL_SEARCH to package com.android.quicksearchbox (protectionLevel=18 flags=0x3808be45)
01-18 08:50:15.645   581   581 W PackageManager: Not granting permission android.permission.WRITE_EXTERNAL_STORAGE to package com.deepblue.systemupdate because it was previously installed without
01-18 08:50:15.645   581   581 W PackageManager: Not granting permission android.permission.READ_EXTERNAL_STORAGE to package com.deepblue.systemupdate because it was previously installed without
01-18 08:50:15.645   581   581 W PackageManager: Unknown permission com.android.launcher.permission.READ_SETTINGS in package com.android.launcher3
01-18 08:50:15.645   581   581 W PackageManager: Unknown permission com.android.launcher.permission.WRITE_SETTINGS in package com.android.launcher3
01-18 08:50:15.645   581   581 W PackageManager: Not granting permission android.permission.BIND_APPWIDGET to package com.android.launcher3 (protectionLevel=18 flags=0x3c4bbe45)
01-18 08:50:15.645   581   581 W PackageManager: Unknown permission android.permission.READ_SETTINGS in package com.android.apkinstaller
01-18 08:50:15.645   581   581 W PackageManager: Not granting permission android.permission.WRITE_MEDIA_STORAGE to package com.android.apkinstaller (protectionLevel=18 flags=0x3808be45)
01-18 08:50:15.645   581   581 W PackageManager: Not granting permission android.permission.COPY_PROTECTED_DATA to package com.android.apkinstaller (protectionLevel=2 flags=0x3808be45)
01-18 08:50:15.645   581   581 W PackageManager: Not granting permission android.permission.INSTALL_PACKAGES to package com.android.apkinstaller (protectionLevel=18 flags=0x3808be45)
01-18 08:50:15.645   581   581 W PackageManager: Not granting permission android.permission.DELETE_PACKAGES to package com.android.apkinstaller (protectionLevel=18 flags=0x3808be45)
01-18 08:50:15.645   581   581 W PackageManager: Unknown permission com.rockchips.mediacenter.localscan.PROTECT in package com.rockchips.mediacenter
01-18 08:50:15.645   581   581 W PackageManager: Unknown permission com.rockchips.android.airsharing.PROTECT in package com.rockchips.mediacenter
01-18 08:50:15.645   581   581 W PackageManager: Unknown permission com.android.permission.airsharing_play_interface in package com.rockchips.mediacenter
01-18 08:50:15.645   581   581 W PackageManager: Unknown permission com.android.permission.airsharing_mediabrowser_interface in package com.rockchips.mediacenter
01-18 08:50:15.645   581   581 W PackageManager: Unknown permission com.rockchips.mediacenter.dlna_server in package com.rockchips.mediacenter
01-18 08:50:15.645   581   581 W PackageManager: Unknown permission com.rockchips.mediacenter.localscan_server in package com.rockchips.mediacenter
01-18 08:50:15.645   581   581 W PackageManager: Unknown permission com.android.rockchips.permission.MEDIACENTER_SEND_RECV in package com.rockchips.mediacenter
01-18 08:50:15.645   581   581 W PackageManager: Unknown permission android.permission.ACCESS_SUPERUSER in package com.rockchips.mediacenter
01-18 08:50:15.646   581   581 W PackageManager: Unknown permission com.google.android.permission.INSTALL_WEARABLE_PACKAGES in package com.android.packageinstaller
01-18 08:50:15.646   581   581 W PackageManager: Not granting permission android.permission.DELETE_PACKAGES to package com.svox.pico (protectionLevel=18 flags=0x3808be45)
01-18 08:50:15.646   581   581 W PackageManager: Unknown permission com.google.android.googleapps.permission.GOOGLE_AUTH in package com.android.settings
01-18 08:50:15.646   581   581 W PackageManager: Unknown permission com.android.launcher.permission.READ_SETTINGS in package com.android.settings
01-18 08:50:15.646   581   581 W PackageManager: Unknown permission com.android.launcher.permission.WRITE_SETTINGS in package com.android.settings
01-18 08:50:15.646   581   581 W PackageManager: Unknown permission com.google.android.providers.gsf.permission.READ_GSERVICES in package com.google.android.apps.wallpaper
01-18 08:50:15.646   581   581 W PackageManager: Unknown permission com.android.smspush.WAPPUSH_MANAGER_BIND in package com.android.phone
01-18 08:50:15.647   581   581 W PackageManager: Unknown permission com.google.android.gallery3d.permission.GALLERY_PROVIDER in package com.android.bluetooth
01-18 08:50:15.647   581   581 W PackageManager: Not granting permission android.permission.HARDWARE_TEST to package android.rk.RockVideoPlayer (protectionLevel=2 flags=0x3808be45)
01-18 08:50:15.647   581   581 W PackageManager: Not granting permission android.permission.DEVICE_POWER to package android.rk.RockVideoPlayer (protectionLevel=2 flags=0x3808be45)
01-18 08:50:15.647   581   581 W PackageManager: Unknown permission rockchip.permission.FULL_SCREEN in package android.rk.RockVideoPlayer
01-18 08:50:15.647   581   581 W PackageManager: Unknown permission android.permission.RAISED_THREAD_PRIORITY in package android.rk.RockVideoPlayer
01-18 08:50:15.647   581   581 W PackageManager: Unknown permission android.permission.FULL_SCREEN in package android.rk.RockVideoPlayer
01-18 08:50:15.647   581   581 W PackageManager: Unknown permission archos.permission.FULL_SCREEN in package android.rk.RockVideoPlayer
01-18 08:50:15.647   581   581 W PackageManager: Not granting permission android.permission.STATUS_BAR to package android.rk.RockVideoPlayer (protectionLevel=18 flags=0x3808be45)
01-18 08:50:15.647   581   581 W PackageManager: Not granting permission android.permission.WRITE_MEDIA_STORAGE to package android.rk.RockVideoPlayer (protectionLevel=18 flags=0x3808be45)
01-18 08:50:15.647   581   581 W PackageManager: Not granting permission android.permission.CHANGE_CONFIGURATION to package android.rk.RockVideoPlayer (protectionLevel=50 flags=0x3808be45)
01-18 08:50:15.647   581   581 V PackageManager: reconcileAppsData for null u0 0x3
01-18 08:50:15.651   247   247 I SELinux : SELinux: Loaded file_contexts contexts from /file_contexts.bin.
01-18 08:50:15.681   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.732   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.782   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.832   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.866   581   581 V PackageManager: reconcileAppsData finished 65 packages
01-18 08:50:15.883   245   245 I ServiceManager: Waiting for service sensorservice...
01-18 08:50:15.889   581   581 E PackageManager: There should probably be a verifier, but, none were found
01-18 08:50:15.893   581   581 I art     : Starting a blocking GC Explicit
01-18 08:50:15.912   581   581 I art     : Explicit concurrent mark sweep GC freed 21430(1291KB) AllocSpace objects, 8(208KB) LOS objects, 33% free, 3MB/4MB, paused 193us total 18.862ms
01-18 08:50:15.914   581   581 I SystemServer: StartOtaDexOptService
01-18 08:50:15.916   581   581 I SystemServer: StartUserManagerService
01-18 08:50:15.916   581   581 I SystemServiceManager: Starting com.android.server.pm.UserManagerService$LifeCycle
01-18 08:50:15.926   581   581 I SystemServiceManager: Starting com.android.server.BatteryService
01-18 08:50:15.927   581   611 D SensorService: nuSensorService starting...
01-18 08:50:15.932   581   597 E BatteryStatsService: power: Missing API
01-18 08:50:15.933   581   581 I SystemServiceManager: Starting com.android.server.usage.UsageStatsService`

01-18 08:50:21.054   581   646 I ActivityManager: Start proc 1081:com.android.keychain/1000 for service com.android.keychain/.KeyChainService
01-18 08:50:21.071  1044  1044 W System  : ClassLoader referenced unknown path: /system/priv-app/StressTest/lib/arm64
01-18 08:50:21.078  1067  1067 W System  : ClassLoader referenced unknown path: /system/app/Launcher3/lib/arm64
01-18 08:50:21.084  1081  1081 W System  : ClassLoader referenced unknown path: /system/app/KeyChain/lib/arm64
......
01-18 08:50:21.103  1081  1081 E AndroidRuntime: FATAL EXCEPTION: main
01-18 08:50:21.103  1081  1081 E AndroidRuntime: Process: com.android.keychain, PID: 1081
01-18 08:50:21.103  1081  1081 E AndroidRuntime: java.lang.RuntimeException: Unable to instantiate service com.android.keychain.KeyChainService: java.lang.ClassNotFoundException: Didn't find class "com.android.keychain.KeyChainService" on path: DexPathList[[zip file "/system/app/KeyChain/KeyChain.apk"],nativeLibraryDirectories=[/system/app/KeyChain/lib/arm64, /system/app/KeyChain/KeyChain.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib, /system/lib, /vendor/lib]]
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at android.app.ActivityThread.handleCreateService(ActivityThread.java:3177)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at android.app.ActivityThread.-wrap5(ActivityThread.java)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1568)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:102)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:154)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:6121)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.android.keychain.KeyChainService" on path: DexPathList[[zip file "/system/app/KeyChain/KeyChain.apk"],nativeLibraryDirectories=[/system/app/KeyChain/lib/arm64, /system/app/KeyChain/KeyChain.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib, /system/lib, /vendor/lib]]
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at android.app.ActivityThread.handleCreateService(ActivityThread.java:3174)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	... 8 more
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	Suppressed: java.io.IOException: No original dex files found for dex location /system/app/KeyChain/KeyChain.apk
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexFile.openDexFileNative(Native Method)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexFile.openDexFile(DexFile.java:367)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexFile.<init>(DexFile.java:112)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexFile.<init>(DexFile.java:77)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexPathList.loadDexFile(DexPathList.java:359)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexPathList.makeElements(DexPathList.java:323)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexPathList.makeDexElements(DexPathList.java:263)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexPathList.<init>(DexPathList.java:126)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:48)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:64)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at com.android.internal.os.PathClassLoaderFactory.createClassLoader(PathClassLoaderFactory.java:43)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:58)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:520)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.LoadedApk.getClassLoader(LoadedApk.java:553)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.ActivityThread.getTopLevelResources(ActivityThread.java:1867)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.LoadedApk.getResources(LoadedApk.java:766)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.ContextImpl.<init>(ContextImpl.java:2042)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.ContextImpl.createAppContext(ContextImpl.java:1987)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5296)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.ActivityThread.-wrap2(ActivityThread.java)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1546)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		... 6 more
01-18 08:50:21.105  1034  1034 I LatinIME: Hardware accelerated drawing: true
01-18 08:50:21.103  1081  1081 E AndroidRuntime: FATAL EXCEPTION: main
01-18 08:50:21.103  1081  1081 E AndroidRuntime: Process: com.android.keychain, PID: 1081
01-18 08:50:21.103  1081  1081 E AndroidRuntime: java.lang.RuntimeException: Unable to instantiate service com.android.keychain.KeyChainService: java.lang.ClassNotFoundException: Didn't find class "com.android.keychain.KeyChainService" on path: DexPathList[[zip file "/system/app/KeyChain/KeyChain.apk"],nativeLibraryDirectories=[/system/app/KeyChain/lib/arm64, /system/app/KeyChain/KeyChain.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib, /system/lib, /vendor/lib]]
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at android.app.ActivityThread.handleCreateService(ActivityThread.java:3177)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at android.app.ActivityThread.-wrap5(ActivityThread.java)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1568)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:102)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:154)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:6121)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:912)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:802)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: Caused by: java.lang.ClassNotFoundException: Didn't find class "com.android.keychain.KeyChainService" on path: DexPathList[[zip file "/system/app/KeyChain/KeyChain.apk"],nativeLibraryDirectories=[/system/app/KeyChain/lib/arm64, /system/app/KeyChain/KeyChain.apk!/lib/armeabi-v7a, /system/lib, /vendor/lib, /system/lib, /vendor/lib]]
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at java.lang.ClassLoader.loadClass(ClassLoader.java:380)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at java.lang.ClassLoader.loadClass(ClassLoader.java:312)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	at android.app.ActivityThread.handleCreateService(ActivityThread.java:3174)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	... 8 more
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 	Suppressed: java.io.IOException: No original dex files found for dex location /system/app/KeyChain/KeyChain.apk
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexFile.openDexFileNative(Native Method)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexFile.openDexFile(DexFile.java:367)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexFile.<init>(DexFile.java:112)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexFile.<init>(DexFile.java:77)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexPathList.loadDexFile(DexPathList.java:359)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexPathList.makeElements(DexPathList.java:323)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexPathList.makeDexElements(DexPathList.java:263)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.DexPathList.<init>(DexPathList.java:126)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.BaseDexClassLoader.<init>(BaseDexClassLoader.java:48)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at dalvik.system.PathClassLoader.<init>(PathClassLoader.java:64)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at com.android.internal.os.PathClassLoaderFactory.createClassLoader(PathClassLoaderFactory.java:43)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.ApplicationLoaders.getClassLoader(ApplicationLoaders.java:58)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.LoadedApk.createOrUpdateClassLoaderLocked(LoadedApk.java:520)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.LoadedApk.getClassLoader(LoadedApk.java:553)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.ActivityThread.getTopLevelResources(ActivityThread.java:1867)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.LoadedApk.getResources(LoadedApk.java:766)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.ContextImpl.<init>(ContextImpl.java:2042)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.ContextImpl.createAppContext(ContextImpl.java:1987)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5296)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.ActivityThread.-wrap2(ActivityThread.java)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1546)
01-18 08:50:21.103  1081  1081 E AndroidRuntime: 		... 6 more
01-18 08:50:21.105  1034  1034 I LatinIME: Hardware accelerated drawing: true

上面的日志有几句非常有用

01-18 08:50:15.640   581   581 I PackageManager: Adjusting ABI for com.android.rk to armeabi-v7a (requirer=com.deepblue.vehicle, scannedPackage=null)
01-18 08:50:15.640   581   581 I PackageManager: Adjusting ABI for com.android.location.fused to armeabi-v7a (requirer=com.deepblue.vehicle, scannedPackage=null)
Adjusting ABI for com.cghs.stresstest to armeabi-v7a (requirer=com.deepblue.vehicle, scannedPackage=null)

从这段可以看出stresstest 的ABI被调整位 armeabi-v7a 也就是32位,arm64-v8a为64位
ABI相关解释

ABI是Application Binary Interface的缩写。
ABI常表示两个程序模块之间的接口,且其中一个模块常为机器码级别的library或操作系统。
ABI定义了函数库的调用、应用的二进制文件(尤其是.so)如何运行在相应的系统平台上等细节。
Android目前支持以下七种ABI:armeabi、armeabi-v7a、arm64-v8a、x86、x86_64、mips、mips64。

对于rk3399 的64的系统。默认情况下apk 都是已运行在64运行,如何查看apk 运行情况,可以通过下面命令查看

rk3399_firefly_mipi_box:/ $ ps | grep zygote
root      200   1     2151024 123500          0 0000000000 S zygote64
root      201   1     1587980 111020          0 0000000000 S zygote
rk3399_firefly_mipi_box:/ $ ps | grep 200
root      200   1     2151024 123500          0 0000000000 S zygote64
system    599   200   2342484 172072          0 0000000000 S system_server
shell     657   242   8008   2000  __skb_recv 75c567f6ec S logcat
radio     785   200   1593744 103804          0 0000000000 S com.android.phone
u0_a15    799   200   1792152 150520          0 0000000000 S com.android.systemui
system    813   200   1766892 112376          0 0000000000 S com.android.settings
u0_a8     1175  200   1569668 68760          0 0000000000 S android.ext.services
system    1218  200   1568628 66944          0 0000000000 S com.example.changeled
.......
rk3399_firefly_mipi_box:/ $ ps | grep 201
root      201   1     1587980 111020          0 0000000000 S zygote
system    1486  201   1400088 389240          0 0000000000 S com.deepblue.vehicle
system    1246  201   1572932 70468          0 0000000000 S com.cghs.stresstest

我们发现我们Stresstest运行在32的虚拟机上,很明显这里出现 了错误。由于我们 Stresstest 是system app ,所以情况有些特殊
对于rk3399中apk 有下面运行规则,
引用其他人总结

1、如果apk中的native库中含有arm64-v8a,则以64位的模式执行,fork zygote64
2、如果没有,则看有没有armeabi-v7a,armeabi这两个,如果有,则以32位模式执行,fork zygote
3、如果以上两个都没有,就查找共享shareuid 运行的情况。如果共享uid 运行32位就运行在32位,共享uid 运行64位就运行在64位,与共享uid运行在同一个虚拟机中。
4、如果apk中这三个库都没有,则默认以64位模式执行。

对于系统app

如果apk包中lib文件夹下有.so库,就根据这个.so库的架构模式,确定app的primaryCpuAbi的值
对于system app, 如果没法通过第一步确定primaryCpuAbi的值,PKMS会根据/system/app/${APP_NAME}/lib和/system/app/${APP_NAME}/lib64这两个文件夹是否存在,来确定它的primaryCpuAbi的值
对于还没有确定的app, 在最后还会将自己的primaryCpuAbi值与和他使用相同UID的package的值设成一样
对于到这里还没有确认primaryCpuAbi的app,就会在启动进程时使用ro.product.cpu.abilist这个property的值的第一项作为它关联的ABI

以下代码参考的博客

上面我们讲过的ABI对我们apk 最终的进程运行的架构有最终影响,这个影响是通过代码中的primaryCpuAbi值的确定,
影响primaryCpuAbi值相关代码在pacagemangeservice.java中

scanPackageDirtyLI() {
        ... ...
        if ((scanFlags & SCAN_NEW_INSTALL) == 0) {
                // 这个方法里会通过apk包里包含的so库的架构来决定app的primaryCpuAbi的值,主要功能把lib库的路径创建好了,也把lib库copy到这个目录下,然后后面会调用Installd的方法,在data/data/apk相关目录 下的lib 创建软链接到真正放lib的地方,如果32位库就会建立lib/arm,64位lib/arm64
            derivePackageAbi(pkg, scanFile, cpuAbiOverride, true /* extract libs */);

            // Some system apps still use directory structure for native libraries
            // in which case we might end up not detecting abi solely based on apk
            // structure. Try to detect abi based on directory structure.
            if (isSystemApp(pkg) && !pkg.isUpdatedSystemApp() &&
                    pkg.applicationInfo.primaryCpuAbi == null) {
                // 如果是system app,并且这个app没有通过上面的函数找到primaryCpuAbi的值
                setBundledAppAbisAndRoots(pkg, pkgSetting);
                // setNativeLibraryPaths方法会根据CpuAbi的值确定apk使用的so库的安装路径
                setNativeLibraryPaths(pkg);
            }
        } else {
            if ((scanFlags & SCAN_MOVE) != 0) {
                // We haven't run dex-opt for this move (since we've moved the compiled output too)
                // but we already have this packages package info in the PackageSetting. We just
                // use that and derive the native library path based on the new codepath.
                pkg.applicationInfo.primaryCpuAbi = pkgSetting.primaryCpuAbiString;
                pkg.applicationInfo.secondaryCpuAbi = pkgSetting.secondaryCpuAbiString;
            }

            // Set native library paths again. For moves, the path will be updated based on the
            // ABIs we've determined above. For non-moves, the path will be updated based on the
            // ABIs we determined during compilation, but the path will depend on the final
            // package path (after the rename away from the stage path).
            setNativeLibraryPaths(pkg);
        }

        // 当前解析的apk是framework-res.apk, 对这个特殊的apk, 让它的ABI值的系统相同, 在我这里,它就是arm64-v8a
        // This is a special case for the "system" package, where the ABI is
        // dictated by the zygote configuration (and init.rc). We should keep track
        // of this ABI so that we can deal with "normal" applications that run under
        // the same UID correctly.
        if (mPlatformPackage == pkg) {
            pkg.applicationInfo.primaryCpuAbi = VMRuntime.getRuntime().is64Bit() ?
                    Build.SUPPORTED_64_BIT_ABIS[0] : Build.SUPPORTED_32_BIT_ABIS[0];
        }

        ... ...

        if ((scanFlags & SCAN_BOOTING) == 0 && pkgSetting.sharedUser != null) {
            // We don't do this here during boot because we can do it all
            // at once after scanning all existing packages.
            //
            // We also do this *before* we perform dexopt on this package, so that
            // we can avoid redundant dexopts, and also to make sure we've got the
            // code and package path correct.
            adjustCpuAbisForSharedUserLPw(pkgSetting.sharedUser.packages,
                        pkg, true /* boot complete */);
        }

    }

接着先来看下derivePackageAbi()方法是如何确定primaryCpuAbi的值的:

public void derivePackageAbi(PackageParser.Package pkg, File scanFile,
                                 String cpuAbiOverride, boolean extractLibs) {
        // 这里会先设置一个默认的so库安装路径
        setNativeLibraryPaths(pkg);

        if (isMultiArch(pkg.applicationInfo)) {
            // 这里处理的是支持两种abi的apk, 这种apk的AndroidManifest.xml里会设置android:multiarch为true
            ... ...
        } else {
            String[] abiList = (cpuAbiOverride != null) ?
                    new String[]{cpuAbiOverride} : Build.SUPPORTED_ABIS;


            final int copyRet;
            // 这是一个JNI函数,作用就是根据apk包里的lib/目录下的.so的ABI确定返回值
            copyRet = NativeLibraryHelper.copyNativeBinariesForSupportedAbi(handle,
                    nativeLibraryRoot, abiList, useIsaSpecificSubdirs);

            // 根据copyRet的值,确定当前app的primaryCpuAbi值
            if (copyRet >= 0) {
                pkg.applicationInfo.primaryCpuAbi = abiList[copyRet];
            } else if (copyRet == PackageManager.NO_NATIVE_LIBRARIES && cpuAbiOverride != null) {
                pkg.applicationInfo.primaryCpuAbi = cpuAbiOverride;
            } else if (needsRenderScriptOverride) {
                pkg.applicationInfo.primaryCpuAbi = abiList[0];
            }

        }
        // 到这里有一些app已经确定了primaryCpuAbi的值,所以再调一次这个函数,更新它使用的.so库的安装位置
        setNativeLibraryPaths(pkg);
    }

通过这段代码会可以看出:
一些apk包里lib目录下有.so文件的,可以通过.so文件的ABI来确定app的primaryCpuAbi的值对于那些lib下没有.so文件的apk, 比如不使用so库的或者是系统app,运行完这个方法之后,primaryCpuAbi的值仍然是空 。
接下来看下系统app是如何通过setBundledAppAbisAndRoots()方法来确定primaryCpuAbi的值的:

private static void setBundledAppAbi(PackageParser.Package pkg, String apkRoot, String apkName) {
        final File codeFile = new File(pkg.codePath);

        final boolean has64BitLibs;
        final boolean has32BitLibs;
        if (isApkFile(codeFile)) {
            // 只有framework-res.apk这个包会进这个if分支,has64BitLibs和has32BitLibs的值都是false
            // 在前面scanPackageDirtyLI里有说过,这个app的primaryCpuAbi的值是arm64-v8a
            has64BitLibs = (new File(apkRoot, new File(LIB64_DIR_NAME, apkName).getPath())).exists();
            has32BitLibs = (new File(apkRoot, new File(LIB_DIR_NAME, apkName).getPath())).exists();
        } else {
            // 对于其它的app, codeFile是apk所在的路径
            final File rootDir = new File(codeFile, LIB_DIR_NAME);

            final String isa = VMRuntime.getInstructionSet(Build.SUPPORTED_64_BIT_ABIS[0]);
            // 通过判断/system/app/${APP_NAME}/lib64这个文件夹是否存在决定has64BitLibs的值
            has64BitLibs = (new File(rootDir, isa)).exists();

            final String isa = VMRuntime.getInstructionSet(Build.SUPPORTED_32_BIT_ABIS[0]);
            // 通过判断/system/app/${APP_NAME}/lib这个文件夹是否存在决定has32BitLibs的值
            has32BitLibs = (new File(rootDir, isa)).exists();

        }

        // 下面这一段会根据has64BitLibs和has32BitLibs的值来确定app的primaryCpuAbi的值
        if (has64BitLibs && !has32BitLibs) {
            pkg.applicationInfo.primaryCpuAbi = Build.SUPPORTED_64_BIT_ABIS[0];
            pkg.applicationInfo.secondaryCpuAbi = null;
        } else if (has32BitLibs && !has64BitLibs) {
            pkg.applicationInfo.primaryCpuAbi = Build.SUPPORTED_32_BIT_ABIS[0];
            pkg.applicationInfo.secondaryCpuAbi = null;
        } else if (has32BitLibs && has64BitLibs) {
            if (VMRuntime.is64BitInstructionSet(getPreferredInstructionSet())) {
                pkg.applicationInfo.primaryCpuAbi = Build.SUPPORTED_64_BIT_ABIS[0];
                pkg.applicationInfo.secondaryCpuAbi = Build.SUPPORTED_32_BIT_ABIS[0];
            } else {
                pkg.applicationInfo.primaryCpuAbi = Build.SUPPORTED_32_BIT_ABIS[0];
                pkg.applicationInfo.secondaryCpuAbi = Build.SUPPORTED_64_BIT_ABIS[0];
            }
        } else {
            pkg.applicationInfo.primaryCpuAbi = null;
            pkg.applicationInfo.secondaryCpuAbi = null;
        }
    }

根据上面的代码,可以知道:
对系统app而言,根据/system/app/{appNAME}/lib和/system/app/{appNAME}/lib64这两个文件夹是否存在,来确定它的primaryCpuAbi的值当然,如果系统app不存在上述两个文件夹,那它的primaryCpuAbi的值仍然为空
所以在经过上述操作之后,会存在以下四种情况:
无论是系统app还是第三方app, 如果apk包里lib目录存在.so文件,会根据.so文件来确定primaryCpuAbi的值如果是系统app, apk包里又不存在.so文件,就会进一步根据/system/app/{appNAME}/lib/lib和/system/app/{appNAME}/lib/lib64这两个文件夹是否存在,来确定它的primaryCpuAbi的值对于framework-res.apk为个特殊的apk文件,它的primaryCpuAbi的值由虚拟机是什么架构来决定,在我这里,它是arm64-v8a对于其余的apk, 它们的primaryCpuAbi的值仍然为空
我们重点分析adjustCpuAbisForSharedUserLPw这个函数

 private void adjustCpuAbisForSharedUserLPw(Set<PackageSetting> packagesForUser,
            PackageParser.Package scannedPackage, boolean bootComplete) {
        String requiredInstructionSet = null;
        if (scannedPackage != null && scannedPackage.applicationInfo.primaryCpuAbi != null) {
            requiredInstructionSet = VMRuntime.getInstructionSet(
            //这里根本不会被执行,? 因为 scannedPackage = null
                     scannedPackage.applicationInfo.primaryCpuAbi);
        }

        PackageSetting requirer = null;
        //循环取出共享一个uid 的 apk ,比如取出共享 system uid 的apk 组合
        for (PackageSetting ps : packagesForUser) {
            // If packagesForUser contains scannedPackage, we skip it. This will happen
            // when scannedPackage is an update of an existing package. Without this check,
            // we will never be able to change the ABI of any package belonging to a shared
            // user, even if it's compatible with other packages.
           // 会执行执行到这,因为scannedPackage == null 
            if (scannedPackage == null || !scannedPackage.packageName.equals(ps.name)) {
                if (ps.primaryCpuAbiString == null) {
                //查看取出的apk 的 ABI值是否为空,空就继续执行。直到取出一个不为空的。对于
                //system uid 组合的apk  ,大部分apk 并不存在so 库,所以大部分的primaryCpuAbiString  = null,
                //但是我们system uid 中的Vtes.apk 是有 32 so的,所以其  primaryCpuAbiString  = armeabi-v7a(32位)
                    continue;
                }

                final String instructionSet = VMRuntime.getInstructionSet(ps.primaryCpuAbiString);
                if (requiredInstructionSet != null && !instructionSet.equals(requiredInstructionSet)) {
                    // We have a mismatch between instruction sets (say arm vs arm64) warn about
                    // this but there's not much we can do.
                    String errorMessage = "Instruction set mismatch, "
                            + ((requirer == null) ? "[caller]" : requirer)
                            + " requires " + requiredInstructionSet + " whereas " + ps
                            + " requires " + instructionSet;
                    Slog.w(TAG, errorMessage);
                }

                if (requiredInstructionSet == null) {
                    requiredInstructionSet = instructionSet; //instructionSet ===arm64
                    requirer = ps;
                    //requirer=com.deepblue.vehicle
                }
            }
        }

        if (requiredInstructionSet != null) {
            String adjustedAbi;
            if (requirer != null) {
                // requirer != null implies that either scannedPackage was null or that scannedPackage
                // did not require an ABI, in which case we have to adjust scannedPackage to match
                // the ABI of the set (which is the same as requirer's ABI)
                adjustedAbi = requirer.primaryCpuAbiString;
                //把system uidi 的 adjustedAbi  =  armeabi-v7a
                if (scannedPackage != null) {
                    scannedPackage.applicationInfo.primaryCpuAbi = adjustedAbi;
                }
            } else {
                // requirer == null implies that we're updating all ABIs in the set to
                // match scannedPackage.
                adjustedAbi =  scannedPackage.applicationInfo.primaryCpuAbi;
            }
//这里 把 系统中primaryCpuAbiString = null 的值都赋值位  armeabi-v7a
            for (PackageSetting ps : packagesForUser) {
                if (scannedPackage == null || !scannedPackage.packageName.equals(ps.name)) {
                    if (ps.primaryCpuAbiString != null) {
                    //有值 的就跳过
                        continue;
                    }

                    ps.primaryCpuAbiString = adjustedAbi;
                    if (ps.pkg != null && ps.pkg.applicationInfo != null &&
                            !TextUtils.equals(adjustedAbi, ps.pkg.applicationInfo.primaryCpuAbi)) {
                        ps.pkg.applicationInfo.primaryCpuAbi = adjustedAbi;
                        Slog.i(TAG, "Adjusting ABI for " + ps.name + " to " + adjustedAbi
                                + " (requirer="
                                + (requirer == null ? "null" : requirer.pkg.packageName)
                                + ", scannedPackage="
                                + (scannedPackage != null ? scannedPackage.packageName : "null")
                                + ")");
                        try {
                            mInstaller.rmdex(ps.codePathString,
                                    getDexCodeInstructionSet(getPreferredInstructionSet()));
                        } catch (InstallerException ignored) {
                        }
                    }
                }
            }
        }
    }

根据上个代码的分析。我们stresstest、keychain 都是没有so的apk ,所以初始阶段primaryCpuAbiString = null,由于和Vtest.apk共享一个system uid ,所以它们都被置为32 位的 armeabi-v7a,因为他们都是system app 。源码编译出来的。默认只支持64的系统。
所以开机完成之后会报错。
为什么会概率性报错呢?
由于我们系统中共享system uid 除了 Vtest.apk有so之外还有一个apk 有so库,但是他们的so是64位的。开机完成之后如果这个apk 先于Vtest完成初始化。我们stresstest、keychain 都会与这个apk共享 64位的ABI,所以不会崩溃。
问题分析清楚了,怎么修改呢?
开始遇到这个问题我也与瑞芯微的FAE沟通,他们让我按照这个博客修改,对于这个问题有点鄙视他们解决方式

https://blog.csdn.net/qq_37610155/article/details/78607276

实际这个博客并没有解决我的问题,启动还是会有概率性崩溃,而且会有其他衍生问题

LOCAL_DEX_PREOPT := nostripping
DEX_PREOPT_DEFAULT := nostripping 

这个属性会导致系统不优化整个系统 ,而且导致system.img很大。启动特别慢,
我解决思想是这样的。
1、对于其他共享uid的不做处理
2、对于共享systemuid的专门做处理,我们Vtest 我们跳过。直到遇到64的so的apk
相关的修改代码由于特殊原因就不列出来了,如果有需要的可以联系我

猜你喜欢

转载自blog.csdn.net/lb5761311/article/details/90291477