You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
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 getprop via 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.
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.
yan12125 commented on May 4, 2016
yan12125mannequin
Mannequin
More actions
Version 2 attached. Removed ro.build.version.full.
yan12125 commented on May 8, 2016
yan12125mannequin
Mannequin
More actions
Android framework provides an SDK_INT field [1], which parses the value of ro.build.version.sdk and defaults to 0 if failed [2]. Should android_ver() return an integer for the sdk field, too? It simplifies the usage in bpo-26935 and similar ones.
IMHO 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.
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...
xdegaye commented on Dec 5, 2017
xdegayemannequin
MannequinAuthor
More actions
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:
# begin build properties# autogenerated by buildinfo.shro.build.id=NYCro.build.display.id=sdk_phone_x86_64-userdebug7.0NYC4174735test-keysro.build.version.incremental=4174735ro.build.version.sdk=24ro.build.version.preview_sdk=0ro.build.version.codename=RELro.build.version.all_codenames=RELro.build.version.release=7.0ro.build.version.security_patch=2017-06-05ro.build.version.base_os=ro.build.date=WedJul1219:46:52UTC2017ro.build.date.utc=1499888812ro.build.type=userdebugro.build.user=android-buildro.build.host=wphl5.hot.corp.google.comro.build.tags=test-keysro.build.flavor=sdk_phone_x86_64-userdebugro.product.model=AndroidSDKbuiltforx86_64ro.product.brand=Androidro.product.name=sdk_phone_x86_64ro.product.device=generic_x86_64ro.product.board=# ro.product.cpu.abi and ro.product.cpu.abi2 are obsolete,# use ro.product.cpu.abilist instead.ro.product.cpu.abi=x86_64ro.product.cpu.abilist=x86_64,x86ro.product.cpu.abilist32=x86ro.product.cpu.abilist64=x86_64ro.product.manufacturer=unknownro.product.locale=en-USro.wifi.channels=ro.board.platform=# ro.build.product is obsolete; use ro.product.devicero.build.product=generic_x86_64ro.product.cpu.abilist=x86_64,x86ro.product.cpu.abilist32=x86ro.product.cpu.abilist64=x86_64ro.product.manufacturer=unknownro.product.locale=en-USro.wifi.channels=ro.board.platform=# ro.build.product is obsolete; use ro.product.devicero.build.product=generic_x86_64# Do not try to parse description, fingerprint, or thumbprintro.build.description=sdk_phone_x86_64-userdebug7.0NYC4174735test-keysro.build.fingerprint=Android/sdk_phone_x86_64/generic_x86_64:7.0/NYC/4174735:userdebug/test-keysro.build.characteristics=emulator# end build properties## from build/target/board/generic_x86_64/system.prop### system.prop for generic sdk#
"-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?
xdegaye commented on Dec 5, 2017
xdegayemannequin
MannequinAuthor
More actions
Yes, and fall back to spawning getprop if that fails.
Activity
xdegaye commentedon Apr 26, 2016
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.
yan12125 commentedon Apr 26, 2016
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/keQP6L9aVyU
xdegaye commentedon Apr 27, 2016
The android/api-level.h header exists at all the android API levels and define __ANDROID_API__ as, for example at level 21:
So it is possible to get the sdk version from here, and maybe forget about the release version.
yan12125 commentedon Apr 27, 2016
Isn't this macro used in compile time? I thought android_ver() aims to check runtime versions.
malemburg commentedon Apr 27, 2016
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 ?!
malemburg commentedon Apr 27, 2016
Some screenshots showing different file contents:
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().yan12125 commentedon Apr 27, 2016
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
[-]add platform.android_ver() for android[/-][+]android: add platform.android_ver()[/+]yan12125 commentedon May 4, 2016
Several questions on implementation:
Some related Android source codes, as my implementation basis:
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/
malemburg commentedon May 4, 2016
On 04.05.2016 21:47, Chi Hsuan Yen wrote:
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.
Agreed.
yan12125 commentedon May 4, 2016
Version 2 attached. Removed ro.build.version.full.
yan12125 commentedon May 8, 2016
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#66
xdegaye commentedon May 11, 2016
IMHO 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
vstinner commentedon Dec 5, 2017
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...
xdegaye commentedon Dec 5, 2017
I cannot find a reference to the "build.prop" file in the Android documentation but google answers at the question ' what is "build.prop"':
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
rild.libpath=/system/lib/libreference-ril.so
rild.libargs=-d /dev/ttyS0
vstinner commentedon Dec 5, 2017
"-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?
xdegaye commentedon Dec 5, 2017
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
vstinner commentedon Dec 11, 2017
I suggest to start simple. Parsing a text file is simple, spawning a subprocess can have annoying side effects :-(
mhsmith commentedon Feb 8, 2024
We're currently discussing PEP 738, which contains a different specification for
android_ver. Please post any comments here:gh-71042: Add `platform.android_ver` (#116674)
Squashed commit of the following:
Squashed commit of the following:
pythongh-71042: Add `platform.android_ver` (python#116674)