Android Things custom image doesn't contain bundled APKs - android-things

I'm trying to flash the NXP i.MX7D with a simple custom image which has the default boot animation and a simple launcher. For whatever reason, after flashing, the default Android Things launcher is always launched and when I query for installed packages, my custom launcher is missing in the list.
My bundle:
bundle
├── bootanimation.zip
└── main.apk
I'm simply zipping this folder and uploading it to the console.
Launcher intent filter:
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.IOT_LAUNCHER"/>
<category android:name="android.intent.category.DEFAULT"/>
</intent-filter>
What I've tried so far:
As per this SO question this can happen if the boot animation is not correctly created, so I tried with the one from the default Android Things image
Deleted and re-created a product and tried again as per this
Tried with both debug and release APKs for the launcher
Tried flashing the image both directly and via an OTA on an empty build
Any ideas?

If bundle is actually a top-level directory inside of your archive, then the problem is that the archive format is incorrect. The artifacts that you wrap up into the console bundle must be files at the top-level (not nested in subdirectories).
Here is an example of a command you could run to package the bundle archive properly for the single APK and boot animation.
$ zip -r bundle.zip main.apk bootanimation.zip

Related

Bypassing the login page in Guacamole 1.2.0

I have set up Guacamole 1.2.0 on Ubuntu server 20.04 which works great. Is it possible to bypass the login page in Guacamole 1.2.0 using the auth-noauth component from a previous Guacamole release? The release notes in 1.2.0 say the older components are compatible. I used guacamole-auth-noauth-0.9.14.tar.gz, but I still get the Guacamole login page come up.
This is what I did.
Downloaded guacamole-auth-noauth-0.9.14.tar.gz
Extracted the .jar file using tar xzf guacamole-auth-noauth-0.9.14.tar.gz
Copied the file guacamole-auth-noauth-0.9.14.jar to /etc/guacamole/[extensions,lib]
Amended my guacamole.properties file to:
guacd-hostname: localhost
guacd-port: 4822
user-mapping: /etc/guacamole/noauth-config.xml
auth-provider: net.sourceforge.guacamole.net.auth.noauth.NoAuthenticationProvider
noauth-config: /etc/guacamole/noauth-config.xml
Created a new noauth-config.xml file with the contents
<configs>
<config name="myconfig" protocol="rdp">
<param name="SVxxxx01" value="rdp-server" />
<param name="port" value="3389" />
</config>
</configs>
I then copied guacamole-auth-noauth-0.9.14.jar to the classpath directory I created cp guacamole-auth-noauth-0.9.14.jar /var/lib/guacamole/classpath
Any advice and tips to bypass the login page will be appreciated.
You should check if the plugin is correctly loaded. The tomcat logs (catalina.out) should write something like
"INFO o.a.g.extension.ExtensionModule - Extension "My guacamole extension" loaded.".
If it is not loaded, check if the location of the plugin is correct. Normally, the plugins are located in GUACAMOLE_HOME/extensions directory. You may see the default values for GUACAMOLE_HOME here: https://guacamole.apache.org/doc/gug/configuring-guacamole.html
I usually create extension directory in ~tomcat/.guacamole/extensions, but you should be fine with any other location specified in the documentation.
Sure enough changing the version of the extension worked! guacamole-auth-noauth-0.9.14.jar is not compatible by default but if you change the .jar extension to .zip, extract, edit guac_manifest.json to replace "0.9.14" with "1.2.0", re-zip (or replace), and optionally rename the whole thing guacamole-auth-noauth-1.2.0.jar (to avoid confusion) you end up with a working extension provided all other standard configuration steps are followed as well.

Corodva serve command just reset the app erasing all my changes

I use the command cordova serve to test the app in browser. But when I issue the command, I find all the code changes I made to the app has been disappeared include newly added js files etc. The app just got a complete reset. How can I avoid this and still use cordova serve command to test in browser? Thanks.
I got the issue resolved. It took sometime to figure out what is happening under the hood. As I was making changes directly in platform IOS directory, the cordova prepare or serve statement just replaces the code from the parent www folder.
To conclude, I have to make changes in root www folder and then issue the prepare/serve command that copies the code to the platform to test it out.

iOS Google Tag Manager Integration: How to add multiple containers per App environment?

