For kicks I tried modifying the compiler to not emit @export for my code (it still has the @exports for SDK code).
The result on code size was more than 50KB smaller AFTER gzipping. That’s a reduction of more than 10%. Pretty significant. That’s without any class renaming. Anyway, it blew up my app on properties that were used in data binding in MXML. I didn’t fix that to see the next place it blew up. If we go this route, we probably need to make MXML output smarter… > On Aug 10, 2017, at 12:31 AM, Alex Harui <aha...@adobe.com.INVALID> wrote: > > I've seen GCC not track renames before. The Object.defineProperty is just > a data structure and doesn't add to the set of APIs for a class definition. > > I just realized that the class names are used by SimpleCSSValuesImpl to > determine the type selectors. So if you rename those strings you will > have to change your CSS. > > Also, I have not removed the exportSymbol calls on each class yet. I will > try that as well. > > -Alex > > > On 8/9/17, 2:11 PM, "Harbs" <harbs.li...@gmail.com> wrote: > >> >>> On Aug 9, 2017, at 11:56 PM, Alex Harui <aha...@adobe.com.INVALID> >>> wrote: >>> >>> The change I just made should only be for MXML. But I think I saw that >>> I >>> never did remove the @export for getters and setters in AS. However, >>> doing so would probably break MXML setting of those properties. >>> >>> I don't think you can tell when compiling a SWC which properties someone >>> is going to use from MXML, so I'm not sure passing through @export or >>> somehow marking certain APIs as "don't rename" is going to be useful. >> >> It would be useful for client code because I do know which properties my >> MXML will use. >> >>> On >>> the other hand, MXML does know every property that you accessed from >>> MXML >>> so maybe that's what I'll try next. I think I see an API in GCC where >>> you >>> can tell it things that shouldn't be renamed. >> >> That sounds interesting. >> >>> IMO, this is a bug or missing capability in GCC. They don't see >>> Object.defineProperties as part of the class definition so they don't >>> track the renames properly. So, removing @exports from getters in AS >>> may >>> also just fail in calls from other AS classes. >> >> I lost you. Where did you see that GCC doesn’t track the definitions? >> >>> Regarding obfuscation, if we have to export getters, is that really >>> exposing important secrets? >> >> Not sure, but I’d like to keep the code as difficult to follow as >> possible. >> >>> The actual code for a getter/setter is >>> elsewhere in the output file. It might be possible to do string >>> replacement on the exported names after the minification. >> >> String replacement is definitely an option if it comes to that. I’m >> probably going to do that for class names and paths as I don’t really see >> that we currently have a solution for that. >> >>> Thoughts? >>> -Alex >>> >>> On 8/9/17, 1:24 PM, "Harbs" <harbs.li...@gmail.com> wrote: >>> >>>> I just compiled with the new option and it appears to work. Yay. On the >>>> other hand, only functions and variables are being minified. getters >>>> and >>>> setters (which is a very large percentage of the signature of my code) >>>> is >>>> not. >>>> >>>> It looks like that adds the @exports for non-mxml files as well. Can we >>>> output the @exports for only MXML declared variables? >>>> >>>> If a comment with @export is added in AS code, will that be passed >>>> through to the JS output? >>>> >>>> If yes, I think @exporting ids declared in MXML should be the only case >>>> we need. I can probably handle any specific cases where that might >>>> break >>>> output code by manually inserting @export statements. >>>> >>>>> On Aug 9, 2017, at 10:20 PM, Alex Harui <aha...@adobe.com.INVALID> >>>>> wrote: >>>>> >>>>> Hmm. I thought GCC didn't rename those. Anyway, I added back the >>>>> @export. See if that works for you and then see if you think there is >>>>> enough obfuscation. >>>>> >>>>> Thanks, >>>>> -Alex >>>>> >>>>> On 8/9/17, 12:45 AM, "Harbs" <harbs.li...@gmail.com> wrote: >>>>> >>>>>> The problem is as follows: >>>>>> >>>>>> Taking textInput as an example, the MXML gets compiled into the >>>>>> following: >>>>>> textInput: { >>>>>> /** @this {com.printui.view.components.PaletteSlider} */ >>>>>> get: function() { >>>>>> return this.textInput_; >>>>>> }, >>>>>> /** @this {com.printui.view.components.PaletteSlider} */ >>>>>> set: function(value) { >>>>>> if (value != this.textInput_) { >>>>>> this.textInput_ = value; >>>>>> >>>>>> >>>>>> >>>>>> this.dispatchEvent(org.apache.flex.events.ValueChangeEvent.createUpdat >>>>>> eE >>>>>> ve >>>>>> nt(this, 'textInput', null, value)); >>>>>> } >>>>>> } >>>>>> }, >>>>>> >>>>>> which gets minified to this: >>>>>> >>>>>> >>>>>> >>>>>> yw:{get:r('Nja'),set:function(a){a!=this.Nja&&(this.Nja=a,this.dispatc >>>>>> hE >>>>>> ve >>>>>> nt(yR(this,iI,null,a)))}} >>>>>> >>>>>> goog has no way of knowing that the original textInput property name >>>>>> is >>>>>> used anywhere so all references to textInput are changed to yw. >>>>>> >>>>>> I think the solution to this is to add @export tags to the >>>>>> Object.defineProperty specification for any property that’s declared >>>>>> or >>>>>> used in the MXML. >>>>>> >>>>>> If localId is used, there might be another option which would be to >>>>>> rename the id to some value that’s one or two characters long. I’m >>>>>> pretty >>>>>> sure that goog will not rename really short property names like that. >>>>>> (We >>>>>> can’t do that for id because it might be used by CSS.) >>>>>> >>>>>> Harbs >>>>>> >>>>>>> On Aug 9, 2017, at 10:25 AM, Harbs <harbs.li...@gmail.com> wrote: >>>>>>> >>>>>>> Here’s a problem I ran into: >>>>>>> >>>>>>> I have a component which has the following: >>>>>>> >>>>>>> >>>>>>> >>>>>>> https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpast >>>>>>> e. >>>>>>> ap >>>>>>> >>>>>>> >>>>>>> ache.org%2FcN1T&data=02%7C01%7C%7C5b5c51c82fc94c95d9d408d4defa99bb%7C >>>>>>> fa >>>>>>> 7b >>>>>>> >>>>>>> >>>>>>> 1b5a7b34438794aed2c178decee1%7C0%7C0%7C636378615292281524&sdata=FPaam >>>>>>> WR >>>>>>> Ac >>>>>>> t5HAYakAZnFzT8biHOT%2F%2F0%2BCFlY32%2BvZtg%3D&reserved=0 >>>>>>> >>>>>>> >>>>>>> <https://na01.safelinks.protection.outlook.com/?url=https%3A%2F%2Fpas >>>>>>> te >>>>>>> .a >>>>>>> >>>>>>> >>>>>>> pache.org%2FcN1T&data=02%7C01%7C%7C5b5c51c82fc94c95d9d408d4defa99bb%7 >>>>>>> Cf >>>>>>> a7 >>>>>>> >>>>>>> >>>>>>> b1b5a7b34438794aed2c178decee1%7C0%7C0%7C636378615292281524&sdata=FPaa >>>>>>> mW >>>>>>> RA >>>>>>> ct5HAYakAZnFzT8biHOT%2F%2F0%2BCFlY32%2BvZtg%3D&reserved=0> >>>>>>> >>>>>>> In the script block I have references to disableBead, textInput, >>>>>>> etc. >>>>>>> >>>>>>> The instance correctly has properties of disableBead, textInput, >>>>>>> etc., >>>>>>> but every reference to these properties is renamed. >>>>>>> >>>>>>> textInput.addEventListener >>>>>>> becomes: >>>>>>> this.yw.addEventListener >>>>>>> >>>>>>> disableBead.disabled >>>>>>> becomes >>>>>>> this.Jm.disabled >>>>>>> >>>>>>> etc. >>>>>>> >>>>>>> this.yw and this.Jm are both undefined >>>>>>> >>>>>>>> On Aug 9, 2017, at 9:10 AM, Harbs <harbs.li...@gmail.com >>>>>>>> <mailto:harbs.li...@gmail.com>> wrote: >>>>>>>> >>>>>>>> I’ll give it a go and see. >>>>>>>> >>>>>>>>> On Aug 9, 2017, at 8:31 AM, Alex Harui <aha...@adobe.com.INVALID >>>>>>>>> <mailto:aha...@adobe.com.INVALID>> wrote: >>>>>>>>> >>>>>>>>> I don't think getters and setters get renamed because they are >>>>>>>>> keys >>>>>>>>> in the >>>>>>>>> Object.defineProperties data structure. I'm wondering if that >>>>>>>>> will >>>>>>>>> be >>>>>>>>> enough obfuscation for you or not. >>>>>>>>> >>>>>>>>> -Alex >>>>>>>>> >>>>>>>>> On 8/8/17, 10:22 PM, "Harbs" <harbs.li...@gmail.com >>>>>>>>> <mailto:harbs.li...@gmail.com>> wrote: >>>>>>>>> >>>>>>>>>> I have a custom component “A” which implements a DisabledBead in >>>>>>>>>> ActionScript. It has a getter called “enabled”. >>>>>>>>>> >>>>>>>>>> I have another MXML file “B” which uses the component and >>>>>>>>>> specifies >>>>>>>>>> enabled=“false”. >>>>>>>>>> >>>>>>>>>> I’m assuming the “enabled” property in “A” will be renamed >>>>>>>>>> without >>>>>>>>>> an >>>>>>>>>> @export. >>>>>>>>>> >>>>>>>>>> The mxml in “B” will still be using a string for the property >>>>>>>>>> name >>>>>>>>>> which >>>>>>>>>> will be “enabled” that will be undefined. >>>>>>>>>> >>>>>>>>>>> On Aug 9, 2017, at 7:55 AM, Alex Harui <aha...@adobe.com.INVALID >>>>>>>>>>> <mailto:aha...@adobe.com.INVALID>> wrote: >>>>>>>>>>> >>>>>>>>>>> I just tried DataBindingExample. MyInitialView is essentially a >>>>>>>>>>> custom >>>>>>>>>>> component. What are you thinking won't work? >>>>>>>>>>> >>>>>>>>>>> -Alex >>>>>>>>>>> >>>>>>>>>>> On 8/8/17, 2:30 PM, "Harbs" <harbs.li...@gmail.com >>>>>>>>>>> <mailto:harbs.li...@gmail.com>> wrote: >>>>>>>>>>> >>>>>>>>>>>> Did you try MXML with custom components? I’m not sure I >>>>>>>>>>>> understand >>>>>>>>>>>> how >>>>>>>>>>>> that would work. >>>>>>>>>>>> >>>>>>>>>>>>> On Aug 9, 2017, at 12:01 AM, Alex Harui >>>>>>>>>>>>> <aha...@adobe.com.INVALID >>>>>>>>>>>>> <mailto:aha...@adobe.com.INVALID>> >>>>>>>>>>>>> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>> Some things I found were that MXML isn't a problem because the >>>>>>>>>>>>> id >>>>>>>>>>>>> maps >>>>>>>>>>>>> to >>>>>>>>>>>>> a getter/setter which maps to Object.DefineProperty which >>>>>>>>>>>>> takes >>>>>>>>>>>>> an >>>>>>>>>>>>> object >>>>>>>>>>>>> structure where the ids are keys so they don't get renamed. >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>> >>>> >>> >> >