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
相关的修改代码由于特殊原因就不列出来了,如果有需要的可以联系我