I completed the integration of the latest Google Tag Manager (v5) for iOS together with Firebase (https://developers.google.com/tag-manager/ios/v5/).
The big change here is that the default container file is not binary anymore, it is plain JSON.
The integration requires that you have a folder (not group!) with the name "container" inside your app workspace. Within this folder the container file should be located. This raises my issue: We have two different GTM Containers, one for the testing/development app and one for production.
By using a folder it is not possible for me to add a different container file and set target references.
I can not create an additional folder since GTM requires the folder on root level and with the exact name "container"
Does anybody have an idea how this can be solved?
Thanks,
Fahim
You should be able to configure an XCode "run script" build step that clears the container directory and copies the correct container into place.
Sample Run Script (if somebody has the same issue):
rm -vf ${SRCROOT}/root_folder/container/*
cp "${SRCROOT}/root_folder/target/test/GTM-XXXXX.json" "${SRCROOT}/root_folder/container/"
It is important that this copy job is done at first within Build Phases, otherwise some other precompiling stuff of GTM does not recognize the container.

Trigger.io continuous development

I'd like to know if there is any way to develop continuously with Trigger.io and avoid the forge build step with every file change I want to test in my browser or simulator.
I was faced with the same problem and I've got a working solution that uses watchr and watch to automatically rebuild each time I make a change to a source file. If you are running a "web" version of your app you can make a change to a source file and go directly to your browser and see the effect of your changes fairly quickly depending on how long the build takes.
Prerequisites: Ruby, watchr, Unix 'watch', and a terminal.
gem install watchr.
create a new ruby file for watchr to know what files to monitor and what to do when it sees a change. I named my file 'my_watch.rb': https://gist.github.com/3153167
open two terminals. Terminal 1 will run watchr and Terminal two will run 'forge build ...'.
In terminal 1 run 'watchr my_watch.rb' making sure the path to my_watch.rb is correct and make sure you've edited my_watch.rb according to your setup so that the path inside watch(...) reflects the files to be watched. My example watches all files in the same directory (and beneath) as the my_watch.rb script. You can place my_watch.rb in the 'src' folder of your Trigger.io app if you want to match my example and run watchr my_watch.rb directly from the src folder. Also not the shell command and path in the block need to be updated to reflect your environment. Again, in my example 'my_watch.rb' is inside 'src/' so when a change is detected we go up one directory and call 'forge build'.
I tend to develop actively with the 'web' version of my app so I can just open terminal 2 to my forge project directory and 'forge run web'. When I am testing in simulators and on devices, yes I have to run forge build every time I want to see a change. However, I typically don't have to wait for forge build to finish because watchr kicked off the build as soon as I made a change and it happens pretty quickly.
I know this is not an ideal solution but so far developing new features in the 'web' version first and then implementing in mobile versions has been very smooth for me. I've never needed to kill the 'web' version after a build but I maybe just lucky. As for running build each time you want to test the mobile versions if you are good with your keyboard shortcuts it really isn't bad at all. XCode makes you build and run after changes are made to source code when creating native iOS apps so I don't think Trigger is unique in requiring this build step.
I hope this helps and that my answer isn't too specific to me and my setup.
The build phase makes some changes to your source to enable the forge.* APIs - therefore, trying to just use the raw files in your src directory won't work.
You may be tempted to change files directly in the development directory, but this is a pretty bad idea: we delete those files with impunity when we need to!
We have plans on our medium-term roadmap to add a file-system watcher to start builds automatically when changes have occurred.
In the meantime, I just use forge build && forge run PLATFORM which tends to only take a few seconds...
while not perfect... this works for me.
go into development/web
rm src
link to your root src, ie ln -s ../../src src
copy the all.js from the web/forge and add to your index.html
ie
start nodemon web.js
open in browser.
note you will need to comment out the all.js script tag for non web builds.

Silent install of the firefox addon

I am trying to install a firefox xpi silently through an msi installer. I am doing so by the following method:
Unzip my xpi in some temp dir and copy all the contents of that to the %APPDATA%\Mozilla\Firefox\Profiles\xxxx.default\extensions\<uniqueid-for-my-addon>
I expected the addon to be available the next time my firefox opens, but I am not able to get it. Can someone tell me if there is more to be done for a silent install of firefox addons?
Kapil
You want to add your add-on via the windows registry.
The key is the name of the folder you are placing inside the extensions folder, it has to be called as the extension id (which is defined inside the install.rdf file).
Also note that this will not be a completely silent install, the addon install dialog will warn the user the next time Firefox is started with that profile that a new extension has been installed.

Resources