There are many ways to reuse code. You will have to decide the best way, depending on some factors. The primary, in my opinion, is the relationship between applications.
a. In the way you describe, apps are related, so you can just keep a code base and use the compilation variation .
Build types and flavors allow a code to have multiple "incarnations" and make maintenance easier.
b. Now if the products have a similar code base, but are completely distinct designs, you can copy and rename them, but you will need to make some hand changes such as package name and other references. It is not the most effective way.
Using Android Studio, I usually create the new project normally, I open the project that has the codes I want and copy and paste only the necessary files. AS renames packages and reports other errors.
c. You can also use the GIT to create derivative projects (forks) of the original. You still need to pay attention to the package name, but it also works.