A passionate learner and developer from Beijing.
- 🏢 I'm a freelancer
- 🌱 Currently learning Rust
- 💻 Connect with me on Telegram
- 👀 a slash guy on the weedend: console gamer/outdoorer/homebrewer.
adores reinventing the wheel!
Teardown parser tool for mac, windows and mobile app (ipa, apk and aab file) and dSYM.zip file, analysis metedata like version, name, icon etc.
License: MIT License
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require': dlopen(/Library/Ruby/Gems/2.6.0/gems/pngdefry-0.1.3/lib/pngdefry.bundle, 0x0009): missing compatible arch in /Library/Ruby/Gems/2.6.0/gems/pngdefry-0.1.3/lib/pngdefry.bundle - /Library/Ruby/Gems/2.6.0/gems/pngdefry-0.1.3/lib/pngdefry.bundle (LoadError)
/Library/Ruby/Gems/2.6.0/gems/terminal-table-1.8.0/lib/terminal-table/table.rb:142:in `join': [!] incompatible character encodings: UTF-8 and ASCII-8BIT (Encoding::CompatibilityError) @icyleaf
Current get dSYM binary it always fetch the last one:
paths = ['.', 'BINARY', '..']
paths = ['.', '..', 'BINARY']
Hello
I found that AppInfo store all parsed files in tmp folder on Ubuntu server. Is it possible to delete the created folder when it is not needed?
Thanks
Is it necessary to validate a file if its an app
or not just by looking at its extension? I can have a temp file to be parsed which is not having a .ipa
/.apk
extension.
The same case can be a vice-versa; if I have a file with .ipa
/.apk
extension but actual content is different.
it allows zip file or dSYM directory, and support single MachO
and Fat MachO
,each MachO will returns:
and If dSYM include Info.plist
it will try to parse the metadata such like release_version
, build_version
, identifier
when CFBundleDisplayName is NOT English, ipa.info[:CFBundleDisplayName] failed:
[!] undefined method []' for #<AppInfo::Parser::InfoPlist:0x00007fcc01131e90> (NoMethodError) from /private/var/root/project/iOS/fastlane-kit/GeneralFastfile.rb:16:in
chdir'
from /private/var/root/project/iOS/fastlane-kit/GeneralFastfile.rb:16:in get_ipa_info' from Fastfile:202:in
block (2 levels) in parsing_binding'
from /Library/Ruby/Gems/2.3.0/gems/fastlane-2.130.0/fastlane/lib/fastlane/lane.rb:33:in call' from /Library/Ruby/Gems/2.3.0/gems/fastlane-2.130.0/fastlane/lib/fastlane/runner.rb:49:in
block in execute'
from /Library/Ruby/Gems/2.3.0/gems/fastlane-2.130.0/fastlane/lib/fastlane/runner.rb:45:in chdir' from /Library/Ruby/Gems/2.3.0/gems/fastlane-2.130.0/fastlane/lib/fastlane/runner.rb:45:in
execute'
from /Library/Ruby/Gems/2.3.0/gems/fastlane-2.130.0/fastlane/lib/fastlane/lane_manager.rb:56:in cruise_lane' from /Library/Ruby/Gems/2.3.0/gems/fastlane-2.130.0/fastlane/lib/fastlane/command_line_handler.rb:36:in
handle'
from /Library/Ruby/Gems/2.3.0/gems/fastlane-2.130.0/fastlane/lib/fastlane/commands_generator.rb:108:in block (2 levels) in run' from /Library/Ruby/Gems/2.3.0/gems/commander-fastlane-4.4.6/lib/commander/command.rb:178:in
call'
from /Library/Ruby/Gems/2.3.0/gems/commander-fastlane-4.4.6/lib/commander/command.rb:153:in run' from /Library/Ruby/Gems/2.3.0/gems/commander-fastlane-4.4.6/lib/commander/runner.rb:476:in
run_active_command'
from /Library/Ruby/Gems/2.3.0/gems/fastlane-2.130.0/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb:76:in run!' from /Library/Ruby/Gems/2.3.0/gems/commander-fastlane-4.4.6/lib/commander/delegates.rb:15:in
run!'
from /Library/Ruby/Gems/2.3.0/gems/fastlane-2.130.0/fastlane/lib/fastlane/commands_generator.rb:349:in run' from /Library/Ruby/Gems/2.3.0/gems/fastlane-2.130.0/fastlane/lib/fastlane/commands_generator.rb:41:in
start'
from /Library/Ruby/Gems/2.3.0/gems/fastlane-2.130.0/fastlane/lib/fastlane/cli_tools_distributor.rb:119:in take_off' from /Library/Ruby/Gems/2.3.0/gems/fastlane-2.130.0/bin/fastlane:23:in
<top (required)>'
from /usr/local/bin/fastlane:22:in load' from /usr/local/bin/fastlane:22:in
执行gem install 报错
liming@limingdeMac-mini cocoapods % sudo gem install app-info
Password:
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/universal-darwin21/rbconfig.rb:230: warning: Insecure world writable dir /opt/homebrew in PATH, mode 040777
ERROR: While executing gem ... (Gem::FilePermissionError)
You don't have write permissions for the /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/gems/2.6.0 directory.
base/manifest/AndroidManifest.xml
is compiled into protocol buffer format which makes it easier for tooling to transform when required.
Resources:
Sorry
The mobileprovision file reading doesn't seem to work on Ubuntu 18.04 servers.
I have tried following commands:
ipa=AppInfo.parse("tmp/storage/ios/app.ipa") # <AppInfo::Parser::IPA:0x005593c7258108 @file="tmp/storage/ios/app.ipa", @contents="/tmp/d20190628-1205-1l8tcbk/AppInfo-ios-571df9d7d57eb92000ae58c3a9659007", @app_path="/tmp/d20190628-1205-1l8tcbk/AppInfo-ios-571df9d7d57eb92000ae58c3a9659007/Payload/AppName.app">
ipa.expired_date # nil
ipa.mobileprovision # <AppInfo::Parser::MobileProvision:0x00558c5c7d4c20 @path=nil>
I also tried to work directly on embedded.mobileprovision file, but it didn't work as well.
p=AppInfo.parse("/tmp/embedded.mobileprovision") # <AppInfo::Parser::MobileProvision:0x005578ab330df0 @path="/tmp/embedded.mobileprovision">
p.expired_date # nil
p.team_name # nil
The same IPA file and same methods gives output for ipa.expired_date
on MacOS.
From 2.0 version, AppInfo will remove Parser
module level to reduce namespace.
before:
AppInfo::Parser::IPA.new file
AppInfo::Parser::Platform::Android
after
AppInfo::IPA.new file
AppInfo::Platform::Android
A crash may occur when inspecting an aab file.
Under certain circumstances resources defined in the project will have undefined values causing a crash when parsed.
A sample repository can be found here which reproduces the crash.
A patch file is provided which resolves the issue
0001-prevent-calling-to_sym-on-nil-value_from.value.patch
Traceback (most recent call last):
75: from /Users/jmorales/.gem/bin/bundle:23:in `<main>'
74: from /Users/jmorales/.gem/bin/bundle:23:in `load'
73: from /Users/jmorales/.gem/gems/bundler-2.3.22/exe/bundle:36:in `<top (required)>'
72: from /Users/jmorales/.gem/gems/bundler-2.3.22/lib/bundler/friendly_errors.rb:120:in `with_friendly_errors'
71: from /Users/jmorales/.gem/gems/bundler-2.3.22/exe/bundle:48:in `block in <top (required)>'
70: from /Users/jmorales/.gem/gems/bundler-2.3.22/lib/bundler/cli.rb:25:in `start'
69: from /Users/jmorales/.gem/gems/bundler-2.3.22/lib/bundler/vendor/thor/lib/thor/base.rb:485:in `start'
68: from /Users/jmorales/.gem/gems/bundler-2.3.22/lib/bundler/cli.rb:31:in `dispatch'
67: from /Users/jmorales/.gem/gems/bundler-2.3.22/lib/bundler/vendor/thor/lib/thor.rb:392:in `dispatch'
66: from /Users/jmorales/.gem/gems/bundler-2.3.22/lib/bundler/vendor/thor/lib/thor/invocation.rb:127:in `invoke_command'
65: from /Users/jmorales/.gem/gems/bundler-2.3.22/lib/bundler/vendor/thor/lib/thor/command.rb:27:in `run'
64: from /Users/jmorales/.gem/gems/bundler-2.3.22/lib/bundler/cli.rb:486:in `exec'
63: from /Users/jmorales/.gem/gems/bundler-2.3.22/lib/bundler/cli/exec.rb:23:in `run'
62: from /Users/jmorales/.gem/gems/bundler-2.3.22/lib/bundler/cli/exec.rb:58:in `kernel_load'
61: from /Users/jmorales/.gem/gems/bundler-2.3.22/lib/bundler/cli/exec.rb:58:in `load'
60: from /Users/jmorales/.gem/bin/fastlane:23:in `<top (required)>'
59: from /Users/jmorales/.gem/bin/fastlane:23:in `load'
58: from /Users/jmorales/.gem/gems/fastlane-2.212.1/bin/fastlane:23:in `<top (required)>'
57: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/cli_tools_distributor.rb:123:in `take_off'
56: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/commands_generator.rb:43:in `start'
55: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/commands_generator.rb:354:in `run'
54: from /Users/jmorales/.gem/gems/commander-4.6.0/lib/commander/delegates.rb:18:in `run!'
53: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane_core/lib/fastlane_core/ui/fastlane_runner.rb:124:in `run!'
52: from /Users/jmorales/.gem/gems/commander-4.6.0/lib/commander/runner.rb:444:in `run_active_command'
51: from /Users/jmorales/.gem/gems/commander-4.6.0/lib/commander/command.rb:157:in `run'
50: from /Users/jmorales/.gem/gems/commander-4.6.0/lib/commander/command.rb:187:in `call'
49: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/commands_generator.rb:110:in `block (2 levels) in run'
48: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/command_line_handler.rb:36:in `handle'
47: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/lane_manager.rb:47:in `cruise_lane'
46: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/runner.rb:45:in `execute'
45: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/runner.rb:45:in `chdir'
44: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/runner.rb:49:in `block in execute'
43: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/lane.rb:33:in `call'
42: from Fastfile:36:in `block (2 levels) in parsing_binding'
41: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/fast_file.rb:159:in `method_missing'
40: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/runner.rb:157:in `trigger_action_by_name'
39: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/runner.rb:229:in `execute_action'
38: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/runner.rb:229:in `chdir'
37: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/runner.rb:255:in `block in execute_action'
36: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/actions/actions_helper.rb:69:in `execute_action'
35: from /Users/jmorales/.gem/gems/fastlane-2.212.1/fastlane/lib/fastlane/runner.rb:263:in `block (2 levels) in execute_action'
34: from /Users/jmorales/.gem/gems/fastlane-plugin-app_info-0.7.0/lib/fastlane/plugin/app_info/actions/app_info_action.rb:16:in `run'
33: from /Users/jmorales/.gem/gems/fastlane-plugin-app_info-0.7.0/lib/fastlane/plugin/app_info/helper/app_info_helper.rb:18:in `raw_data'
32: from /Users/jmorales/.gem/gems/fastlane-plugin-app_info-0.7.0/lib/fastlane/plugin/app_info/helper/app_info_helper.rb:53:in `common_columns'
31: from /Users/jmorales/.gem/gems/fastlane-plugin-app_info-0.7.0/lib/fastlane/plugin/app_info/helper/app_info_helper.rb:53:in `each_with_object'
30: from /Users/jmorales/.gem/gems/fastlane-plugin-app_info-0.7.0/lib/fastlane/plugin/app_info/helper/app_info_helper.rb:53:in `each'
29: from /Users/jmorales/.gem/gems/fastlane-plugin-app_info-0.7.0/lib/fastlane/plugin/app_info/helper/app_info_helper.rb:54:in `block in common_columns'
28: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/aab.rb:57:in `name'
27: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/aab.rb:182:in `manifest'
26: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/aab.rb:187:in `resource'
25: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:12:in `parse'
24: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:12:in `new'
23: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:20:in `initialize'
22: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:41:in `parse'
21: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:46:in `define_packages'
20: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:46:in `each_with_object'
19: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:46:in `each'
18: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:47:in `block in define_packages'
17: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:47:in `new'
16: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:62:in `initialize'
15: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:103:in `define_types'
14: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:103:in `each'
13: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:105:in `block in define_types'
12: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:117:in `parse_from'
11: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:117:in `each_with_object'
10: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:117:in `each'
9: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:118:in `block in parse_from'
8: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:118:in `new'
7: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:129:in `initialize'
6: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:150:in `parse'
5: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:150:in `each_with_object'
4: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:150:in `each'
3: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:151:in `block in parse'
2: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:151:in `new'
1: from /Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:166:in `initialize'
/Users/jmorales/.gem/gems/app-info-2.8.3/lib/app_info/protobuf/resources.rb:191:in `parsed_value': \e[31m[!] undefined method `to_sym' for nil:NilClass\e[0m (NoMethodError)
Key | Value |
---|---|
OS | 13.2 |
Ruby | 2.7.5 |
Bundler? | true |
Git | git version 2.37.1 (Apple Git-137.1) |
Installation Source | ~/.rbenv/versions/2.7.5/bin/fastlane |
Host | macOS 13.2 (22D49) |
Ruby Lib Dir | ~/.rbenv/versions/2.7.5/lib |
OpenSSL Version | OpenSSL 1.1.1l 24 Aug 2021 |
Is contained | false |
Is homebrew | false |
Is installed via Fabric.app | false |
Xcode Path | /Applications/Xcode.app/Contents/Developer/ |
Xcode Version | 14.2 |
Swift Version | 5.7.2 |
Variable | Value | |
---|---|---|
LANG | en_US.UTF-8 | ✅ |
LC_ALL | ||
LANGUAGE |
# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
# https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
# https://docs.fastlane.tools/plugins/available-plugins
#
# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane
default_platform(:android)
platform :android do
desc "Runs all the tests"
lane :test do
gradle(task: "test")
end
desc "Submit a new Beta Build to Crashlytics Beta"
lane :beta do
gradle(task: "clean assembleRelease")
crashlytics
# sh "your_script.sh"
# You can also use other beta testing services here
end
desc "Deploy a new version to the Google Play"
lane :deploy do
gradle(task: "clean bundleDebug")
app_info(file: lane_context[SharedValues::GRADLE_AAB_OUTPUT_PATH])
end
end
json_key_file("") # Path to the json secret file - Follow https://docs.fastlane.tools/actions/supply/#setup to get one
package_name("com.example.myapplication") # e.g. com.krausefx.app
Gem | Version | Update-Status |
---|---|---|
fastlane | 2.212.1 | ✅ Up-To-Date |
Plugin | Version | Update-Status |
---|---|---|
fastlane-plugin-app_info | 0.7.0 | ✅ Up-To-Date |
Gem | Version |
---|---|
did_you_mean | 1.4.0 |
bundler | 2.3.22 |
uri | 0.10.0 |
rake | 13.0.6 |
rexml | 3.2.5 |
CFPropertyList | 3.0.6 |
public_suffix | 5.0.1 |
addressable | 2.8.1 |
rubyzip | 2.3.2 |
android_parser | 2.5.0 |
google-protobuf | 3.21.12 |
icns | 0.2.0 |
image_size | 3.0.2 |
ruby-macho | 3.0.0 |
uuidtools | 2.2.0 |
app-info | 2.8.3 |
artifactory | 3.0.15 |
atomos | 0.1.3 |
aws-eventstream | 1.2.0 |
aws-partitions | 1.721.0 |
aws-sigv4 | 1.5.2 |
jmespath | 1.6.2 |
aws-sdk-core | 3.170.0 |
aws-sdk-kms | 1.63.0 |
aws-sdk-s3 | 1.119.1 |
babosa | 1.0.4 |
claide | 1.1.0 |
colored | 1.2 |
colored2 | 3.1.2 |
highline | 2.0.3 |
commander | 4.6.0 |
declarative | 0.0.20 |
digest-crc | 0.6.4 |
unf_ext | 0.0.8.2 |
unf | 0.1.4 |
domain_name | 0.5.20190701 |
dotenv | 2.8.1 |
emoji_regex | 3.2.3 |
excon | 0.99.0 |
faraday-em_http | 1.0.0 |
faraday-em_synchrony | 1.0.0 |
faraday-excon | 1.1.0 |
faraday-httpclient | 1.0.1 |
multipart-post | 2.0.0 |
faraday-multipart | 1.0.4 |
faraday-net_http | 1.0.1 |
faraday-net_http_persistent | 1.2.0 |
faraday-patron | 1.0.0 |
faraday-rack | 1.0.0 |
faraday-retry | 1.0.3 |
ruby2_keywords | 0.0.5 |
faraday | 1.10.3 |
http-cookie | 1.0.5 |
faraday-cookie_jar | 0.0.7 |
faraday_middleware | 1.2.0 |
fastimage | 2.2.6 |
gh_inspector | 1.1.3 |
jwt | 2.7.0 |
memoist | 0.16.2 |
multi_json | 1.15.0 |
os | 1.1.4 |
signet | 0.17.0 |
googleauth | 1.3.0 |
httpclient | 2.8.3 |
mini_mime | 1.1.2 |
trailblazer-option | 0.1.2 |
uber | 0.1.0 |
representable | 3.2.0 |
retriable | 3.1.2 |
webrick | 1.8.1 |
google-apis-core | 0.11.0 |
google-apis-androidpublisher_v3 | 0.35.0 |
google-apis-playcustomapp_v1 | 0.13.0 |
google-apis-iamcredentials_v1 | 0.17.0 |
google-apis-storage_v1 | 0.19.0 |
google-cloud-env | 1.6.0 |
google-cloud-errors | 1.3.1 |
google-cloud-core | 1.6.0 |
google-cloud-storage | 1.44.0 |
json | 2.6.3 |
mini_magick | 4.12.0 |
naturally | 2.2.1 |
optparse | 0.1.1 |
plist | 3.7.0 |
security | 0.1.3 |
simctl | 1.6.10 |
terminal-notifier | 2.0.0 |
unicode-display_width | 1.8.0 |
terminal-table | 1.8.0 |
tty-screen | 0.8.1 |
tty-cursor | 0.7.1 |
tty-spinner | 0.9.3 |
word_wrap | 1.0.0 |
nanaimo | 0.3.0 |
xcodeproj | 1.22.0 |
rouge | 2.0.7 |
xcpretty | 0.3.0 |
xcpretty-travis-formatter | 1.0.1 |
fastlane-plugin-app_info | 0.7.0 |
generated on: 2023-03-08
require 'app-info'
puts ARGV.to_s
apk = AppInfo.parse(ARGV[1])
app_name = apk.name
app_version = apk.release_version
app_build_version = apk.build_version
app_size = apk.size(true)
app_identifier = apk.bundle_id
app_os = apk.os
app_info = "#{app_name},#{app_version},#{app_size},#{app_build_version},#{app_identifier},#{app_os}"
File.write(ARGV[2], "#{app_info}")
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.