Repository navigation
android: add platform.android_ver() #71042
Description
Activity
The attached patch misses a test case.
Also how can we be sure that the '/system/build.prop' file may be guaranteed to exist on all android devices ?
It is difficult to get a reliable information on the android infrastructure when the information does not relate to the java libraries.- addedbuildThe build process and cross-buildThe build process and cross-buildtype-featureA feature request or enhancementA feature request or enhancement
on Apr 26, 2016 Also how can we be sure that the '/system/build.prop' file may be guaranteed to exist on all android devices ?
This path is hard-coded in BioniC [1]. Though I can't find a document/relevant source codes to guarantee 'ro.build.version.release' and 'ro.build.version.sdk' is always in /system/build.prop
And the format of build.prop is not exactly INI. It supports 'import' clauses. See [2] and load_properties() function in [3]
Other options include calling
getpropvia subprocess or using C level function __system_property_get(). The first approach should always work. It's just somewhat tricky on Android 4.1 [4]. For the second option, a bad news is that it's a private API and was just removed from the latest NDK. Chromium has a workaround for that [5] and CPython may use similar approaches.[1] https://android.googlesource.com/platform/bionic/+/master/libc/include/sys/_system_properties.h
[2] http://forum.xda-developers.com/android/general/explanation-build-prop-values-t3069341
[3] https://android.googlesource.com/platform/system/core/+/master/init/property_service.cpp
[4] rave-engine/python3-android#10 (comment)
[5] https://groups.google.com/a/chromium.org/forum/#!topic/chromium-reviews/keQP6L9aVyUThe android/api-level.h header exists at all the android API levels and define __ANDROID_API__ as, for example at level 21:
#define __ANDROID_API__ 21
So it is possible to get the sdk version from here, and maybe forget about the release version.
Isn't this macro used in compile time? I thought android_ver() aims to check runtime versions.
If the file is guaranteed to exist on most modern Android platforms, this sounds like a good approach.
Perhaps you could add support to fallback to running getprop instead, if the file doesn't exist or cannot be parsed ?!
Some screenshots showing different file contents:
- http://www1-lw.xda-cdn.com/files/2013/12/tweak-your-samsung-galaxy-s3s-performance-with-these-build-prop-android-hacks.w654.jpg
- http://media.apcmag.com/wp-content/uploads/sites/20/2014/04/buildprop-text-file.jpg
- http://i.imgur.com/hZXQaX9.png
I think exposing
codenameandincrementalmay also make sense to get a complete picture.ro.productalso has a lot of useful entries which could be used for some of the other platform APIs such as uname().I have a WIP patch. [1] It's based on Shiz's patch [2].
[1] https://github.com/yan12125/python3-android/blob/cpython-hg/mk/python/android-misc.patch
[2] https://github.com/rave-engine/python3-android/blob/9bb6420317922c07df405315eea040f9301f7eca/mk/python/3.4.3/python-3.4.3-android-misc.patch- changed the title
[-]add platform.android_ver() for android[/-][+]android: add platform.android_ver()[/+]on May 3, 2016 Several questions on implementation:
- Should Android 4.1 supported? If not pass_fds and logics for deriving it can be removed.
- I can't find ro.build.version.full on any device/emulator I have access to. Maybe it should be removed due to low popularity?
Some related Android source codes, as my implementation basis:
- Android 4.1's ANDROID_PROPERTY_WORKSPACE: https://android.googlesource.com/platform/bionic/+/android-4.1.1_r1/libc/bionic/system_properties.c#55
- The Android Framework assumes property values to be valid UTF-8: https://android.googlesource.com/platform/frameworks/base/+/android-5.1.1_r37/core/jni/android_os_SystemProperties.cpp#49. In fact if I feed a malformed /system/build.prop to DalvikVM, it crashes [1]
- Google's Android Compatibility Test Suite (CTS) [2] assumes
getpropbinary is in $PATH and can be executed: https://android.googlesource.com/platform/cts/+/android-5.1.1_r37/tests/tests/os/src/android/os/cts/BuildTest.java#110
[1] rave-engine/python3-android#10 (comment)
[2] https://source.android.com/compatibility/cts/On 04.05.2016 21:47, Chi Hsuan Yen wrote:
- Should Android 4.1 supported? If not pass_fds and logics for deriving it can be removed.
According to http://www.droid-life.com/tag/distribution/ the Jelly
Bean versions (4.1, 4.2 and 4.3) still have a sizable market
share, so if it's not too much trouble, I think supporting 4.1 would
be a plus.- I can't find ro.build.version.full on any device/emulator I have access to. Maybe it should be removed due to low popularity?
Agreed.
Version 2 attached. Removed ro.build.version.full.
Android framework provides an SDK_INT field [1], which parses the value of
ro.build.version.sdkand defaults to 0 if failed [2]. Should android_ver() return an integer for thesdkfield, too? It simplifies the usage in bpo-26935 and similar ones.[1] https://android.googlesource.com/platform/frameworks/base/+/e8579b12a3c5be5fef25fc5a1c8c2c9d43e49347/core/java/android/os/Build.java#183
[2] https://android.googlesource.com/platform/frameworks/base/+/e8579b12a3c5be5fef25fc5a1c8c2c9d43e49347/core/jni/android_os_SystemProperties.cpp#66IMHO returning an integer for the sdk field would be better. The patch could use shutil.which() to avoid subprocess calls when getprop is not available. It would be better to use a 'try/except ValueError' clause instead of isdigit(). The OSError and UnicodeDecodeError exceptions should not be masked, as well as ValueError if sdk cannot be parsed as an int.
10 remaining items
Chromium still uses the private __system_property_get() function:
https://chromium.googlesource.com/chromium/+/trunk/base/sys_info_android.cc
I would prefer a C function call rather than spawning a subprocess, just to get a value. But the function seems private, and I see discussion about removal of the function...
I cannot find a reference to the "build.prop" file in the Android documentation but google answers at the question ' what is "build.prop"':
The “build.prop” file is a system file that exists on every Android device. The file contains build information and other system properties which are used throughout the operating system.and stackoverflow is thriving with questions on how to edit this file.
The file contains part of the information returned by the getprop command and all the information we are needing here.
Here is its content and access rights on an android-24-x86_64 emulator:
generic_x86_64:/data/local/tmp/python $ ls -al /system/build.prop
-rw-r--r-- 1 root root 2083 2017-07-12 22:01 /system/build.prop
generic_x86_64:/data/local/tmp/python $ cat /system/build.prop# begin build properties # autogenerated by buildinfo.sh ro.build.id=NYC ro.build.display.id=sdk_phone_x86_64-userdebug 7.0 NYC 4174735 test-keys ro.build.version.incremental=4174735 ro.build.version.sdk=24 ro.build.version.preview_sdk=0 ro.build.version.codename=REL ro.build.version.all_codenames=REL ro.build.version.release=7.0 ro.build.version.security_patch=2017-06-05 ro.build.version.base_os= ro.build.date=Wed Jul 12 19:46:52 UTC 2017 ro.build.date.utc=1499888812 ro.build.type=userdebug ro.build.user=android-build ro.build.host=wphl5.hot.corp.google.com ro.build.tags=test-keys ro.build.flavor=sdk_phone_x86_64-userdebug ro.product.model=Android SDK built for x86_64 ro.product.brand=Android ro.product.name=sdk_phone_x86_64 ro.product.device=generic_x86_64 ro.product.board= # ro.product.cpu.abi and ro.product.cpu.abi2 are obsolete, # use ro.product.cpu.abilist instead. ro.product.cpu.abi=x86_64 ro.product.cpu.abilist=x86_64,x86 ro.product.cpu.abilist32=x86 ro.product.cpu.abilist64=x86_64 ro.product.manufacturer=unknown ro.product.locale=en-US ro.wifi.channels= ro.board.platform= # ro.build.product is obsolete; use ro.product.device ro.build.product=generic_x86_64 ro.product.cpu.abilist=x86_64,x86 ro.product.cpu.abilist32=x86 ro.product.cpu.abilist64=x86_64 ro.product.manufacturer=unknown ro.product.locale=en-US ro.wifi.channels= ro.board.platform= # ro.build.product is obsolete; use ro.product.device ro.build.product=generic_x86_64 # Do not try to parse description, fingerprint, or thumbprint ro.build.description=sdk_phone_x86_64-userdebug 7.0 NYC 4174735 test-keys ro.build.fingerprint=Android/sdk_phone_x86_64/generic_x86_64:7.0/NYC/4174735:userdebug/test-keys ro.build.characteristics=emulator # end build properties # # from build/target/board/generic_x86_64/system.prop # # # system.prop for generic sdk #
rild.libpath=/system/lib/libreference-ril.so
rild.libargs=-d /dev/ttyS0# # ADDITIONAL_BUILD_PROPERTIES # ro.config.notification_sound=OnTheHunt.ogg ro.config.alarm_alert=Alarm_Classic.ogg persist.sys.dalvik.vm.lib.2=libart.so dalvik.vm.isa.x86_64.variant=x86_64 dalvik.vm.isa.x86_64.features=default dalvik.vm.isa.x86.variant=x86 dalvik.vm.isa.x86.features=default dalvik.vm.lockprof.threshold=500 xmpp.auto-presence=true ro.config.nocheckin=yes net.bt.name=Android dalvik.vm.stack-trace-file=/data/anr/traces.txt
"-rw-r--r-- 1 root root 2083 2017-07-12 22:01 /system/build.prop" so
anyone can *read* the file. Maybe we can write a cheap parser for it,
instead of spawning a subprocess or relying on a private function
which may be removed in the near future?Yes, and fall back to spawning getprop if that fails.
In the following link Robin Gawenda is reporting that /system/build.prop is world readable on all the devices he checked: https://stackoverflow.com/questions/9937099/how-to-get-the-build-prop-values
Yes, and fall back to spawning getprop if that fails.
I suggest to start simple. Parsing a text file is simple, spawning a subprocess can have annoying side effects :-(
We're currently discussing PEP 738, which contains a different specification for
android_ver. Please post any comments here:- added a commit that references this issue
on Mar 27, 2024 - added 2 commits that reference this issue
on Apr 2, 2024
Metadata
Metadata
Assignees
Labels
Projects
- StatusShow more project fieldsDone
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields:
Linked PRs
platform.android_ver#116674