Replace "facebook.proguard.annotations" with "facebook.yoga.annotations" (#35841)

Summary:
X-link: https://github.com/facebook/react-native/pull/35841

X-link: https://github.com/facebook/litho/pull/928

Pull Request resolved: https://github.com/facebook/yoga/pull/1216

The Yoga JNI bindings use Reflection, so we need to let ProGuard know not to strip certain annotated fields.

This is done internally using a single copy of `com.facebook.proguard.annotations` from fbandroid (sometimes), which is then repackaged externally, and published as its own whole Yoga specific package. We never actually inform the stock Gradle project of the rules for the annotations though, so apps must add these manually.

This simplifies the setup, where Yoga has its own self-contained annotations/rules. The rules are exposed for Gradle/Buck dependencies, but RN and Litho both consume Yoga via dirsync + custom Gradle logic, so we need to duplicate the proguard rules to them instead of them being propagated automatically.

Changelog: [Internal]

Reviewed By: rshest

Differential Revision: D42406641

fbshipit-source-id: c2b12fd498f93f144e5651917ca878d2a5050e08
This commit is contained in:
Nick Gerleman
2023-01-16 11:25:59 -08:00
committed by Facebook GitHub Bot
parent 83c6997f29
commit 65c57d6a01
12 changed files with 19 additions and 58 deletions

View File

@@ -162,7 +162,7 @@ for name, values in sorted(ENUMS.items()):
f.write(get_license("java"))
f.write("package com.facebook.yoga;\n\n")
if name in DO_NOT_STRIP:
f.write("import com.facebook.proguard.annotations.DoNotStrip;\n\n")
f.write("import com.facebook.yoga.annotations.DoNotStrip;\n\n")
f.write("@DoNotStrip\n")
f.write("public enum Yoga%s {\n" % name)
if len(values) > 0:

View File

@@ -19,6 +19,8 @@ android {
minSdkVersion rootProject.minSdkVersion
targetSdkVersion rootProject.targetSdkVersion
consumerProguardFiles 'proguard-rules.pro'
ndk {
abiFilters 'x86', 'x86_64', 'armeabi-v7a', 'arm64-v8a'
}
@@ -47,7 +49,6 @@ android {
dependencies {
implementation 'com.google.code.findbugs:jsr305:3.0.2'
implementation project(':yoga:proguard-annotations')
implementation 'com.facebook.soloader:soloader:0.10.4'
testImplementation 'junit:junit:4.12'
}

View File

@@ -9,7 +9,7 @@
package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.yoga.annotations.DoNotStrip;
@DoNotStrip
public enum YogaLogLevel {

View File

@@ -7,7 +7,7 @@
package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.yoga.annotations.DoNotStrip;
/**
* Interface for receiving logs from native layer. Use by setting YogaNode.setLogger(myLogger);

View File

@@ -7,7 +7,7 @@
package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.yoga.annotations.DoNotStrip;
import com.facebook.soloader.SoLoader;
@DoNotStrip

View File

@@ -7,7 +7,7 @@
package com.facebook.yoga;
import com.facebook.proguard.annotations.DoNotStrip;
import com.facebook.yoga.annotations.DoNotStrip;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nullable;

View File

@@ -5,7 +5,7 @@
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.proguard.annotations;
package com.facebook.yoga.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;

View File

@@ -1,13 +0,0 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
apply plugin: 'java'
sourceCompatibility = '1.7'
targetCompatibility = '1.7'
apply plugin: 'com.vanniktech.maven.publish'

View File

@@ -1,12 +0,0 @@
#
# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the LICENSE
# file in the root directory of this source tree.
#
GROUP=com.facebook.yoga
POM_NAME=Proguard Annotations
POM_DESCRIPTION=Shared annotations for use with Proguard
POM_ARTIFACT_ID=proguard-annotations
POM_PACKAGING=jar

View File

@@ -1,24 +0,0 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
package com.facebook.proguard.annotations;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import static java.lang.annotation.RetentionPolicy.CLASS;
/**
* Add this annotation to a class to instruct Proguard to not strip it or any of its fields or
* methods out.
*
* <p>This is useful for methods called via reflection that could appear as unused to Proguard.
*/
@Target({ElementType.TYPE})
@Retention(CLASS)
public @interface DoNotStripAny {}

10
java/proguard-rules.pro vendored Normal file
View File

@@ -0,0 +1,10 @@
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
-keep,allowobfuscation @interface com.facebook.yoga.annotations.DoNotStrip
-keep @com.facebook.yoga.annotations.DoNotStrip class *
-keepclassmembers class * {
@com.facebook.yoga.annotations.DoNotStrip *;
}

View File

@@ -5,7 +5,6 @@
* LICENSE file in the root directory of this source tree.
*/
include ':yoga', ':yoga-layout', ':yoga:proguard-annotations'
include ':yoga', ':yoga-layout'
project(':yoga').projectDir = file('java')
project(':yoga:proguard-annotations').projectDir = file('java/proguard-annotations')
project(':yoga-layout').projectDir = file('android')