Package name does not correspond to blank file path - android

In Android Studio 2.3.3, I get the following error in the java source files:
Package name 'com.foo.bar' does not correspond to the file path ''
Note the blank filepath in the error, which I believe differences this from possible duplicate questions about package names vs file paths. This seems like something more than just the package statement is damaged.
Assuming I know the top level directory on my own hard drive where this is installed (i.e., I know where StudioProjects is and have verified that they are there) how do I go about repairing this... or at least figure out what the correct package statement is?
Update: Note that the manifest file does have a "package" tag, the contents of which I can copied directly into the package statements in the Java source files. They were identical what was there before so the error persists.

In this case, the problem was caused by having the java source files in the directory:
src/main/java
Rather than the directory:
src/main/java/com/foo/bar
This means that the package statements were pointing to an erroneous location (successfully detected) and the only reasonable place they could exist was expressed by an empty string (correctly reported but confusing.)
The simple solution was to create a new folder (technically a new package) called foo using the tools within Android Studio, relocating the source files there, and changing the package files to
src/main/java/foo/
package foo;
Android Studio assisted with refactoring, although it missed a few locations.

Related

Project name contains unsupported characters! Error while exporting signed APK in Android

I am getting "Project name contains unsupported characters!" error while exporting the app since my project name contains a single quote in the name.
But my question is if exporting is not allowed why did it allow me to create the project at first place and second, how can I resolve it without damaging any project resources?
Android package names may only contain letters, numbers and an underscore ('_'). I have no idea how you were able to create an Android project with a package name that has an illegal character (is it possible you changed it in AndroidManifest after you've created the project?)
Fixing this is fairly simple, just rename your package in AndroidManifest and search & replace your old package name with the new one in all of your source files (.java files). If you're using Linux this can be achieved with a simple bash command, if you're on Windows you'll probably have to do this manually.

how to change classes in android.jar file

I am new to android programming.
I have got the Google native contact code and imported it in the eclipse IDE .
After importing there are errors in each and every Java file and errors are like, some classes are importing the other classes that is not in the project not even in android.jar.
So I have downloaded android-apps-4.4_r1.jar file and added it to the project(external jar). By doing this most of the errors have been removed but still there are many errors to remove.
e.g.: one class has been imported android.provider.ContactsContract.ContactCounts
and there is a class file in android.jar folder named android.provider.ContactsContract but I think there is not any variable ContactCounts in that file, so I have searched this file (android.provider.ContactsContract) in the Internet and there I found it so my question is how to replace that class file (exist in android.jar folder) with the new file that I have found it on the Internet or there is some other way to solve this problem?
Check this url for references
http://docs.oracle.com/javase/tutorial/deployment/jar/update.html.
jar uf jar-file input-file(s)
Here 'u' means update.
ContactCounts is hidden from the public. Notice the #hide attribute in the source code of the class.
Source code: ContactsContract
You cannot use the hidden classes without extensive work and you will be vulnerable to the code being removed, not present, or changed in future or previous versions of the Android API.
You could try to copy the source code for the hidden class and use the local version of it in your project.
That means:
Create a new file called ContactsContract.java in your project
Copy the contents from the file linked above
Rename the package to match your project
Import your local class where the file is used

Are user-defined directory names allowed in an Android Eclipse project

I think I may know the answer to this question already, but I just wanna be 100% sure. Anyways, I am writing an Android app using Eclipse 4.2 ("Juno"). I want to create my SQLite database by using external files and reading/parsing these files by my code. Hence, I created my own directory called /database and placed it in my project's root directory. Then, Eclipse starts complaining, reports a problem and says:
Invalid recourse directory name.
I even tried placing my database directory in the existing /res directory, but that caused the same Eclipse problem. Just want to confirm what my initial thoughts are: Is it not allowed for me to define my own directories in the project and bundle it in with my release?
If so, then I guess I'll have to follow along with what was posted in this stackoverflow question.
put it in /assets not in /res and it should work.
You should be able to create arbitrary directories in the root of your Android project, however your application won't be able to access these files. This is useful for development purposes like storing test data, documentation, or jar files. However, you cannot create non-standard directories in places like gen and res.

Renaming the Package Name inside an APK

I have created an AIR app that is currently on the market. To update the app, obviously I must keep the same package name. My first version's were packaged using Eclipse with the ADT plugin.
Now to use AIR 3.0 Native Extensions (ANE) which were not available when I first developed the app, I currently must create my APK using AIR's command line tools. Unfortunately, these command line tools force you to have a package name that starts with the word "air". For example, I need the package name "com.example". AIR creates the package name as "air.com.example".
So now, I cannot update my app in the market since the package name has changed. Adobe has this horrific article to help you rename and remove the "air" in the package. I'm not a great programmer so this has really stumped me.
http://kb2.adobe.com/cps/875/cpsid_87562.html
Apparently this info is out of date or incorrect in a few areas.
I have completely stumbled at step 12 which uses apkbuilder:
apkbuilder final.apk -u -z resources.arsc -f classes.dex
I am getting this error message:
THIS TOOL IS DEPRECATED. See --help for more information.
java.io.FileNotFoundException: resources.arsc does not exist
I have used step 10 to create the new resources.arsc file. It clearly DOES exist and in the correct location. I tried using apkbuilder with other resources.arsc files taken from other projects. I still get the same error message.
Is there a chance in hell of this working? If anyone is interested in this, I have a zip file with a sample AIR apk, windows bat files for all the command line work, and all the needed utilities so they don't need to be downloaded. To get started you just need to change my path.bat to fit your system. And you need notepad++ (or an equivalent) to batch automate renaming the package name across several files.
bradwallacedesign.com/dktimer/renameApkProject.zip
Thanks so much!
this was done on a pc. i have no idea how to do this on a mac.
i don't recommend using this to remove the "air." from an air package name. If you do so, the user will not be prompted to download air on their device. the user will get an error message instead with no clue to the problem. of course you can use air captive runtime to solve this issue.
http://bradwallacedesign.com/share/renameAPK.zip
download and unzip my file (renameAPK.zip) to c:\renameAPK.
required files:
my file (renameAPK.zip) which contains the apkTool
java jdk/jre
android SDK
notepad++ (or an equivalent text editor that can rename across multiple files)
i made many bat files since i'm not sure how to combine them into one file. you will need to edit each one to change your path names and file names to work with your computer and your apk file.
i numbered all the bats in the order that i use them. once a command line is open, i type the number of the bat file i want then hit the tab key to automatically finish the name of the bat file then hit enter to run that bat file.
instructions:
double click `openCmd.bat to open a command line pointing to the directory with all your files.
0. run 0path.bat to set your path. (i can't remember now if the adobe air sdk is needed for this but i have it in my path. obviously, the JDK is needed and the android sdk for the jarsigner and zip align i think.)
1. run 1decompileAPK.bat to have apkTool decompile your app into a folder called UNZIPPEDapk
2. follow the instructions in 2editManifest & PackageName - Instructions (not a bat).txt to edit the manifest and package name using Notepad++ inside UNZIPPEDapk:
edit AndroidManifest.xml:
a. change package name from air.oldPackageName to newPackageName
b. edit other needed entries:
c. rename folder system inside "smali" folder so that it works with your new package name
for example:
if the old package name was: air/oldName then change the folders to match the new package name: air/newName
use notepad++ (or any editor that can find and replace text over many files)
d. ctrl+shift+f --- "Find in files"
find:
air/oldPackageName
replace with:
newPackageName
where:
all files in UNZIPPEDapk/smali
(i think there were over 200 replacements)
3. run 3buildDistFolder.bat to have apkTool build the new apk in the UNZIPPEDapk\Dist folder
4. follow the instructions in 4getMissingFiles - instructions.txt to reinstate the 2 missing files in the new build:
a. Two files were not built during 3buildDistFolder:
3buildDistFolder.bat built the new apk in the \UNZIPPEDapk\dist folder but it failed to copy 2 files:
(skipping hidden file 'C:\Users\computer\apkTool\UNZIPPEDapk\assets\META-INF
\AIR\extensions\com.adobe.mobile\META-INF\ANE\Android-ARM.classpath')
(skipping hidden file 'C:\Users\computer\apkTool\UNZIPPEDapk\assets\META-INF
\AIR\extensions\com.adobe.mobile\META-INF\ANE\Android-ARM.project')
grab these 2 files from your original apk and drop them into your new apk in the correct folder
b. copy yourApp.apk from DKTimer/Dist/ to root directory where your bat files are.
5. run 5signAPK.bat to sign the apk.
developer.android.com/guide/publishing/app-signing.html
6. run 6verifySigned.bat to verify the signing worked properly
7. run 7zipAlign.bat to align the apk file.
developer.android.com/guide/developing/tools/zipalign.html
You are finished at this point. Continue on if you want to test it on a device.
8. run 8installAPK.bat to install the apk on a usb connected device.
9. run 9remoteDebugger.bat if you want to use remote debugging.
i hope this helps someone. let me know if i forgot to include something.
also, if you know a better way to do this, please comment (such as how to combine this into 1 long pausing bat file...)
There is a simple environment variable you can set to disable the air. prefix easily. The following code exists in the Adobe AIR packager:
String optOut = System.getenv("AIR_NOANDROIDFLAIR");
if ((optOut == null) || (optOut.indexOf("true") == -1)) {
packageName = "air." + packageName;
}
So, simply set the AIR_NOANDROIDFLAIR environment variable to true, repackage your application, and it won't have the air. prefix. Google how to set environment variables in windows or mac for your particular OS version.
For example, I use the command-line compiler on Mac/Linux, so I run:
> export AIR_NOANDROIDFLAIR=true
> java -jar $AIR_HOME/lib/adt.jar -package -target apk-captive-runtime -storetype pkcs12 -keystore cert.p12 -storepass *** Main.apk Main-app.xml Main.swf
Warning: I don't know what implications this has. Per someone's note above, this may only be a good idea with captive runtime (but that's the default going forward from AIR 3.8).
Update: Renaun Erickson said it shouldn't cause problems.
Cross-posted here (slightly different question, same answer).
Having tried several apkRename tools, I found that they all failed for some app, such as com.android.browser on HTC device.
The reason is in apktool which does not correctly unpack apk file sometimes.
So, i create my own tool: https://github.com/sjitech/ApkRename
No need apktool, no need aapt, just java and jar utilities.
This utility directly modify AndroidManifest.xml so without recompile whole resource by apktool,
so it's clean.
Tested devices: 11 kinds (both android 4+, but 2.2+ should be no OK)
Tested OS: Mac OS X 10.9 and CentOS 6. (Cygwin with bash 4+ should be OK, but not tested yet)
I actually tried brad's approach and couldn't imagine having to go through the process EVERY TIME i compiled a release. so i did something else...i modified ADT so it doesn't insert "air." at the start and replaces it with a more useful extension like "com."
Here's a summary of the approach:
use:
jar xf adt.jar
to extract the adt.jar file to a directory on your desktop. you'll find it in {adobe SDK}/lib/
look for the file APKOutputStream.class
com/adobe/air/apk/APKOutputStream.class
Open it in a hex editor (eg, HxD is what i used). Search for "air." (without the quotes but including the dot).
Don't delete the entry. i tried, you can't, it corrupts the class and it won't run. What you can do, however, is replace "air." with "com." because it has the same number of characters and doesn't mess with the length of the file. The com prefix is a lot more useful to most of us.
save the modified APKOutputStream.class file and repackage with JAR. something like this:
jar cfm ..\patchedadt.jar ..\MANIFEST.MF *
you'll want to copy that MANIFEST.MF file from the subdirectory of the package called META-INF
Rename your patchedadt.jar to adt.jar and put it back in the lib directory. Works with the Flash Builder and all that garb.
Needless to say, when you're in there, you'll want to produce your package without a "com." prefix so you don't end up with com.com.your.package.name.
maybe there was an easier way, but i didn't know any better and no one else had an answer except to decompile the apk, modify it, and recompile and that didn't even work. so i figured i'll share what i did in case someone else stumbles on it later :)
jim

Cannot create R.java b/c project has errors...errors result from lack of R.java

edit: This is an Android project. My problem arose when I added a new .wav file to my 'raw' folder.
I seem to have gotten into an endless loop in Eclipse. I deleted my R.java file from my project. Choosing to "Clean" or "Build Project" has no effect (i.e. doesn't generate an R.java file, or put anything into the 'gen' folder, or create any .class files in the 'assets' folder).
I don't have the wrong package name in any of my classes or in my manifest.
I don't have any errors in any of my .xml files.
Every reference to 'R' in my classes are marked as errors, because the R.java file does not exist.
What can I do??
Try deleting the wav file first. If it doesn't fix your problem, look under problems tab and it will give you a direction on what to do. A wav file under res/ shouldn't produce any problems, just make sure its name is valid in Java (don't use -, for example).
I solved this problem creating a blank project and copying the folder "gen" from this project to others projects. After that I rebuilt all projects and Eclipse automatically replaced the R.java file.
if you rebuild it is there any error message on the console? or are you using capital letters or other special characters in your wav file?
Another issue I noticed, it seems that after closing and re-opening eclipse with a slightly invalid XML file, the XML was no longer recognised as having an error, but R.java refused to be generated correctly.
The offending XML attribute was:
<RelativeLayout ...
android:layout_alignRight="+id/">
In hindsight, I had been intending to complete this with a valid id but I exited the program before I had finished. Eclipse did not pick up the error when I restarted later, except to generate an invalid R.java with a missing VariableDeclaratorId (and no indication as to what caused it).

Categories

Resources