Rust protobuf 2->3: Update grpcio rust crate

tldr: remove protobuf2 from Android Rust and upgrade everything to pb3.

These commits update:
- The grpcio rust crate to use protobuf 3
- The build system to always use the new libprotobuf (pb3) instead of the _deprecated variant (for pb2); they also force-enable libprotobuf everywhere, ignoring the use_protobuf3 flag, removes the tests related to pb2
- The following modules, which required syntax changes:
-- packages/modules/Bluetooth
-- device/google/cuttlefish
-- vendor/auto

Note: we have to patch lib.rs to rename the imported crate "protobuf" into "protobufv3" as done by Cargo.toml, but not yet supported in Soong (b/308790322).

Bug: 308790516
Test: m rust
Ignore-AOSP-First: must be done in main to upgrade cuttlefish+vendor with the rest all at once
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:21e501d290225560655acc48237ad8f47309903a)
Merged-In: I7c9494eb48c41e75e51382dfa40ee682ed3c3a7d
Change-Id: I7c9494eb48c41e75e51382dfa40ee682ed3c3a7d
diff --git a/Android.bp b/Android.bp
index 2fb65f0..8ea87cb 100644
--- a/Android.bp
+++ b/Android.bp
@@ -29,8 +29,8 @@
     features: [
         "_secure",
         "boringssl",
-        "protobuf",
-        "protobuf-codec",
+        "protobufv3",
+        "protobufv3-codec",
     ],
     rustlibs: [
         "libfutures_executor",
@@ -39,11 +39,17 @@
         "liblibc",
         "liblog_rust",
         "libparking_lot",
-        "libprotobuf_deprecated",
+        "libprotobuf",
     ],
     apex_available: [
         "//apex_available:platform",
     ],
     vendor_available: true,
     min_sdk_version: "29",
+    cfgs: [
+            // cfg(soong) is used to distinguish code that only builds on Android, so
+            // that (most of) the same code can be built under both Soong and cargo.
+            "soong",
+    ]
+    ,
 }
diff --git a/cargo2android.json b/cargo2android.json
index bc4594d..c908dd9 100644
--- a/cargo2android.json
+++ b/cargo2android.json
@@ -3,12 +3,10 @@
     "//apex_available:platform"
   ],
   "device": true,
-  "features": "_secure,boringssl,protobuf-codec,protobuf",
+  "features": "_secure,boringssl,protobufv3-codec",
   "min-sdk-version": "29",
   "run": true,
   "vendor-available": true,
   "product-available": false,
-  "dep-suffixes": {
-    "protobuf": "_deprecated"
-  }
+  "add-module-block": "cargo2android_cfgs.bp"
 }
diff --git a/cargo2android_cfgs.bp b/cargo2android_cfgs.bp
new file mode 100644
index 0000000..328d17d
--- /dev/null
+++ b/cargo2android_cfgs.bp
@@ -0,0 +1,5 @@
+cfgs: [
+        // cfg(soong) is used to distinguish code that only builds on Android, so
+        // that (most of) the same code can be built under both Soong and cargo.
+        "soong",
+]
diff --git a/patches/lib.rs b/patches/lib.rs
new file mode 100644
index 0000000..0a1d2e9
--- /dev/null
+++ b/patches/lib.rs
@@ -0,0 +1,17 @@
+diff --git a/src/lib.rs b/src/lib.rs
+index c8cebca..ba47f95 100644
+--- a/src/lib.rs
++++ b/src/lib.rs
+@@ -29,6 +29,12 @@ use grpcio_sys as grpc_sys;
+ #[macro_use]
+ extern crate log;
+
++// grpcio with feature protobufv3-codec expects a "protobufv3" dependency,
++// but Android.bp is not able to rename dependencies yet. See b/308790322.
++// It is enabled unconditionally since protobufv3-codec also is.
++#[cfg(soong)]
++extern crate protobuf as protobufv3;
++
+ mod buf;
+ mod call;
+ mod channel;
diff --git a/src/lib.rs b/src/lib.rs
index c8cebca..ba47f95 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -29,6 +29,12 @@
 #[macro_use]
 extern crate log;
 
+// grpcio with feature protobufv3-codec expects a "protobufv3" dependency,
+// but Android.bp is not able to rename dependencies yet. See b/308790322.
+// It is enabled unconditionally since protobufv3-codec also is.
+#[cfg(soong)]
+extern crate protobuf as protobufv3;
+
 mod buf;
 mod call;
 mod channel;